teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

コード内コメント修正

2021/06/09 09:01

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -54,7 +54,7 @@
54
54
  outoutData(r3, c) = outoutData(r3, c) + sourceData(r, c + 1)
55
55
  Next
56
56
  Else
57
- '重複していなければキー(A列の値)とアイテム(行番号)を追加
57
+ '重複していなければキー(A列の値)とアイテム(出力先行番号)を追加
58
58
  r2 = r2 + 1
59
59
  areaName.Add sourceData(r, 1), r2
60
60
 
@@ -84,15 +84,18 @@
84
84
  [Office TANAKA - VBA高速化テクニック[配列を使う]](http://officetanaka.net/excel/vba/speed/s11.htm)
85
85
 
86
86
  処理の流れとしては、
87
-
87
+ ```text
88
88
  Valueでデータ範囲を配列に格納。sourceData
89
89
 
90
90
  出力用配列は最大サイズで生成しておく。(sourceDataの行数と同じにする。)
91
91
 
92
92
  データ配列を1行目から最終行までForループで走査。
93
+  キーが既に存在していたら、
94
+    出力先配列の値にデータ配列の現在行の値を加算。
95
+  キーが存在しない場合は、
93
-  配列の1列目の値をDictionaryのキーとして追加、アイテムは出力先行番号。
96
+   配列の1列目の値をDictionaryのキーとして追加、アイテムは出力先行番号。
94
-  キーが既に存在していたら、出力先配列の値に加算
97
+   出力先配列にデータ配列現在行のを転記
95
-  キーが存在しない場合、A列、B列の値、D列以降の値を出力配列に転記。
96
98
  ループ終了
97
99
 
98
- シートを追加して、そこに出力配列をセル範囲のValueに出力。
100
+ シートを追加して、そこに出力配列をセル範囲のValueに出力。
101
+ ```

2

解説追記

2021/06/09 09:01

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -73,4 +73,26 @@
73
73
 
74
74
  NewWorkSheet.Cells(4, 2).Resize(r2, 14).Value = outoutData
75
75
  End Sub
76
- ```
76
+ ```
77
+ 解説
78
+ ---
79
+ まずは、下記の点を理解しましょう。
80
+ セル範囲(Rangeオプジェクト)は Valueプロパティで配列として取得できます。
81
+ また、配列をセル範囲のValueに代入することで一気に入力できます。
82
+ コードがシンプルになるし高速化するというメリットもあります。
83
+
84
+ [Office TANAKA - VBA高速化テクニック[配列を使う]](http://officetanaka.net/excel/vba/speed/s11.htm)
85
+
86
+ 処理の流れとしては、
87
+
88
+ Valueでデータ範囲を配列に格納。sourceData
89
+
90
+ 出力用配列は最大サイズで生成しておく。(sourceDataの行数と同じにする。)
91
+
92
+ データ配列を1行目から最終行までForループで走査。
93
+  配列の1列目の値をDictionaryのキーとして追加、アイテムは出力先行番号。
94
+  キーが既に存在していたら、出力先配列の値に加算。
95
+  キーが存在しない場合、A列、B列の値、D列以降の値を出力配列に転記。
96
+ ループ終了
97
+
98
+ シートを追加して、そこに出力配列をセル範囲のValueに出力。

1

コード追記

2021/06/09 08:40

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -15,4 +15,62 @@
15
15
  areaName.Add extractedData(k, 1), k
16
16
  ```
17
17
 
18
- ざっとしか見てませんが他にもいろいろおかしいところがありそうです。
18
+ ざっとしか見てませんが他にもいろいろおかしいところがありそうです。
19
+
20
+
21
+ ---
22
+
23
+ たぶん下記のようなことをしたいのかな。
24
+
25
+ A列B列は重複を排除、D列以降はA例の値が同じもので合計
26
+
27
+ ```vba
28
+ Public Sub Test()
29
+ Dim lastLine As Integer
30
+ lastLine = Cells(Rows.Count, "A").End(xlUp).Row
31
+
32
+ Dim sourceData() As Variant
33
+ sourceData = Range("A1:O" & lastLine).Value 'データ範囲を配列に格納(C列含む)
34
+
35
+
36
+ Dim areaName As Object
37
+ Set areaName = CreateObject("Scripting.Dictionary")
38
+
39
+ Dim outoutData()
40
+ ReDim outoutData(1 To lastLine, 1 To 14) '出力用配列 サイズは大きめにとっておく
41
+
42
+
43
+ Dim r As Long, c As Long, r2 As Long
44
+
45
+ For r = 1 To UBound(sourceData)
46
+ If areaName.Exists(sourceData(r, 1)) Then
47
+ Dim r3 As Long
48
+ r3 = areaName(sourceData(r, 1))
49
+
50
+ outoutData(r3, 2) = sourceData(r, 2)
51
+
52
+ '重複していたら出力配列に加算(D列以降)
53
+ For c = 3 To 14
54
+ outoutData(r3, c) = outoutData(r3, c) + sourceData(r, c + 1)
55
+ Next
56
+ Else
57
+ '重複していなければキー(A列の値)とアイテム(行番号)を追加
58
+ r2 = r2 + 1
59
+ areaName.Add sourceData(r, 1), r2
60
+
61
+ outoutData(r2, 1) = sourceData(r, 1)
62
+ outoutData(r2, 2) = sourceData(r, 2)
63
+ For c = 3 To 14
64
+ outoutData(r2, c) = sourceData(r, c + 1)
65
+ Next
66
+ End If
67
+ Next
68
+
69
+ '新規シートを名前を変更してシートの最後尾に挿入
70
+ Dim NewWorkSheet As Worksheet
71
+ Set NewWorkSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))
72
+ NewWorkSheet.Name = "Sheet2"
73
+
74
+ NewWorkSheet.Cells(4, 2).Resize(r2, 14).Value = outoutData
75
+ End Sub
76
+ ```