VBAでRunメソッド引数ファイル名に半角スペースが含まれるとエラーで動かないメモ

VBAにて、Shellメソッドにて呼び出すファイル名(PDF)が半角を含んでいるとエラーとなっていました。実際に半角を含んでいることまで判明するのが大変でした。その解決策です。

ダブルコーテーションでくくればオッケー

例えば以下のようなコードではエラーです。

ret = WShell.Run(targetFileFullpath, 1, False)

このtargetFileFullpathは文字列型変数で、ここにPDFファイル名が(例えばFSO等で取得したフルパス)が入ってきます。このファイル名に半角スペースがあると仕様っぽいですが、正しくファイルを認識できずエラーとなります。

Runメソッドは空白を含むと駄目ということのようです。

参考:拡張子関連づけでファイルを開く

なので、解決策はダブルコーテーションでこれをくくる形です。

つまり、

ret = WShell.Run(Chr(34) & targetFileFullpath & Chr(34), 1, False)

のようにChr関数でダブルコーテーションを出していくか、

ret = WShell.Run("""" & targetFileFullpath & """", 1, False)

のように、ダブルコーテーションでくくりまくるパターンです。どちらもいけます。

気づけなかった理由は?

そもそもこのエラーが起きるのにはファイル自体の生成がある条件によって複製された時でした。例えば、Windowsでは「A.pdf」をコピーすると、「A~コピー~.pdf」みたいになりますが、こういうコピーされた時に勝手に「半角スペース」が入ってしまったようです。この動きも別のプログラムの仕様なのでちょっと防げないので、エラーとなっていたということです。

当然デバッグして原因判明と対策が出たのですが、プログラムを動かしてなぜか止まることが気持ち悪かったのでなんとかなってよかったですね。

半角スペースがそもそもなぜRunメソッドで駄目かといえば、コマンドライン引数であるとき「notepad.exe /s」みたいに、スイッチなり引数指定で半角スペースは普通なんですよね。そういう意味では仕様として正しいので、どこまでがファイル名かを示す意味でダブルコーテーションがあるわけですね。

Shellとかを普段使いこんでいる人なら気づけそうですがそうでないなら、軽くなんでだろ状態になりそうです。

同じような現象であれば、まずファイル名を疑ってみるといいかもしれませんね。

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