Excel VBAでSelectを使ってはいけないと言われる理由

Excel VBA

Excel VBAでSelectを使ってはいけないと言われる理由

Excel VBAをマクロ記録から始めると、

Select

Activate

が大量に出てきます。

例えば、

セルを選択して、

値を入力して、

別のシートを選択して、

また処理する。

マクロ記録は、

人間の操作をそのまま記録するため、

どうしてもこのようなコードになります。

しかし、VBAを調べていると、

よく

Selectは使わない方がいい

Selectは使ってはいけない

と書かれています。

Selectが絶対に悪いわけではありません。

ただし、

実務用マクロや配布用Excelツールでは、

Selectを多用すると事故の元になりやすいです。


結論:実務配布ではSelectせず、対象を直接指定する

まず結論です。

実務配布用のVBAでは、

Select を使わず、

対象ブック、

対象シート、

対象セルを直接指定するのが基本です。

Selectを使うと、

処理が

  • 現在選択されているセル
  • 現在アクティブなシート
  • 現在アクティブなブック

に依存しやすくなります。

この状態は、

自分のPCでは動いても、

他人のPCでは事故る原因になります。

マクロ記録で出てきたSelectは、

後から整理して、

選択してから操作

ではなく、

対象を指定して直接操作

に書き換えるのが無難です。


Selectを使う書き方と直接指定する書き方の違い

書き方 特徴 メリット 注意点 実務でのおすすめ度
Selectを使う セルやシートを選択してから処理する マクロ記録に近く、動きが見えやすい ActiveSheetやSelectionに依存しやすい
直接指定する 対象を選択せずに処理する 安定しやすく、処理対象が明確 最初は少し書き方に慣れが必要

Selectを使う書き方は、

人間の操作に近いです。

一方で、

直接指定する書き方は、

VBAに対して

「どのブックの、どのシートの、どのセルを処理するのか」

を明示します。

実務用では、

後者の方が安全です。


Selectとは

Select は、

セルやシートを選択する命令です。

例えば、

Range("A1").Select

と書くと、

A1セルを選択します。

その後で、

Selection.Value = "テスト"

のように書くと、

選択中のセルに値を書き込みます。

マクロ記録では、

人間がセルをクリックして操作する流れを記録するため、

このようなコードがよく出ます。

学習初期には、

動きが見えるので分かりやすいです。

ただし、

実務コードとしては冗長になりやすく、

処理対象も曖昧になりやすいです。


Selectを使わない書き方とは

Selectを使わない場合は、

セルを選択せず、

対象セルへ直接処理を書きます。

例えば、

Range("A1").Value = "テスト"

のように書きます。

さらに実務では、

対象シートも明示した方が安全です。

ThisWorkbook.Worksheets("設定").Range("A1").Value = "テスト"

このように書けば、

どのシートのA1セルに書き込むのかが分かります。

選択状態に依存しないため、

コードの意図も読みやすくなります。


Selectを多用すると起きやすい事故

Selectを多用すると、

次のような事故が起きやすくなります。

  • 別シートがアクティブになっていて、意図しないシートを操作する
  • Selection が何を指しているか分かりにくくなる
  • 処理途中で画面がちらつく
  • コードが長くなる
  • 実行速度が遅くなる
  • 利用者の操作状態に影響されやすい

特に危ないのは、

処理対象が

「今選ばれているもの」

に依存することです。

自分で使っているときは、

いつも同じ手順なので問題に気づきにくいです。

しかし、

他人が使うと、

どのシートを開いているか、

どのセルを選択しているかが分かりません。

これが実務配布では危険です。


問題はSelectよりActiveSheet依存

実は、

問題の本質はSelectそのものだけではありません。

本当に危ないのは、

ActiveSheetやSelectionに依存すること

です。

例えば、

Selectを使っていなくても、

Range("A1").Value = "テスト"

とだけ書くと、

基本的にはアクティブシートのA1セルが対象になります。

つまり、

対象シートを省略している時点で、

ActiveSheetに依存しています。

Select禁止の本質は、

「Selectという単語を使うな」

ではなく、

処理対象を曖昧にするな

です。

実務配布では、

ThisWorkbook

Worksheet 変数を使って、

対象を固定することが重要です。


コピペで試せるSelectあり・なし比較コード

次のコードは、

Selectを使う書き方と、

Selectを使わない書き方を比較するためのサンプルです。

どちらも、

A1またはB1に文字を書き込むだけです。

このコードは、

標準モジュールに貼って、テスト用のxlsmで実行してください。

ご注意

以下のVBAコードは、動作イメージを確認するためのサンプルです。
実行前に必ずExcelファイルのバックアップを作成してください。
業務で使用しているファイルに、いきなり貼り付けて実行しないでください。
Excelのバージョンや設定により、動作が異なる場合があります。

Sub SelectSample_BadExample()

    Worksheets(1).Activate
    Range("A1").Select
    Selection.Value = "Selectを使った例"

    MsgBox "Selectを使ってA1に書き込みました。", vbInformation

End Sub

Sub SelectSample_GoodExample()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(1)

    ws.Range("B1").Value = "Selectを使わない例"

    MsgBox "Selectを使わずB1に書き込みました。", vbInformation

End Sub

上の例では、

SelectSample_BadExample がSelectを使う書き方です。

Worksheets(1).Activate

でシートをアクティブにし、

Range("A1").Select

でセルを選択し、

Selection.Value

で値を書き込んでいます。

一方、

SelectSample_GoodExample では、

ws.Range("B1").Value

