はじめに
あるとき、自分が作成したVBAマクロが特定のユーザーのPCで動かないというエラーが発生しました。原因を調べていくと、CreateObjectを使用していたことが問題だと判明。この記事では、その原因と解決までの過程、そこから得た学びをまとめます。
原因:CreateObjectが使えない環境だった
今回のマクロでは、ファイル操作のためにFileSystemObjectをCreateObjectで呼び出していました。
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
しかし、エラーが発生したユーザーのPCでは、以下の2つが未設定の状態でした。
原因① Excelのセキュリティセンターの設定
Excelのセキュリティセンターで「すべてのマクロを無効にする」設定になっていると、CreateObjectを含むマクロが正常に動作しません。
確認・変更手順:
- Excelを開き、「ファイル」→「オプション」→「トラストセンター」→「トラストセンターの設定」
- 「マクロの設定」を開く
- 「警告を表示してすべてのマクロを無効にする」または「すべてのマクロを有効にする」に変更
原因② 参照設定(Microsoft Scripting Runtime)が未設定
FileSystemObjectを使うには、VBEの参照設定に「Microsoft Scripting Runtime」が追加されている必要があります。未設定の場合、CreateObjectでの呼び出しが失敗することがあります。
確認・変更手順:
- VBE(Alt + F11)を開く
- 「ツール」→「参照設定」を開く
- 「Microsoft Scripting Runtime」にチェックを入れてOK
解決策の検討:2つの選択肢
原因がわかったところで、解決策として以下の2択を検討しました。
| 解決策① PC環境を1台ずつ変更 | 解決策② CreateObjectを使わない実装に修正 | |
|---|---|---|
| 作業量 | ユーザー分だけ発生 | 一度だけ |
| 即効性 | 高い | コード修正が必要 |
| 将来性 | 新しいユーザーのたびに対応が必要 | 一度直せば全員に適用 |
| リスク | 設定漏れが起きやすい | コード変更によるデグレの可能性 |
今回の判断:解決策②を選択
このマクロは今後も不特定多数のユーザーに展開される可能性がありました。解決策①ではユーザーが増えるたびにPC設定の対応が必要になり、設定漏れによるエラーも繰り返し発生するリスクがあります。
そのため、一度修正すれば全ユーザーに適用できる解決策②を選びました。
解決策②の実装:標準機能への書き換え
FileSystemObjectでよく使う操作を、VBA標準機能で書き換えます。CreateObjectも参照設定も不要になるため、PC環境に左右されません。
ファイルの存在確認
' 修正前
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists("C:\sample\test.txt") Then
'処理
End If
' 修正後
If Dir("C:\sample\test.txt") <> "" Then
'処理
End If
フォルダの存在確認
' 修正前
If fso.FolderExists("C:\sample\") Then
' 修正後
If Dir("C:\sample\", vbDirectory) <> "" Then
ファイルの読み込み
' 修正前
Dim fso As Object
Dim ts As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile("C:\sample\test.txt", 1)
Dim line As String
line = ts.ReadLine
ts.Close
' 修正後
Dim fileNo As Integer
Dim line As String
fileNo = FreeFile
Open "C:\sample\test.txt" For Input As #fileNo
Line Input #fileNo, line
Close #fileNo
まとめ:ツール展開を見据えてマクロを設計する
今回の経験で、「誰が・どんな環境で使うか」を最初に考えてマクロを作る重要性を実感しました。
自分だけが使うツールであれば、環境を自分で管理できます。しかし、他のユーザーに展開するツールでは、PC環境の差異が予期せぬエラーを生む原因になります。
今後意識したいこと:
- 外部ライブラリへの依存はなるべく避け、VBA標準機能で実装できないか検討する
- ツールを渡す相手の環境(Excelバージョン、セキュリティ設定など)を事前に確認する
- 展開範囲が広いほど、環境に依存しない堅牢な実装を優先する
小さなエラーひとつでも、原因を深掘りすることで設計の考え方が大きく変わります。同じ失敗を繰り返さないよう、この経験を活かしていきたいと思います。


コメント