Rangeを配列に移しているつもりで、移した先もRange型になってしまっています。
VBA
1Sub test()
2 '変数Range1 にはsheet1のA1:A30000がRange型として入ってます。
3 '変数Range2 にはsheet2のA1:A30000がRange型として入ってます。
4 Dim Range1 As Range, Range2 As Range
5 Set Range1 = Sheet1.Range("A1:A30000")
6 Set Range2 = Sheet2.Range("A1:A30000")
7
8 'データレンジ取得し配列へ代入
9 Dim arr1 As Variant '
10 Dim arr2 As Variant '仮納品データレンジ用配列
11 arr1 = Range1
12 arr2 = Range2
13
14 'カウント
15 Dim rep() As Integer 'カウント結果代入用の配列変数を用意
16 ReDim rep(1 To Range1.Count, 1 To 1)
17
18
19 'カウント
20 Dim tmp As Variant
21 Dim i As Long
22 Dim j As Long
23 Dim cnt As Integer 'カウント
24 For i = 1 To Ubound(arr1, 1)
25 For j = 1 To Ubound(arr2, 1)
26 If arr1(i, 1) = arr2(j, 1) Then
27 cnt = cnt + 1
28 End If
29 DoEvents
30 Next j
31 rep(i) = cnt
32 cnt = 0
33 Next i
34 'カウント結果をセルへ貼付
35 Range1.Offset(0, 1) = rep
36
37End Sub
38
<追記>
上記のように配列に代入しても、大量データ同志の二重ループだとどうしても遅くなります。
また、やりたいことによっては、必ずしも配列にするのが正解とも限らないと思います。
たとえば、以下はワークシート関数を利用してみたものです。
Sub test2()
Dim Range1 As Range, Range2 As Range
Set Range1 = Sheet1.Range("A1:A30000")
Set Range2 = Sheet2.Range("A1:A30000")
Dim rep()
ReDim rep(1 To Range1.Count, 1 To 2)
Dim i As Long
For i = 1 To Range1.Count
rep(i, 1) = WorksheetFunction.CountIf(Range2, Range1(i, 1)) 'Sheet2でのカウント結果
If rep(i, 1) > 0 Then
rep(i, 2) = WorksheetFunction.Match(Range1(i, 1), Range2, False) 'Sheet2の(最初にマッチした)行番号
End If
Next i
Range1.Offset(0, 1).Resize(, 2) = rep
End Sub
また、こちらは連想配列を使った例です。
VBA
1Sub test3()
2 '変数Range1 にはsheet1のA1:A30000がRange型として入ってます。
3 '変数Range2 にはsheet2のA1:A30000がRange型として入ってます。
4 Dim Range1 As Range, Range2 As Range
5 Set Range1 = Sheet1.Range("A1:A30000")
6 Set Range2 = Sheet2.Range("A1:A30000")
7
8 'データレンジ取得し配列へ代入
9 Dim arr1 As Variant '
10 Dim arr2 As Variant '仮納品データレンジ用配列
11 arr1 = Range1
12 arr2 = Range2
13
14 'カウント
15 Dim rep() As Integer 'カウント結果代入用の配列変数を用意
16 ReDim rep(1 To Range1.Count, 1 To 1)
17
18
19 'カウント
20 Dim tmp As Variant
21 Dim i As Long
22 Dim j As Long
23 Dim d
24 Set d = CreateObject("Scripting.Dictionary")
25 For j = 1 To UBound(arr2, 1)
26 d(arr2(j, 1)) = d(arr2(j, 1)) + 1
27 Next
28
29 For i = 1 To UBound(arr1, 1)
30 If d.Exists(arr1(i, 1)) Then
31 rep(i, 1) = d(arr1(i, 1))
32 End If
33 Next i
34 'カウント結果をセルへ貼付
35 Range1.Offset(0, 1) = rep
36
37End Sub
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。