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

回答編集履歴

2

追記

2021/02/20 06:20

投稿

jinoji
jinoji

スコア4592

answer CHANGED
@@ -60,4 +60,49 @@
60
60
  Next
61
61
 
62
62
  End Sub
63
+ ```
64
+ ---
65
+ <再追記>
66
+ 他の方のコードを拝見し、更に修正を加えました。
67
+
68
+ ```VBA
69
+
70
+ Sub sample3()
71
+
72
+ Dim d1, d2
73
+ Set d1 = CreateObject("Scripting.Dictionary")
74
+ Set d2 = CreateObject("Scripting.Dictionary")
75
+
76
+ Dim ws, maxrow, maxcol, arr
77
+ Set ws = Sheets(1)
78
+ With ws.UsedRange
79
+ maxrow = .Rows.Count
80
+ maxcol = .Columns.Count
81
+ arr = .Value
82
+ End With
83
+
84
+ Dim c, k
85
+ For c = 1 To maxcol
86
+ k = arr(1, c)
87
+ If Not d1.Exists(k) Then Set d1(k) = CreateObject("Scripting.Dictionary")
88
+ d1(k).Add d1(k).Count, c
89
+ Next
90
+ ReDim arr2(1 To maxrow, 1 To d1.Count)
91
+
92
+ Dim r
93
+ For r = 1 To maxrow
94
+ For Each k In d1
95
+ d2.RemoveAll
96
+ For Each c In d1(k).Items
97
+ If arr(r, c) <> "" Then d2(arr(r, c)) = 0
98
+ Next
99
+ arr2(r, k) = Join(d2.keys, ":")
100
+ Next
101
+ Next
102
+
103
+ Set ws = Sheets(2)
104
+ ws.Cells.ClearContents
105
+ ws.Cells.Resize(maxrow, d1.Count).Value = arr2
106
+
107
+ End Sub
63
108
  ```

1

追記

2021/02/20 06:20

投稿

jinoji
jinoji

スコア4592

answer CHANGED
@@ -27,4 +27,37 @@
27
27
  End Sub
28
28
 
29
29
 
30
+ ```
31
+
32
+ ---
33
+ <追記>
34
+ 空白セルもあるとのことなので、読み飛ばす処理を追加しました。
35
+ あわせて更なる速度向上のためセル範囲を配列化しました。
36
+
37
+ ```VBA
38
+ Sub sample2()
39
+
40
+ Dim d As Object
41
+ Set d = CreateObject("Scripting.Dictionary")
42
+
43
+ Dim ws As Worksheet, arr As Variant
44
+ Set ws = Sheets("Sheet1")
45
+ arr = ws.UsedRange.Value
46
+
47
+ Dim r As Long, c As Long, k As Variant
48
+ For r = 1 To UBound(arr, 1)
49
+ For c = 1 To UBound(arr, 2)
50
+ k = Join(Array(r, arr(1, c)))
51
+ If Not d.Exists(k) Then d.Add k, CreateObject("Scripting.Dictionary")
52
+ If arr(r, c) <> "" Then d(k)(arr(r, c)) = 0
53
+ Next c, r
54
+
55
+ ws.Cells.ClearContents
56
+ For Each k In d
57
+ r = Split(k)(0)
58
+ c = Split(k)(1)
59
+ ws.Cells(r, c).Value = Join(d(k).Keys, ":")
60
+ Next
61
+
62
+ End Sub
30
63
  ```