実現したいこと
VBAにて、DictionaryとListObjectを使った処理の高速化を実現したいです。
処理の概要とフローについては以下になります。
[概要]
独自クラスの配列(Dictionary)の中身をループでテーブルに書き込む
[フロー]
- 別シートの他テーブルより、1行ずつ各列の値を独自クラスのプロパティに設定しDictionaryに格納
- 書き込むテーブルの行を全削除(リセット)
- Dictionaryをループしてテーブルの先頭行に各プロパティの値を設定、行を増やす
- Dictionaryの最後まで3を繰り返す ★ここが重い
- シートの最適化
発生している問題・分からないこと
ループ以外にも処理を行っていますが、そちらは1秒もかからず終了していて、Rangeを参照している処理に時間がかかっているようなのでこちらのリファクタリングを行いたいです。具体的には30行を書き込むのみ40秒ほどかかりますので短縮したいです。
該当のソースコード
visual
1Sub reflection() 2 Application.ScreenUpdating = False 3 Call AP_ref.reflection '他のシートの最適化、メソッドの記載は省略 4 Call AR_ref.reflection '他のシートの最適化、メソッドの記載は省略 5 6 Dim allTable As ListObject 7 Set allTable = ActiveWorkbook.Worksheets("全取引").ListObjects("All") 8 9 Call sortTable '他のシートのソート、メソッドの記載は省略 10 11 Dim allSlipList As Object: Set allSlipList = getSlips() 'フロー:1. 別シートの他テーブルより、1行ずつ各列の値を独自クラスのプロパティに設定しDictionaryに格納、メソッドの記載は省略 12 13 'フロー:2. 書き込むテーブルの行を全削除(リセット) 14 With allTable 15 If Not .DataBodyRange Is Nothing Then 16 .DataBodyRange.Delete 17 End If 18 End With 19 20 Dim allSlipListKey As Variant 21 Dim yayoi As yayoi 22 ' フロー:3. Dictionaryをループしてテーブルの先頭行に各プロパティの値を設定、行を増やす 23 For Each allSlipListKey In allSlipList.Keys 24 Set yayoi = allSlipList(allSlipListKey) 25 Range(tableRow, 1) = yayoi.columns("id_Flag") 26 With allTable 27 ' .Range(.Range.Rows.Count, 1) = yayoi.columns("id_Flag") 28 ' .Range(.Range.Rows.Count, 2) = yayoi.columns("slipNum") 29 ' .Range(.Range.Rows.Count, 3) = yayoi.columns("financStat") 30 ' .Range(.Range.Rows.Count, 4) = yayoi.columns("slipDay") 31 ' .Range(.Range.Rows.Count, 5) = yayoi.columns("debitName") 32 ' .Range(.Range.Rows.Count, 6) = yayoi.columns("debitSub") 33 ' .Range(.Range.Rows.Count, 7) = yayoi.columns("debitDep") 34 ' .Range(.Range.Rows.Count, 8) = yayoi.columns("debitTaxType") 35 ' .Range(.Range.Rows.Count, 9) = yayoi.columns("debitAmo") 36 ' .Range(.Range.Rows.Count, 10) = yayoi.columns("debitTax") 37 ' .Range(.Range.Rows.Count, 11) = yayoi.columns("creditName") 38 ' .Range(.Range.Rows.Count, 12) = yayoi.columns("creditSub") 39 ' .Range(.Range.Rows.Count, 13) = yayoi.columns("creditDep") 40 ' .Range(.Range.Rows.Count, 14) = yayoi.columns("creditTaxType") 41 ' .Range(.Range.Rows.Count, 15) = yayoi.columns("creditAmo") 42 ' .Range(.Range.Rows.Count, 16) = yayoi.columns("creditTax") 43 ' .Range(.Range.Rows.Count, 17) = yayoi.columns("summary") 44 ' .Range(.Range.Rows.Count, 18) = yayoi.columns("num") 45 ' .Range(.Range.Rows.Count, 19) = yayoi.columns("settlement") 46 ' .Range(.Range.Rows.Count, 20) = yayoi.columns("slipType") 47 ' .Range(.Range.Rows.Count, 21) = yayoi.columns("origin") 48 ' .Range(.Range.Rows.Count, 22) = yayoi.columns("memo") 49 ' .Range(.Range.Rows.Count, 23) = yayoi.columns("tag1") 50 ' .Range(.Range.Rows.Count, 24) = yayoi.columns("tag2") 51 ' .Range(.Range.Rows.Count, 25) = yayoi.columns("adjustment") 52 .ListRows.Add 53 End With 54 tableRow = tableRow + 1 55 Next `フロー:4. Dictionaryの最後まで3を繰り返す 56 57 `フロー:5. シートの最適化 58 allTable.Range.AutoFilter Field:=3 59 allTable.Sort.SortFields.Clear 60 allTable.Sort.SortFields.Add2 key:= _ 61 Range("All[[#All],[日付]]"), SortOn:=xlSortOnValues, Order:=xlAscending, _ 62 DataOption:=xlSortNormal 63 With allTable.Sort 64 .Header = xlYes 65 .MatchCase = False 66 .Orientation = xlTopToBottom 67 .SortMethod = xlPinYin 68 .Apply 69 End With 70 71End Sub
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
Application.ScreenUpdatingの設定で高速化対応はしていますが、テーブルの処理の高速化についてはまだ調査中です。
補足
修正後の該当ソースコード
visual
1Dim rangeStr As String: rangeStr = "A2:Y" & allSlipList.Count 2 ReDim tableArray(yayoiCount, 25) As Variant 3 For Each allSlipListKey In allSlipList.Keys 4 Set yayoi = allSlipList(allSlipListKey) 5 tableArray(x, 0) = yayoi.columns("id_Flag") 6 tableArray(x, 1) = yayoi.columns("slipNum") 7 tableArray(x, 2) = yayoi.columns("financStat") 8 tableArray(x, 3) = yayoi.columns("slipDay") 9 tableArray(x, 4) = yayoi.columns("debitName") 10 tableArray(x, 5) = yayoi.columns("debitSub") 11 tableArray(x, 6) = yayoi.columns("debitDep") 12 tableArray(x, 7) = yayoi.columns("debitTaxType") 13 tableArray(x, 8) = yayoi.columns("debitAmo") 14 tableArray(x, 9) = yayoi.columns("debitTax") 15 tableArray(x, 10) = yayoi.columns("creditName") 16 tableArray(x, 11) = yayoi.columns("creditSub") 17 tableArray(x, 12) = yayoi.columns("creditDep") 18 tableArray(x, 13) = yayoi.columns("creditTaxType") 19 tableArray(x, 14) = yayoi.columns("creditAmo") 20 tableArray(x, 15) = yayoi.columns("creditTax") 21 tableArray(x, 16) = yayoi.columns("summary") 22 tableArray(x, 17) = yayoi.columns("num") 23 tableArray(x, 18) = yayoi.columns("settlement") 24 tableArray(x, 19) = yayoi.columns("slipType") 25 tableArray(x, 20) = yayoi.columns("origin") 26 tableArray(x, 21) = yayoi.columns("memo") 27 tableArray(x, 22) = yayoi.columns("tag1") 28 tableArray(x, 23) = yayoi.columns("tag2") 29 tableArray(x, 24) = yayoi.columns("adjustment") 30 If isFirstLoop = False Then 31 allTable.ListRows.Add 32 End If 33 isFirstLoop = False 34 35 x = x + 1 36 Next 37Range(rangeStr) = tableArray
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/11/21 12:50
2024/11/22 00:22
2024/11/22 05:47