小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

VBAやDOSコマンドでのダブルクォーテーションのエスケープ

VB6,VBS,VBADOSコマンドでの文字列はダブルクォーテーションで挟んで表現します。しかし、文字列中にダブルクォーテーションがある場合は、どうするかというとダブルクォーテーションの前にもう一つダブルクォーテーションを置きます。単純なことだと思いますが…、実際は結構複雑です。

たとえば、あるDOSコマンドの引数に文字列がある場合で、VBAからそのDOSコマンドを発行した場合、以下の感じになります。

(VBAのソース上)
strTN = "XXX20060812120000"
strCMD = "C:\XXXMail\XXXMail1.xls"
strWkcmd = Environ("ComSpec") & " /c ""schtasks /create /TN " & strTN & " /TR " & """""" & strCMD & """"""""
(DOSコマンドのソース上)
C:\WINDOWS\system32\cmd.exe /c "schtasks /create  /TN XXX20060812120000 /TR ""C:\XXXMail\XXXMail1.xls"""
(注意:上記コマンドは、見やすくするため、かなりオプション記述を省略しています。詳しくは、schtasksのリファレンスを参照のこと)

上記のように"""""" & strCMD & """"""""となると結構複雑になります。解析の基本は、ダブルクォーテーションはダブルクォーテーションでエスケープする…です。

追記:DOSコマンド内のダブルクォーテーションは、そのコマンドがとのようにダブルクォーテーションを解釈するかによって、へたにエスケープするとエラーになったりします。

したがって、実際に試行錯誤して動作確認が必要です。

とにかく、ダブルクォーテーションエスケープに関して、VBからDOSコマンドを発行するときは、VBの仕様、WINDOWSの仕様、DOSコマンドの仕様が複雑に絡み合っていますので、細心の注意が必要です。