【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?

こんにちは、
配列の集計方法に関してお聞きしたいのですが、
配列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

A 回答 (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
    • good
    • 0
この回答へのお礼

ありがとうございます。
下記のように、計算対象の列(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

お礼日時:2008/06/16 11:53

'初期化はされているものとして


添字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

エディタで入力しただけなので合ってるか?ですが
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/06/16 11:55

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