VBAの配列について質問があります。
処理速度についてかなり差が出ていて、教えてください。
Dictionaryを利用して重複したデータのカウントを行っています。countifのような形です。
データの始まりは4行目からで重複しているデータはC列、L列にカウントした数字を入れています。約3万件のデータがあり、シートはほかに7枚あり、INDEX・MATCH関数を多く利用しています。ファイルサイズは約5MBあります。
VBAを実行した結果のイメージは以下の通りです。
C列 L列
A1 1
A1 2
A1 3
B1 1
B1 2
B2 1
コードについては以下のように記載しています。
VBA
1Sub 連番カウント() 2 Dim i As Long, STG As Long 3 Dim key As String 4 Dim dicT As Object 5 Dim startDateTime As Date 6 Dim endDateTime As Date 7 Dim processTime As Date 8 9 Dim ws1 As Worksheet 10 11 '開始日時を取得 12 startDateTime = Now 13 14 Set ws1 = ThisWorkbook.Worksheets(4) 15 16 Application.ScreenUpdating = False 17 Application.Calculation = xlCalculationManual 18 Application.EnableEvents = False 19 20 With ws1 21 22 'STGで開始する行を指定 例:4行目からならSTG=4とする' 23 STG = 4 24 25 Set dicT = CreateObject("Scripting.Dictionary") 26 27 'Row.Count,Cの場合C行を対象とする' 28 For i = STG To Cells(Rows.Count, "C").End(xlUp).Row 29 key = Cells(i, "C").Value 30 31 If dicT.Exists(key) = False Then 32 dicT.Add key, 1 33 Else 34 dicT(key) = dicT(key) + 1 35 End If 36 '重複カウントを格納する列を指定。この場合L行' 37 Cells(i, "L").Value = dicT(key) 38 Next 39 40 End With 41 42 Application.ScreenUpdating = True 43 Application.Calculation = xlCalculationAutomatic 44 Application.EnableEvents = True 45 46 '終了日時を取得 47 endDateTime = Now 48 49 '処理時間を算出 50 processTime = endDateTime - startDateTime 51 52 MsgBox "処理が完了しました!" & vbCrLf & vbCrLf & _ 53 "開始日時:" & startDateTime & vbCrLf & _ 54 "終了日時:" & endDateTime & vbCrLf & _ 55 "処理時間:" & processTime & vbCrLf, _ 56 vbOKOnly + vbInformation, "計測結果" 57 58End Sub
L列に既にデータが入っていた場合は10秒ほどで終わります。前のデータがあった場合は13分かかっており、この差がなぜでてきているのか不明な状況です。
お力貸していただけないでしょうか。