こんにちは。長年、企業の現場でExcel VBAの教育とシステム開発に携わっている講師です。
多くの現場でVBAが活用されていますが、残念ながら「動けばいい」というコードが溢れているのも事実です。しかし、実務において重要なのは、単に動作することだけではありません。処理が速いこと、そしてエラーで止まらないこと。この二つを両立させて初めて、プロフェッショナルなツールと言えます。
今回は、明日からの業務で即座に役立つ、中級者から上級者へステップアップするための「即効テクニック」を厳選して解説します。
1. 画面更新と自動計算の制御による高速化
VBAで最も多い「処理が遅い」という悩み。その原因の多くは、マクロが動くたびにExcelが画面を描画し、数式を再計算していることにあります。これを制御するだけで、処理速度は劇的に向上します。
以下のコードを、処理の前後で記述する習慣をつけてください。
Sub FastProcess()
‘ 処理開始前
With Application
.ScreenUpdating = False ‘ 画面更新停止
.Calculation = xlCalculationManual ‘ 自動計算停止
.EnableEvents = False ‘ イベント抑制
End With
‘ ここにメインの処理を記述
‘ (例:1万行のデータ処理など)
‘ 処理終了後(必ず戻すこと)
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.EnableEvents = True
End With
End Sub
このテクニックは、特に大量のセルを操作する場合に必須です。もしエラーが発生してマクロが途中で止まってしまった場合、設定が「停止」のままになるリスクがあるため、必ずエラーハンドリングとセットで使用しましょう。
2. エラーハンドリングの標準化
「なぜかマクロが途中で止まって動かなくなる」という相談をよく受けます。これはエラーハンドリングが適切ではないためです。プロのコードには必ず「もし何かが起きても、安全に終了させるための出口」が用意されています。
以下は、実務で推奨される定型的なエラーハンドリングのテンプレートです。
Sub RobustProcess()
On Error GoTo ErrorHandler
‘ 本来の処理
Dim ws As Worksheet
Set ws = Worksheets(“存在しないシート名”) ‘ ここでエラーを誘発
‘ 正常終了時の処理
Exit Sub
ErrorHandler:
‘ エラーが発生した時の対応
MsgBox “エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “システムエラー”
‘ 必要に応じて後処理
Application.ScreenUpdating = True
End Sub
このように「On Error GoTo」を使ってエラー発生時の挙動を定義するだけで、ユーザーは「何が起きたか」を把握でき、システム開発者は原因調査が容易になります。
3. セルの操作を最小限にする「配列」の活用
VBAでセルを一つずつ読み書きするのは、実は非常に低速です。ExcelのメモリとVBAのメモリの間で何度もやり取りが発生するためです。
劇的な高速化を狙うなら、セル範囲を一気にメモリ(配列)に読み込み、VBA上で計算し、最後に一気にセルへ書き出す手法をマスターしてください。
Sub UseArray()
Dim dataRange As Variant
Dim i As Long
‘ セル範囲を配列に代入(一瞬で完了)
dataRange = Range(“A1:A10000”).Value
‘ 配列内をループ(セルを操作するより数百倍速い)
For i = 1 To UBound(dataRange, 1)
dataRange(i, 1) = dataRange(i, 1) 1.1
Next i
‘ 配列を一気に書き出し
Range(“A1:A10000”).Value = dataRange
End Sub
この手法は、数万行規模のデータを扱う際に、処理時間を数分から数秒へ短縮させる力があります。
4. 動的シート・範囲の確実な取得
実務では、データ量が増えたりシート名が変わったりすることは日常茶飯事です。Range(“A1:A10”)のようにハードコーディングしてしまうと、すぐにメンテナンス不能なコードになります。
常に最終行を動的に取得するテクニックを身につけましょう。
Sub GetLastRow()
Dim lastRow As Long
‘ A列の最終行を取得
lastRow = Cells(Rows.Count, “A”).End(xlUp).Row
‘ 範囲を動的に指定
Range(“A1:A” & lastRow).Select
End Sub
Cells(Rows.Count, “A”).End(xlUp).Row は、A列の最下行から上にジャンプして値が入っているセルを探すという、非常に堅牢な手法です。
5. コードを読みやすくする「定数」と「列挙型」
コード内に「1」や「2」といった数字が頻出すると、後から見た時に「これは何の数値だっけ?」となります。意味のある名前をつけて管理しましょう。
また、複雑なステータス管理には「Enum(列挙型)」が非常に便利です。
Enum Status
Waiting = 0
Processing = 1
Finished = 2
End Enum
Sub CheckStatus()
Dim currentStatus As Status
currentStatus = Processing
If currentStatus = Processing Then
Debug.Print “処理中です”
End If
End Enum
このように書くことで、コードの可読性が格段に上がり、バグの混入を防ぐことができます。
6. 最後に:プロフェッショナルな心構え
VBAのコーディングにおいて、最も大切なのは「他人が読んだときに理解できるか」と「将来の自分がメンテナンスできるか」という視点です。
今回紹介したテクニックは、どれも基本的なものですが、これらを組み合わせて丁寧にコードを書くことで、あなたの作成するツールは「ただの自動化ツール」から「信頼性の高い業務システム」へと進化します。
1. 処理速度を意識する(画面更新停止、配列活用)
2. 堅牢性を意識する(エラーハンドリング、動的範囲)
3. 可読性を意識する(定数活用、命名規則)
これら三本柱を常に意識してください。
VBAは、正しく使えば数多くの事務作業を自動化し、あなたの時間を生み出す強力な武器になります。ぜひ、今日からこれらのテクニックを一つずつ、既存のコードに当てはめてみてください。
もし、さらに高度なテクニックや、特定の業務に特化した最適化方法を知りたい場合は、いつでもご相談ください。皆さんの実務が、より効率的でストレスのないものになることを心から応援しています。
それでは、素晴らしいVBAライフを。
