こんにちは!VBAの基礎を一通りマスターして、「さあ、本格的な業務自動化ツールを作るぞ!」と意気込んでいるあなたへ。
今回は、Excel VBAを極める上で絶対に避けて通れない「最重要の分かれ道」についてお話しします。
あなたが初めてVBAに触れたとき、強力な味方になってくれた機能がありますよね。そう、「マクロの記録」です。自分がExcel上でやった操作をそのままコードにしてくれる、魔法のような機能です。
しかし、その「マクロの記録」が吐き出すコードをそのまま実務で使っていると、「処理が異常に遅い」「画面が激しくチラつく」「突然エラーで止まる」という、エンジニアの三大悪夢に悩まされることになります。
今回は、その原因である `Select` や `Activate` の呪縛を断ち切り、Excelを裏側で俊敏に働かせる「オブジェクトの直接参照術」を、優しく、そして本質的に伝授します。
ここをクリアすれば、あなたの書くコードは一気にプロの領域へとジャンプアップしますよ。ぜひ最後までついてきてくださいね!
—
1. なぜ「マクロの記録」のコードは遅いのか?
まずは、敵を知ることから始めましょう。
例えば、「Sheet1のセルA1を選択し、そこに『売上』と入力する」という操作をマクロの記録で取得すると、次のようなコードが生成されます。
‘ 【マクロの記録が生成するコード】
Sheets(“Sheet1”).Select
Range(“A1”).Select
ActiveCell.FormulaR1C1 = “売上”
人間がExcelを操作するときの手順を、そのままプログラムに翻訳した形です。
具体的には、以下の3ステップを踏んでいます。
1. Sheet1を選択する(画面を切り替える)
2. A1セルを選択する(フォーカスを当てる)
3. 「今選択されているセル(ActiveCell)」に対して文字を入れる
ここで考えてみてください。私たち人間が操作するときは、画面を見て、マウスを動かして、クリックする必要があります。だから「選択(Select)」が必要なのです。
しかし、コンピュータ(VBA)に目の玉やマウスはありません。
コンピュータにとって、わざわざ画面上のセルを「選択」するという行為は、「わざわざ遠回りして、Excelの表示を書き換えてから作業しなさい」と命令しているようなもの。これが、処理を重くし、画面をパチパチとチラつかせる最大の原因なのです。
—
2. 解決策:「選択するな、直接指定せよ」
この無駄なステップを完全に排除するのが、今回お伝えする「Rangeオブジェクトの直接参照」です。
先ほどの「セルA1に『売上』と入れる」という処理を、直接参照で書き換えてみましょう。
‘ 【直接参照による洗練されたコード】
Worksheets(“Sheet1”).Range(“A1”).Value = “売上”
なんと、1行です。`Select` も `ActiveCell` も一切登場しません。
- Sheet1の
- A1セルを
- 名指しして、値(Value)に「売上」を代入する
これが「オブジェクト指向」の基本であり、VBAの本質です。Excelのシートやセルを「オブジェクト(操作対象のモノ)」として捉え、画面を選択することなく、裏側から直接命令を叩き込むのです。
メリットのオンパレード
この書き方に変えるだけで、以下の圧倒的な恩恵を受けられます。
- 圧倒的な高速化: 画面の描画更新が発生しないため、処理速度が何倍、何十倍にも跳ね上がります。
- 視覚的なストレスフリー: マクロ実行中に画面がピカピカ光ったり、別のシートに勝手に切り替わったりすることがなくなります。
- エラーへの耐性: 「今どのシートが開いているか」に依存しないため、誤作動によるバグが劇的に減ります。
—
3. 【実践】コピペで使える!コピー&ペーストの脱却
実務で最もやりがちなのが、「あるセルをコピーして、別のセルに貼り付ける」という動作の自動化です。これも、マクロの記録をそのまま使うと大惨事になります。
❌ やってはいけない「選択コピー」
‘ 【NG例】画面の選択とクリップボードを酷使する遅いコード
Range(“A1:A10”).Select
Selection.Copy
Range(“B1:B10”).Select
ActiveSheet.Paste
Application.CutCopyMode = False ‘ クリップボードのクリア
これではExcelのクリップボード領域を無駄に消費し、動作も非常に不安定になります。
⭕ プロの「ダイレクト代入」
実は、セルの値を移すだけなら、「コピー&ペースト」すら必要ありません。 右側の値に、左側の値をそのまま代入すれば一瞬で終わります。
‘ 【OK例】一瞬で値が転記される超高速コード
Worksheets(“Sheet1”).Range(“B1:B10”).Value = Worksheets(“Sheet1”).Range(“A1:A10”).Value
「えっ、これだけ?」と思いましたか?
そうです、これだけでA1〜A10のデータが、B1〜B10へ一瞬でコピーされます。クリップボードも経由しないため、PCへの負荷も最小限です。
—
4. さらに現場で役立つ!「With句」によるスマートな記述
実務では、同じシートや同じオブジェクトに対して何度もプロパティを指定することがよくあります。そんなときは `With` 句を組み合わせて、コードをさらに美しく、読みやすくしましょう。
Sub UpdateCustomerData()
‘ 画面描画の停止(さらに速度を極限まで高めるテクニック)
Application.ScreenUpdating = False
‘ 対象のワークシートを明確に定義してスコープを絞る
With Worksheets(“顧客マスタ”)
.Range(“A2”).Value = “株式会社山田商事”
.Range(“B2”).Value = “東京都千代田区”
.Range(“C2”).Value = “03-0000-0000”
End With
‘ 画面描画の復元
Application.ScreenUpdating = True
MsgBox “データの書き込みが完了しました!”, vbInformation
End Sub
このコードには、実務で使える最高のテクニックが詰まっています。
1. `Application.ScreenUpdating = False`: 処理の最初に画面描画をフリーズさせ、最後に元に戻すことで、目に見えないほどの高速化を実現します。
2. `With Worksheets(…)`: シート名の重複入力を防ぎ、コードの保守性を劇的に高めます。
—
まとめ:脱・初心者へのステップアップ
いかがでしょうか?
「マクロの記録」は素晴らしい機能ですが、それはあくまで「VBAの文法を調べるための辞書」として使うものです。そこに吐き出された `Select` や `Activate` は、実務のコードに貼り付ける前に、必ず「本当にこれ、選択する必要あるか?」と疑うクセをつけてください。
- 画面を「選択(Select)」するな、「参照」せよ。
- 「コピペ」するな、「値の代入」を使え。
- 処理の前後で「画面描画(ScreenUpdating)」を制御せよ。
ここをクリアできれば、あなたの書くExcel VBAは、もう「お絵かきマクロ」ではありません。立派な「業務システム・自動化プログラム」です。
明日からのあなたのVBAコーディングが、劇的になめらかで、そしてスピーディーになることを応援しています。ここを乗り越えれば、Excel VBAの基本はバッチリですよ!
