【VBScript】ドラッグ&ドロップからパスを取得する

Windows PC

こんにちは、ふみです。みなさんはドラッグアンドドロップしたファイルのデータを利用して VBScript のプログラムを動かそうと思ったことはありますか?

プログラムがファイルやフォルダを利用するには、パス(データの保存場所)の情報が必要になります。したがって、ドラッグ&ドロップしたときに対象のファイルパスを取得することができれば、そのファイルを使ってプログラムを動かすことができます。

今回は拡張子「.vbs」の VBScript のファイルのアイコンにファイルをドラッグ&ドロップするとファイルのパスを取得するプログラムについて紹介します。

ドラッグ&ドロップについて

アプリケーションはドラッグ&ドロップされると、ドラッグ&ドロップたファイルやフォルダのパスが引数で渡された状態で実行します

したがって、ドラッグ&ドロップからパスを取得するには、実行されたアプリケーションの引数を調べる必要があります。

WScript の Argumentsプロパティ

WScript の Argumentsプロパティは VBScript を実行したときの引数を取得します。

vbsファイルをドラッグ&ドロップで起動した時、Argumentsプロパティはドラッグ&ドロップされたファイルやフォルダのパスを取得します。
しかし、別のプログラムから引数を付与して vbsファイルを実行した場合、Argumentsプロパティはプログラムが付与した引数を取得します。

つまり、ドラッグ&ドロップされたパスは、WScript の Argumentsプロパティで取得することができますが、WScript の Argumentsプロパティは実行プログラムの引数を取得するプロパティであり、ドラッグ&ドロップされたパスを表示するだけのプロパティではないということになります。

WScript は実行ファイルやスクリプトの情報を取得するときに使う、WSH(Windows Script Host)のオブジェクトです。

ドラッグ&ドロップでパスを取得する

ドラッグ&ドロップでパスを取得する簡単なプログラムは次のとおりです。

サンプルコード

Option Explicit
Dim objWSArg, strPath

Set objWSArg = WScript.Arguments
If objWSArg.Count = 1 Then
    strPath = objWSArg.Item(0)
    MsgBox strPath
End If
Set objWSArg = Nothing

上記のコードを Windows 10 のアクセサリから開いたメモ帳へコピー&ペースト後、文字コードを「ANSI」に設定し、適当なファイル名に拡張子「.vbs」を付けてデスクトップ等に保存すると、すぐに動作確認できます。
保存した vbsファイルのアイコンに、適当なファイルやフォルダをドラッグ&ドロップしてみましょう。

解説

4行目は WScript の Argumentsプロパティを変数に代入しています。 vbs ファイルにドラッグ&ドロップしたファイルの情報は Argumentsプロパティ(=代入した変数)から取得できます。

5行目はドラッグ&ドロップしたファイルの数を Argumentsプロパティから Countメソッドで確認しています。ダブルクリック時は0、複数ファイルをドラッグ&ドロップしたときは2以上になるので、いずれの場合も処理が除外されます。

6行目は Argumentsプロパティから Itemプロパティで0から始まる番号でドラッグ&ドロップしたファイル(またはフォルダ)のパスを取り出しています。ドラッグ&ドロップしたファイルが2個の時は番号が0~1、3個の時は0~2になります。
ここでは Itemプロパティで番号を指定していますが、Argumentsプロパティに直接番号を指定してもパスを取り出すことができます。
例えば、上記コードでは「objWSArg.Item(0)」となっていますが、「objWSArg(0)」でも同じ動作をします。
Argumentsプロパティは配列のように情報を取得できますが、配列ではないので、Argumentsプロパティを代入した変数にUBound関数を使うとエラーになります

最下行はオブジェクトを代入した変数を解放しています。

Excelファイル限定でパスを取得する

実際に取得したパスを使う場合、ファイルの拡張子を指定する場合がほとんどです。
ドラッグ&ドロップから Excelファイル限定でパスを取得する場合、プログラムは次のようになります。

サンプルコード

Option Explicit 
Dim objWSArg, objFSO, strPath, strExtension

Set objWSArg = WScript.Arguments
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objWSArg.Count = 1 Then
    strPath = objWSArg.Item(0)
    strExtension = objFSO.GetExtensionName(strPath)
    Select Case strExtension
    Case "xlsx", "xlsm", "xls"
        MsgBox strPath
    Case Else
        strPath = vbNullString
        MsgBox "指定された拡張子のファイルではありません"
    End Select
End If
Set objWSArg = Nothing: Set objFSO = Nothing

上記のコードを Windows 10 のアクセサリから開いたメモ帳へコピー&ペースト後、文字コードを「ANSI」に設定し、適当なファイル名に拡張子「.vbs」を付けてデスクトップ等に保存すると、すぐに動作確認できます。
保存した vbsファイルのアイコンに、適当なファイルをドラッグ&ドロップしてみましょう。
ドラッグ&ドロップしたファイルの拡張子が「xlsx」、「xlsm」、「xls」の Excelファイルのとき、ファイルのパスがメッセージで表示されます。

解説

5行目は FileSystemObject を変数に代入しています。 FileSystemObject はファイルやフォルダを操作するときに使う、WSH(Windows Script Host)のオブジェクトです。

8行目は FileSystemObject の GetExtensionNameメソッドで括弧内のファイルパスの拡張子を取得しています。
ちなみに、FileSystemObject を Excel等の VBA で利用するときは代入する変数を Object 型で宣言して使います。

13行目は取得した Excelファイル 以外のパスの文字列を、変数strPath から消去しています。
この後、Excelファイルを利用して命令を実行させる場合、「strPath <> vbNullString」で Excelファイル のパスを取得できたかを判別できます。

まとめ

  • ドラッグ&ドロップされたアプリケーションは、ドラッグ&ドロップしたファイルやフォルダのパスが引数で渡された状態で実行される
  • ドラッグ&ドロップされたパスは、WScript の Argumentsプロパティで取得できる
  • WScript は実行ファイルやスクリプトの情報を取得するときに使う、WSH(Windows Script Host)のオブジェクト
  • ドラッグ&ドロップされた数は WScript の Argumentsプロパティから Countメソッドで取得できる
  • Argumentsプロパティは配列ではないので、UBound関数を使うとエラーになる
  • FileSystemObject はファイルやフォルダを操作するときに使う、WSH(Windows Script Host)のオブジェクト
  • ファイルの拡張子は FileSystemObject の GetExtensionNameメソッドで取得できる

ありがとうございました。

コメント

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