として、

対象シートとセルを直接指定しています。

この方が、

処理対象が分かりやすくなります。


マクロ記録のコードはどう直すか

マクロ記録で作ったコードは、

そのまま本番コードにしない方が安全です。

まずは、

次のような部分を探します。

  • Select
  • Activate
  • Selection
  • ActiveSheet
  • ActiveWorkbook

これらが出てきたら、

処理対象を直接指定できないか確認します。

例えば、

次のようなコードがあったとします。

Range("A1").Select
Selection.Value = "入力"

これは、

次のように書き換えられます。

Range("A1").Value = "入力"

さらに実務用なら、

対象シートを明示します。

ThisWorkbook.Worksheets("Sheet1").Range("A1").Value = "入力"

このように、

画面操作ではなく、

データ操作として書き直すのがポイントです。


With文や変数を使うと読みやすい

対象シートを何度も書く場合は、

Worksheet変数を使うと読みやすくなります。

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")

ws.Range("A1").Value = "入力"
ws.Range("B1").Value = "結果"

また、

同じシートに対して複数処理する場合は、

With 文を使うこともできます。

With ThisWorkbook.Worksheets("Sheet1")
    .Range("A1").Value = "入力"
    .Range("B1").Value = "結果"
End With

このように書くと、

どのシートを処理しているかが明確になります。

Selectを使わなくても、

十分に分かりやすいコードになります。


Selectを使ってもよい場面

Selectを絶対に使ってはいけないわけではありません。

使ってもよい場面もあります。

例えば、

  • 学習初期に動きを確認する
  • ユーザーに特定セルを見せたい
  • 処理後に入力セルへカーソルを戻したい
  • 画面操作そのものが目的の簡易マクロ
  • デバッグ中に場所を確認したい

といった場合です。

例えば、

処理が終わった後に、

利用者が次に入力すべきセルへカーソルを戻す目的なら、

Selectを使う意味があります。

ただし、

処理本体では多用しない方が安全です。

Selectは、

画面操作のために使う。

データ処理には使わない。

この分け方が分かりやすいです。


実務配布ではどう書くべきか

実務配布用のVBAでは、

次のように書くと安定しやすくなります。

  • ThisWorkbook を使ってマクロ本体のブックを明示する
  • Worksheets で対象シートを明示する
  • RangeCells で対象セルを直接指定する
  • ActiveSheetSelection への依存を減らす
  • 画面の選択状態に頼らない
  • 処理対象を変数名で読みやすくする

例えば、

Dim wb As Workbook
Dim ws As Worksheet

Set wb = ThisWorkbook
Set ws = wb.Worksheets("設定")

ws.Range("A1").Value = "処理対象を明示しています"

このようにすると、

どのブック、

どのシート、

どのセルを処理しているかが明確になります。

配布用Excelでは、

利用者の操作状態に頼らないことが重要です。


画面を動かさない方が安定する

SelectやActivateを多用すると、

処理中に画面が動きます。

画面が切り替わったり、

セル選択が移動したり、

処理中にチラついたりします。

これ自体が、

利用者に不安を与えることがあります。

また、

画面操作に依存したコードは、

実行環境によって不安定になることもあります。

実務用ツールでは、

画面をなるべく動かさず、

裏側で処理する方が安定します。

そのためにも、

Selectではなく直接指定が向いています。


まとめ

Excel VBAで Select を使ってはいけないと言われるのは、

Selectそのものが絶対悪だからではありません。

問題は、

選択状態やアクティブシートに処理が依存しやすくなることです。

マクロ記録では、

SelectやActivateが出てくるのは自然です。

初心者が最初に使うのも普通です。

ただし、

実務配布用のVBAでは、

そのまま使うと事故の原因になります。

処理対象のブック、

シート、

セルを明示し、

選択してから操作するのではなく、

直接指定して操作する。

これが基本です。

迷ったら、

選択して操作

ではなく、

直接指定して操作

と考えると分かりやすいです。


関連記事

  • Excelでセル結合を使うべきか、使わないべきか
  • Excel VBAでRangeとCellsはどっちを使うべきか
  • Excel VBAでThisWorkbookとActiveWorkbookは何が違うのか

維持DXノートについて

維持DXノートでは、

建設コンサル実務で使うExcel/VBAや、

橋梁点検調書作成支援ツールの開発メモを公開しています。

Excel作業の自動化や、

帳票作成の手間を減らす考え方を、

実務目線で整理しています。


関連する無料Excelツール

維持DXでは、

橋梁点検・維持管理業務向けのExcel VBAツールを無料公開しています。

  • 橋梁点検調書の作成支援ツール
  • 評価結果一覧作成ツール
  • 旧様式から2024様式への移行支援ツール
  • 成果整合確認ツール

いずれも、

実務で発生しやすい

  • 転記作業
  • 写真貼付
  • 一覧作成
  • 旧成果移行
  • 整合確認

の負担を減らすための補助ツールです。

以下のフォームにメールアドレスを入力すると、

ダウンロードURLを自動返信メールでお送りします。

    お名前(任意)

    メールアドレス(必須)

    会社名・所属(任意)

    ご関心のある内容(任意)

    ご相談内容(任意)

    ご注意

    ダウンロードURLは、入力いただいたメールアドレス宛に自動返信で送信されます。

    ダウンロードしたExcelでマクロが実行できない場合は、

    右クリック → プロパティ →「許可する」 をチェック後、再度開いてください。

    (Windowsのセキュリティ機能により初回実行時にブロックされる場合があります)

    コメント