VBAのエラー原因はCreateObjectだった話:ツール展開を見据えたマクロ設計の重要性

雑記

はじめに

あるとき、自分が作成したVBAマクロが特定のユーザーのPCで動かないというエラーが発生しました。原因を調べていくと、CreateObjectを使用していたことが問題だと判明。この記事では、その原因と解決までの過程、そこから得た学びをまとめます。

原因:CreateObjectが使えない環境だった

今回のマクロでは、ファイル操作のためにFileSystemObjectCreateObjectで呼び出していました。

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

しかし、エラーが発生したユーザーのPCでは、以下の2つが未設定の状態でした。

原因① Excelのセキュリティセンターの設定

Excelのセキュリティセンターで「すべてのマクロを無効にする」設定になっていると、CreateObjectを含むマクロが正常に動作しません。

確認・変更手順:

  1. Excelを開き、「ファイル」→「オプション」→「トラストセンター」→「トラストセンターの設定」
  2. 「マクロの設定」を開く
  3. 「警告を表示してすべてのマクロを無効にする」または「すべてのマクロを有効にする」に変更

原因② 参照設定(Microsoft Scripting Runtime)が未設定

FileSystemObjectを使うには、VBEの参照設定に「Microsoft Scripting Runtime」が追加されている必要があります。未設定の場合、CreateObjectでの呼び出しが失敗することがあります。

確認・変更手順:

  1. VBE(Alt + F11)を開く
  2. 「ツール」→「参照設定」を開く
  3. 「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バージョン、セキュリティ設定など)を事前に確認する
  • 展開範囲が広いほど、環境に依存しない堅牢な実装を優先する

小さなエラーひとつでも、原因を深掘りすることで設計の考え方が大きく変わります。同じ失敗を繰り返さないよう、この経験を活かしていきたいと思います。

雑記
スポンサーリンク
▼気に入ったら、シェアしてね@・ω・@
hitsujibotttttiをフォローする
スポンサーリンク

コメント

タイトルとURLをコピーしました