※サンプルデータとして画像を追加しました。
以下を実現するプログラムを作りたいと考えております。
しかし、表題が原因で実現できずにいます。
【プログラムコードについての説明】
Excelから取得してきたデータを一旦、extractedDataにぶち込み、
extractedDataから条件処理をしたデータを、
連想配列と2次元配列へぶち込んでいます。
2つの配列を作っているので、
主キーと外部キーを作っています。
【以下コード】
VBA
1 2Sub DuplicateCalculation() 3 4Dim lineNum As Integer 5 lineNum = WorksheetFunction.CountA(Range("A4", Range("A" & Rows.Count))) 6 7 8 'データをExcelから取得 9 ReDim extractedData(1 To lineNum, 1 To 14) As Variant 10 ReDim Preserve extractedData(1 To lineNum, 1 To 14) As Variant 11 12 Dim i, j, c 13 For j = 1 To lineNum 14 c = 1 15 For i = 1 To 15 'A列~O列まで 16 If i <> 3 Then 'C列以外 17 extractedData(j, c) = Cells(j + 3, i) 18 c = c + 1 19 End If 20 Next 21 Next 22 23 24 25 26 '取得してきたデータを条件処理 27 Dim areaName As Object 28 Set areaName = CreateObject("Scripting.Dictionary") 29 Dim feeValue() As Variant 30 31 'B列とD列~O列の動的配列の入れ物作成 32 ReDim Preserve feeValue(1 To j, 1 To i) 33 34 35 k = 1 'kはキー変数 36 For j = 1 To lineNum 37 38 'キーがまだ存在してないのなら値を配列に追加/常にキー列(A列)を取得するので列固定 39 If Not areaName.Exists(extractedData(k, 1)) Then 40 'A列を配列に追加 41 '値が重複→その時のindexNumberのitemは空のままだから重複回数分をマイナス 42 areaName.Add extractedData(k, 1), k 43 44 'B列追加、D列~O列追加 45 r = 1 46 For m = 2 To 13 47 feeValue(j, r) = extractedData(k, m) 48 r = r + 1 49 Next 50 Else 51 'キーが既に存在しているならここのルートを通る 52 '売上を合算 53 For a = 1 To 12 54 'a = 2のとき、合算しないが重複データは削除 55 If a = 1 Then 56 feeValue(areaName.Count, a) = extractedData(k, a + 1) 57 Else 58 '元の位置にあるデータ+重複している行の列の値。 59 feeValue(areaName.Count, a + 1) = extractedData(areaName.Count, a + 1) + extractedData(k, a + 1) 60 End If 61 Next 62 End If 63 k = k + 1 64 Next 65 66 67 '新規シートを名前を変更してシートの最後尾に挿入 68 Dim NewWorkSheet As Worksheet 69 Set NewWorkSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count)) 70 NewWorkSheet.Name = "Sheet2" 71 72 73 'リストを出力 areaNameの値とfeeValueの値をキーで対応させて出力する 74 For j = 1 To UBound(areaName.keys) 75 For i = 1 To 14 76 NewWorkSheet.Cells(j + 4, i).Value = areaName.Item(i) 77 NewWorkSheet.Cells(j + 4, i + 1).Value = feeValue(j, i) 78 Next 79 Next 80 81 82End Sub