【VBAリファレンス|実務向け】【VBA実務講座】「Select」は極力使うな!効率的なセル範囲の操作術

スポンサーリンク

1. 導入:なぜVBAで「選択」を避けるべきか

Excel VBAを始めたばかりの頃、マクロ記録を使うと「Range(“A1”).Select」のようなコードが大量に生成されます。しかし、実務において「セルを選択する(Select)」という処理は、実行速度を低下させ、予期せぬエラーの原因となる最大の要因です。

画面のチラつきを防ぎ、処理速度を劇的に向上させるためには、「選択せずに操作する」のがVBAの基本ルールです。本記事では、セル範囲を指定する正しい作法と、実務で使える効率的な書き方を解説します。

2. 基礎知識:RangeオブジェクトとCellsプロパティ

VBAでセル範囲を扱うには、主に「Range」と「Cells」という2つのオブジェクトを使います。

・Rangeオブジェクト: 範囲を文字列で指定します(例:Range(“A1:C10”))。直感的で分かりやすいのが特徴です。
・Cellsプロパティ: 行番号と列番号を数値で指定します(例:Cells(10, 3))。変数を使って「n行目の列」のように動的に指定できるため、繰り返し処理に必須の知識です。

3. 実装/解決策:選択せずに値を書き込む

「選択してから処理する」のではなく、オブジェクトを直接指定して、そのプロパティを操作するのがプロのやり方です。例えば、「A1セルに値を入力する」場合、Selectを使うと画面が移動してしまいますが、直接記述すれば一瞬で処理が完了します。

4. サンプルプログラム:範囲を一括操作する

以下のコードは、セルを選択せずに「A1:C5」の範囲に対して一括で処理を行う例です。コピー&ペーストして動作を確認してください。

Sub EfficientRangeControl()
‘ 選択せずに範囲を操作する例
‘ Rangeを使って範囲を直接指定する
With Range(“A1:C5”)
.Value = “テスト” ‘ 範囲内の全セルに値を入力
.Font.Bold = True ‘ 太字にする
.Interior.Color = vbYellow ‘ 背景を黄色にする
End With

‘ Cellsを使った動的な範囲指定(最終行まで取得する場合など)
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row

‘ 1行目から最終行までのA列を指定して操作
Range(Cells(1, 1), Cells(lastRow, 1)).Font.Color = vbRed

MsgBox “処理が完了しました。”
End Sub

5. 応用・注意点:現場で役立つ補足

・Selectを使うべき場面: 唯一の例外は、「ユーザーに操作対象を目視確認させたい場合」です。それ以外でSelectを使うメリットは実務上ほとんどありません。
・Withステートメントの活用: 上記サンプルで使用した「With」は、同じオブジェクトに対する複数の処理をまとめられる便利な構文です。コードがスッキリするだけでなく、読み込み速度もわずかに向上します。
・シートの明示: 複数のシートを扱う場合、「Range(“A1”)」だけだと「現在アクティブなシート」が対象になります。必ず「Worksheets(“Sheet1”).Range(“A1”)」のように、シートを明示する癖をつけましょう。これにより、意図しないシートへの書き込み事故を防ぐことができます。

「選択」という動作を排除するだけで、あなたのVBAスキルは一段階上のステージへ進みます。ぜひ今日から「Select禁止」を意識してみてください。

タイトルとURLをコピーしました