電子書籍の厳選無料作品が豊富!

はじめまして。excelでこのようなデータが
あります。a列をidごとに集計して以下の結果のように
集計したいのです。集計しなくてもいい行はそのまま
出力します。関数でやってみましたがうまくいかないので
VBAにしたいです。データになにも入力されていないセルは
"."が入ります。関数でもVBAでもかまいませんので
よろしくお願いします。

データ
---------------------------
abcd

id11aa
.2fa
.3fa
4fa
id2124
id32..


----------------------------

結果
------------------------
abcd

id11234afffaaaa
id2124
id32..

------------------------

A 回答 (2件)

よくわかりませんが、こういう事でいいんでしょうか。



Private Sub CommandButton1_Click()
  
  Dim strArr(100, 3) As String
  Dim sh As Worksheet
  Set sh = Sheets("Sheet1")
    
  Dim counter As Integer
  counter = 0
  Dim index As Integer
  Dim i As Integer
  For i = 0 To 100
    Dim A_Value As String
    A_Value = GetCellText(sh, i + 1, 1)
    If A_Value = "" Then Exit For
  
    If A_Value <> "." Then
      strArr(counter, 0) = A_Value
      index = counter
      counter = counter + 1
    End If
    
    If index <> -1 Then
      strArr(index, 1) = strArr(index, 1) & GetCellText(sh, i + 1, 2)
      strArr(index, 2) = strArr(index, 2) & GetCellText(sh, i + 1, 3)
      strArr(index, 3) = strArr(index, 3) & GetCellText(sh, i + 1, 4)
    End If
  Next
  Set sh = Nothing
  
  Dim sh2 As Worksheet
  Set sh2 = Sheets("Sheet2")
  
  Dim j As Integer
  For j = 0 To 100
    Dim A_Value_2 As String
    Dim B_Value_2 As String
    Dim C_Value_2 As String
    Dim D_Value_2 As String
    
    A_Value_2 = strArr(j, 0)
    B_Value_2 = strArr(j, 1)
    C_Value_2 = strArr(j, 2)
    D_Value_2 = strArr(j, 3)
    
    If A_Value_2 = "" Then Exit For
    
    Call SetCellText(sh2, j + 1, 1, A_Value_2)
    Call SetCellText(sh2, j + 1, 2, B_Value_2)
    Call SetCellText(sh2, j + 1, 3, C_Value_2)
    Call SetCellText(sh2, j + 1, 4, D_Value_2)
  Next
  Set sh2 = Nothing
  
End Sub

Private Function GetCellText(ByRef sh As Worksheet, ByVal rowIndex As Integer, ByVal colIndex As Integer) As String
  Dim rng As Range
  Set rng = sh.Cells(rowIndex, colIndex)
  GetCellText = rng.Text
  Set rng = Nothing
End Function

Private Sub SetCellText(ByRef sh As Worksheet, ByVal rowIndex As Integer, ByVal colIndex As Integer, ByVal value As String)
  Dim rng As Range
  Set rng = sh.Cells(rowIndex, colIndex)
  rng.value = value
  Set rng = Nothing
End Sub
    • good
    • 0

言っていることは推測が付く。

しかしもう少し具体的(らしい)丁寧な例にして、イメージが直感できるよう、例を挙げてほしい。Idやa、b、cなどではなく。
また列の位置がOKWAVEでは崩れて見辛くなるので、その点ご考慮を。
ーー
ID列ででソート。
直前(行)のキー(ID)と現在(行)を比較して
変わらなければ、計数列の計数を足しこみ
変われば合計を書き出し、合計を0にする。
総合計が必要なら、総合計に加えて、合計を0にする。
>集計しなくてもいい行はそのまま
これが具体的には良くわからない。
>データになにも入力されていないセルは"."が入ります
珍しい例だが、ピリオドが入るのですか。
であればそのセルは0を足す。
ーーー
SUBTOTAL関数というのがあるが、検討してみましたか。使えるかもしれない。
ピボットテーブルも使えるかもしれない、検討してみてください。
    • good
    • 0
この回答へのお礼

vba,関数では無理そうでしょうか?
データも多いのでマクロにしたいです。

お礼日時:2006/05/18 09:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!