• ベストアンサー

EXCELVBA 配列値集計方法

こんにちは、 配列の集計方法に関してお聞きしたいのですが、 配列1がありますて、 配列1(1,1)、配列1(1,2)の値をもとに (配列1(1,1)が重複しており、かつ 配列1(1,2)も重複している場合) 重複しているものがあれば 配列1(1,3)の値を合算したものを求め 配列2に格納するようにしたいのですが、 うまくロジックが組めません。 よい方法なあるでしょうか。 配列1内データ----------------- 配列1(1,1)=abc 配列1(1,2)=test1 配列1(1,3)=15 配列1(2,1)=def 配列1(2,2)=test1 配列1(2,3)=50 配列1(3,1)=abc 配列1(3,2)=test1 配列1(3,3)=111 配列1(4,1)=ghi 配列1(4,2)=test2 配列1(4,3)=80 配列1の値を集計後----------- 配列2(1,1)=abc 配列2(1,2)=test1 配列2(1,3)=116 配列2(2,1)=def 配列2(2,2)=test1 配列2(2,3)=50 配列2(3,1)=ghi 配列2(3,2)=test2 配列2(3,3)=80

質問者が選んだベストアンサー

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

無理矢理dictionaryを使う例です(最近凝っているもので) 試験用のデータを配列に入れるのが面倒なので、ワークシートから読み込んでいます。もっと素直な回答をお望みでしょうが、ご参考まで。 ...................A...............B...............C ..1...........abc........test1..............15 ..2...........def........test1.............50 ..3...........abc........test1..............111 ..4...........ghi.......test2.............80 Sub test() Dim myDic As Object, myKey As Variant Dim i As Long, j As Long Dim keyString As String Dim splitArray As Variant Dim sourceArray As Variant Dim destArray() As Variant '試験用に配列に取り込む sourceArray = ActiveSheet.Range("A1").CurrentRegion Set myDic = CreateObject("Scripting.Dictionary") For i = 1 To UBound(sourceArray, 1) keyString = sourceArray(i, 1) & "☆" & sourceArray(i, 2) If Not myDic.exists(keyString) Then myDic.Add keyString, sourceArray(i, 3) Else myDic.Item(keyString) = myDic.Item(keyString) + sourceArray(i, 3) End If Next i myKey = myDic.keys ReDim destArray(1 To myDic.Count, 1 To 3) For i = 1 To myDic.Count splitArray = Split(myKey(i - 1), "☆") destArray(i, 1) = splitArray(0) destArray(i, 2) = splitArray(1) destArray(i, 3) = myDic(myKey(i - 1)) Next i Set myDic = Nothing 'ここは中味の確認用です。 For i = 1 To UBound(destArray, 1) For j = 1 To 3 Debug.Print destArray(i, j) Next j Next i End Sub

lensent
質問者

お礼

ありがとうございます。 下記のように、計算対象の列(D,E)が増えた場合 どこら辺を修正すればよいでしょうか? 変更を試みたのですが、コードの把握に至りませんでした。 すいません。 ...................A...............B...............C...............D...............E ..1...........abc........test1..............15..............1..............2 ..2...........def........test1.............50..............11..............25 ..3...........abc........test1..............111..............81..............24 ..4...........ghi.......test2.............80..............8..............2

その他の回答 (1)

  • noah7150
  • ベストアンサー率46% (116/251)
回答No.1

'初期化はされているものとして 添字2 = 1 配列2(1,1) = 配列1(1,1) 配列2(1,2) = 配列1(1,2) For 添字1 = 1 To 配列1の最大 '同一有無 For 添字3 = 1 To 添字2 If 配列2(添字3,1) = 配列1(添字1,1) And _ 配列2(添字3,2) = 配列1(添字1,2) Then Exit For End If Next '同一がなければ文字列をセット If 添字2 < 添字3 Then 配列2(添字3,1) = 配列1(添字1,1) 配列2(添字3,2) = 配列1(添字1,2) 添字2 = 添字3 End If '値を加算 配列2(添字3,3) = 配列2(添字3,3) + 配列1(添字1,3) Next エディタで入力しただけなので合ってるか?ですが

lensent
質問者

お礼

ありがとうございます。 参考にさせていただきます。

関連するQ&A