データ抽出・加工の際に、ExcelVBAツールを作成させていただくことがあり、その時に学習した豆知識をメモしておきたいと思います。
1)Excelが重く、データ編集や関数計算の処理時間が長い問題
以下のサイトが結構参考になりました。
https://www.fastclassinfo.com/entry/excel_work_slow
この知識点が知らなかったです。
・VBAのセル.Selectを使うのを避けるべき。必要ない限り書かないこと。
・書式やフォントなどは設定種類が豊富であればあるほど、Excel実行が重くなる。
2)VBA開発中に、すぐ使えるコード
https://ateitexe.com/code-snippet/
http://www.max.hi-ho.ne.jp/happy/YNxv20002.html
3)ほかのVBAコード問題
■ コピーペースト
Destinationキーワードを使った方が効率よい。(※クリップボードを使わないため、メモリが食わないようです。)
Range("A1").CurrentRegion.Copy Destination:=Sheets("Sheet2").Range("A1")
■ 複数シートに対する処理(配列を使用)
ReDim My_SheetName(0)
For Each MySheet In ThisWorkbook.Worksheets
If MySheet.Name Like "売上*" Then
ReDim Preserve My_SheetName(i)
My_SheetName(i) = MySheet.Name
i = i + 1
End If
Next MySheet
■ 複数セルに対する処理(配列を使用)
選択範囲がセルの場合,選択範囲を「Selection」のオブジェクトとして操作できる
Sub Sample3()
Dim c As Range, i As Long
Range("A1:D10").select
For Each c In Selection
i = i + 1
c.Value = i
Next c
End Sub
Selectionプロパティ
Selectionとは、選択されたセルを表します。操作対象がセルであり、ワークシートではない
重複コマンド
セルA1を起点としたアクティブセル領域(CurrentRegion)の取得し、コピー
Range("A1").Select
Selection.CurrentRegion.Select
Selection.Copy
結果が Range("A1").CurrentRegion.Select.Copy とイコールです。
##4) 間違いやすい
■ Worksheets()とWorksheet()の違い
■ ThisWorkbook.Worksheets
■ CollectionとSellection
##5) エラー調べ
■ 10004エラー
WbCopy.Worksheets("sh1").Range("A1").SelectでRangeクラスのSelectメソッドが失敗しました。
エラーの原因がSelectにある。ワークシートsh1がアクティブになっていない場合、sh1内のセルをSelectに指定してはいけない。
以下のコードを追加すればエラーが解消される。
Worksheets(sh1).Activate