導入:なぜ「Select」を使わないコードが重要なのか
Excel VBAを学び始めると、ついつい「セルを選択して(Select)、操作する」というコードを書きがちです。しかし、実務においてこの書き方は「処理速度の低下」や「画面のチラつき」を招く大きな原因となります。実務で求められるのは、「バックグラウンドで高速に処理を完結させる」こと。今回は、セルやシートの操作を直接指定(ダイレクトアクセス)し、スマートに処理を完結させるための必須テクニックを解説します。
基礎知識:RangeとCellsの使い分け
VBAでセルを操作する際、最も頻繁に使うのが「Range」と「Cells」です。
Range(“A1”):人間にとって読みやすく、範囲指定(Range(“A1:C10”))も得意です。
Cells(1, 1):行番号と列番号を数値で指定できるため、ループ処理(For Next文など)と相性抜群です。
実務では、固定位置の操作にはRange、変動するデータやループ処理にはCellsと使い分けるのが鉄則です。
実装:Selectを排除した効率的なコード
「選択」という動作を省くことで、VBAはエクセル画面を更新することなく計算のみを行います。これにより、処理時間が劇的に短縮されます。
サンプルプログラム:範囲を指定して値を一括代入し、シートを操作する
以下のコードは、Sheet1の範囲に値を書き込み、新しく作成したシートへデータを転記する例です。Selectを一切使わない記述に注目してください。
Sub EfficientCellOperation()
Dim wsSource As Worksheet
Dim wsDest As Worksheet
' シートを変数に格納(Select不要)
Set wsSource = ThisWorkbook.Sheets("Sheet1")
' 値を直接書き込む(Rangeを使うと高速)
wsSource.Range("A1:B3").Value = "テスト"
' Cellsを使った行番号指定でのデータ操作
wsSource.Cells(4, 1).Value = "合計"
' 新しいシートを追加して名前を付ける
Set wsDest = ThisWorkbook.Worksheets.Add
wsDest.Name = "転記先_" & Format(Now, "hhmmss")
' シートを切り替えずにデータを転記
wsDest.Range("A1:B3").Value = wsSource.Range("A1:B3").Value
' 完了メッセージ
MsgBox "処理が完了しました。"
End Sub
応用・注意点:現場で陥りやすいバグを回避する
1. シート指定を省略しない
「Range(“A1”)」とだけ書くと、VBAは「現在アクティブなシート」を対象にします。もし意図しないシートがアクティブになっていると、誤ったデータを書き換えるリスクがあります。必ず「wsSource.Range(“A1”)」のように、親オブジェクト(シート)を明示しましょう。
2. 画面更新の停止でさらに高速化
大量のセルを書き換える際は、コードの最初と最後に以下の一行を入れるだけで、目に見えて動作が速くなります。
・処理開始前:Application.ScreenUpdating = False
・処理終了後:Application.ScreenUpdating = True
これにより、Excelの画面描画を停止させ、処理の高速化を極限まで引き出すことができます。
これらのテクニックを身につければ、数万行のデータ処理もストレスなく実行できるようになります。まずは手元のマクロから「Select」の文字を消すことから始めてみてください。
