どなたか有識者の方ご教示頂けないでしょうか。
現在、重複レコードに連番(通し番号)を付与といった処理を行うために作成しています。
コード自体は問題はなく動作できているのですが、
データが20万を超えて尚且つ重複リストが1万以上超過していると
中々処理時間に要し、おおよそ10分ぐらい時間掛かっている状況です。
▼処理の流れ
①リストを配列へ格納
②①で格納した配列から重複リストを連想配列へ格納
③重複リストの分だけループ処理
④重複リストと一致判別し、レコードと連番を結合分を配列へ格納
⑤配列データをセル上へ反映
▼処理前後のイメージ
処理前 処理後
A | A1
B | B1
A | A2
D | D1
A | A3
※上記ではアルファベットで表記していますが、
実際はコード+日付+ステータスの結合した文字列となります。
▼処理に時間掛かっている要因
恐らく重複リストの要素が1万以上あることが一番の要因で
③~⑤の処理に負担が掛かっているのではと推測しています。
このような処理を行う際は重複となる要素や条件を付け加えて重複リストの数を減らすことが
必然となってくるのでしょうか....。
現在のコードを記載しますので、
どなたか他に処を早める最善のやり方や他の処理方法などあればご教示頂けると幸いです。
VBA
1Sub 連番付与() 2 3Dim dcdname As Variant, dccount As Variant 4Dim i, j 5Dim Cnt As Long 6Dim mRow As Long 7Dim dname As String 8Dim myKey As Variant 9Dim list As Variant 10 11 Dim ws1 As Worksheet 12 Set ws1 = ThisWorkbook.Worksheets(3) 13 14'▼画面更新を無効化 15Application.ScreenUpdating = False 16 17With ws1 18 19 '連想配列 20 Set dcdname = CreateObject("Scripting.Dictionary") 21 Set dccount = CreateObject("Scripting.Dictionary") 22 23 '最終行取得 24 mRow = .Cells(Rows.Count, 1).End(xlUp).Row 25 26 'O列を配列格納 27 list = .Range("O1:O" & mRow) 28 29 'ループ 30 For i = 2 To mRow 31 32 '値を変数へ 33 dname = list(i, 1) 34 35 '重複しないリストを連想配列へ格納 36 If Not dcdname.Exists(dname) Then 37 dcdname.Add dname, dname 38 Else 39 '重複しているリストを連想配列へ格納 40 If Not dccount.Exists(dname) Then 41 dccount.Add dname, dname 42 End If 43 End If 44 Next i 45 46 myKey = dccount.Keys 47 Cnt = 1 48 49 '重複しているリスト分ループして連番 50 For i = 0 To UBound(dccount.Items) 51 52 For j = 1 To UBound(list) 53 54 If list(j, 1) = myKey(i) Then 55 56 'レコードと連番の結合分を配列へ格納 57 list(j, 1) = list(j, 1) & Cnt 58 Cnt = Cnt + 1 59 60 End If 61 Next j 62 63 Cnt = 1 64 65 Next i 66 67 '配列をO列に反映 68 .Range("O1:O" & mRow) = list 69 70 '配列解放 71 Set dcname = Nothing 72 Set dccount = Nothing 73 74End With 75 76'▼画面更新を有効化 77Application.ScreenUpdating = True 78 79End Sub 80
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/06 05:29