回答編集履歴

3

コード修正

2022/09/22 08:54

投稿

hatena19
hatena19

スコア33790

test CHANGED
@@ -1,4 +1,5 @@
1
- 仕様があいまいな部分がありますが、とりあえず、下記で希望の結果になると思います。
1
+ ~~仕様があいまいな部分がありますが、とりあえず、下記で希望の結果になると思います。~~
2
+ 質問が修正されて仕様が明確になったので、それにあわせてコードを修正しました。
2
3
 
3
4
  ```vba
4
5
  Public Sub Sample()
@@ -17,7 +18,7 @@
17
18
  Dim i As Long, key As String
18
19
  For i = 2 To rngSaki.Rows.Count
19
20
  key = Join(WorksheetFunction.Index(rngSaki.Rows(i).Value, 1, 0))
20
- dicSaki(key) = 1
21
+ dicSaki(key) = dicSaki(key) + 1 'アイテムには件数を格納
21
22
  Next
22
23
 
23
24
  shtSabun.Cells.Clear
@@ -27,11 +28,12 @@
27
28
  r = 2
28
29
  For i = 2 To rngMoto.Rows.Count
29
30
  key = Join(WorksheetFunction.Index(rngMoto.Rows(i).Value, 1, 0))
30
- If Not dicSaki.Exists(key) Then
31
+ If dicSaki.Exists(key) Then
32
+ dicSaki(key) = dicSaki(key) - 1 '一致したら件数を減らす
33
+ If dicSaki(key) = 0 Then dicSaki.Remove key '0件になったら削除する
34
+ Else
31
35
  rngMoto.Rows(i).Copy shtSabun.Cells(r, 1)
32
36
  r = r + 1
33
- Else
34
- dicSaki.Remove (key)
35
37
  End If
36
38
  Next
37
39
  End Sub
@@ -39,7 +41,7 @@
39
41
 
40
42
  存在チェック(一致するものの検索)は、Dictionaryを使うのが高速というのが定番なので、それを使いました。
41
43
 
42
- 比較先のデータを連結して、Dictionaryにキーとして登録します。
44
+ 比較先のデータを連結して、Dictionaryにキーとして登録します。アイテムには件数を格納します。
43
45
  比較元のデータを連結したものが、Dictionaryのキーに存在するかチェックして、存在しなければ、差分シートに出力。
44
- 存在した場合は、Dictionaryキーを削除します。
46
+ 存在した場合は、Dictionaryのアイテムの件数を減数して、0件になったら削除します。
45
47
  これをループ処理すれば希望の結果になります。

2

コード改善

2022/09/21 11:40

投稿

hatena19
hatena19

スコア33790

test CHANGED
@@ -16,9 +16,7 @@
16
16
 
17
17
  Dim i As Long, key As String
18
18
  For i = 2 To rngSaki.Rows.Count
19
- With rngSaki
20
- key = .Cells(i, 1) & "," & .Cells(i, 2) & "," & .Cells(i, 3) & "," & .Cells(i, 4)
19
+ key = Join(WorksheetFunction.Index(rngSaki.Rows(i).Value, 1, 0))
21
- End With
22
20
  dicSaki(key) = 1
23
21
  Next
24
22
 
@@ -28,14 +26,12 @@
28
26
  Dim r As Long
29
27
  r = 2
30
28
  For i = 2 To rngMoto.Rows.Count
31
- With rngMoto
32
- key = .Cells(i, 1) & "," & .Cells(i, 2) & "," & .Cells(i, 3) & "," & .Cells(i, 4)
29
+ key = Join(WorksheetFunction.Index(rngMoto.Rows(i).Value, 1, 0))
33
- End With
34
30
  If Not dicSaki.Exists(key) Then
35
31
  rngMoto.Rows(i).Copy shtSabun.Cells(r, 1)
36
32
  r = r + 1
37
33
  Else
38
- dicSaki.Remove key
34
+ dicSaki.Remove (key)
39
35
  End If
40
36
  Next
41
37
  End Sub
@@ -43,7 +39,7 @@
43
39
 
44
40
  存在チェック(一致するものの検索)は、Dictionaryを使うのが高速というのが定番なので、それを使いました。
45
41
 
46
- 比較先のデータをDictionaryにキーとして登録します。
42
+ 比較先のデータを連結して、Dictionaryにキーとして登録します。
47
- 比較元のデータをDictionaryのキーに存在するかチェックして、存在しなければ、差分シートに出力。
43
+ 比較元のデータを連結したものが、Dictionaryのキーに存在するかチェックして、存在しなければ、差分シートに出力。
48
44
  存在した場合は、Dictionaryからキーを削除します。
49
45
  これをループ処理すれば希望の結果になります。

1

コード微修正

2022/09/21 11:33

投稿

hatena19
hatena19

スコア33790

test CHANGED
@@ -35,7 +35,7 @@
35
35
  rngMoto.Rows(i).Copy shtSabun.Cells(r, 1)
36
36
  r = r + 1
37
37
  Else
38
- dicSaki.Remove (key)
38
+ dicSaki.Remove key
39
39
  End If
40
40
  Next
41
41
  End Sub