VBScriptを掌握せよ:プロセスを無駄に増やさない「GetObject」と「CreateObject」の賢い使い分け
こんにちは。自動化の世界へようこそ。
日々、タスク自動化のためにVBScript(WSH)を書いていて、「なぜかタスクマネージャーにExcelの残骸が溜まっていく…」と悩んだことはありませんか?
マクロの記録から一歩踏み出し、現場で戦えるスクリプトを書くために最も重要なこと。それは、「OSのリソースをいかに無駄にせず、既存の環境をスマートに再利用するか」という視点です。
今日は、業務効率化の第一歩にして奥義、「GetObject」と「CreateObject」の使い分けについて、現場の知見を込めて解説します。
—
1. なぜ「プロセスのアタッチ」が重要なのか?
自動化スクリプトを書くとき、初心者はよく `CreateObject(“Excel.Application”)` を使います。これは「新しくExcelを起動する」命令です。
しかし、もしユーザーが既にExcelを開いて作業していたらどうでしょう?
そのままスクリプトを実行すれば、PC内には「ユーザーが使っているExcel」と「スクリプトが裏で勝手に立ち上げたExcel」の2つが共存します。
- メモリの無駄遣い
- 「保存されていないブック」の競合
- PCが重くなる原因
これらを防ぐために、「既に起動しているならそれに乗り込み(アタッチ)、いなければ新しく作る」という柔軟性が求められるのです。
—
2. 実践:最強の「アタッチ&新規起動」パターン
まずは、現場でそのまま使える「鉄板コード」を見てみましょう。エラーハンドリング(`On Error Resume Next`)を組み合わせるのが、この世界の定石です。
Option Explicit
Dim objExcel
‘ 1. まずは起動しているExcelを掴みにいく(GetObject)
On Error Resume Next
Set objExcel = GetObject(, “Excel.Application”)
‘ 2. もし掴めなかったら(エラーが発生したら)、新規起動する(CreateObject)
If Err.Number <> 0 Then
Err.Clear ‘ エラー情報をクリア
On Error GoTo 0 ‘ エラー制御を通常に戻す
Set objExcel = CreateObject(“Excel.Application”)
WScript.Echo “新規プロセスを起動しました。”
Else
On Error GoTo 0 ‘ エラー制御を通常に戻す
WScript.Echo “既存のExcelプロセスに接続しました。”
End If
‘ 3. Excelを表示して操作する
objExcel.Visible = True
objExcel.Workbooks.Add
‘ 処理が終わったら解放(重要!)
‘ Set objExcel = Nothing
—
3. コードの心臓部を読み解く
このコードには、VBScriptを扱う上での「魂」が込められています。
`On Error Resume Next` の真意
`GetObject` は、対象のアプリが起動していないと即座に「エラー」を返してスクリプトを止めてしまいます。これを防ぐために、一時的に「エラーが出ても無視して次に進め」と命令し、その直後に `If Err.Number <> 0` で「エラーが出たかどうか」を判定するのが、このロジックの肝です。
「GetObject」のカンマの意味
`GetObject(, “Excel.Application”)` の第一引数が空(コンマのみ)なのは、「ファイルパスを指定せずに、起動中の全インスタンスから探せ」という合図です。ここがポイントです。
—
4. 陥りやすい罠と解決策
罠1:終了処理を忘れる
`Set objExcel = Nothing` を省略していませんか?
スクリプトが終わっても、メモリ上にプロセスが居座り続けることがあります。特にバックグラウンドで動かす場合は、確実に `Quit` メソッドや `Nothing` を使いましょう。
罠2:複数起動している場合
`GetObject` は、「最初に起動したインスタンス」を掴む傾向があります。もし複数のExcelが起動している場合、どのExcelを掴むかはOS側の仕様に依存します。あえて特定のウィンドウを狙いたい場合は、より高度なWin32 APIやUI Automationの知識が必要になりますが、まずはこの「アタッチの基本」を完璧にマスターしてください。
—
さあ、一歩先へ
「マクロの記録」で生成されるコードは、あくまで「その場限りの使い捨て」です。しかし、今日学んだ `GetObject` を使いこなすことで、あなたのスクリプトは「今のPC環境と対話できる賢い自動化ツール」へと進化します。
この仕組みをマスターすれば、Excelだけでなく、OutlookやWord、さらには独自のCOMコンポーネントにも応用が効くようになります。
ここをクリアすれば、VBScriptの基本はバッチリです。
さあ、次はどの業務を自動化しますか?あなたのコードが、現場の時間を生み出すことを楽しみにしています。
