VBAでドラッグ&ドロップでファイルパスを取得する一番簡単な方法


はじめに

ExcelVBAで業務用ツールを開発する際に避けて通れないのが処理用のファイルパスの入力です。
これまで自分が作成したツールではファイルダイアログを開いて選択してもらう方法しかありませんでした。
今回、非常にシンプルな方法でフォーム上へのドラッグ&ドロップでファイルパスを取得できたので、記事に残します。

目的

VBAのフォーム上へのドラッグ&ドロップでファイルパスを取得したい。

処理フロー

1、フォーム上にWebbrowserコントロールを配置する
2、WebbrowserコントロールのBeforeNavigate2イベントの引数URLを取得する
3、BeforeNavigate2イベントを引数Cancel=Trueでキャンセルする

フォームイメージ・サンプルコード

下記のフォームイメージではTextBoxとLabelを配置しています。
WebbrowserコントロールはLabelの枠内の白い部分です。

Option Explicit

Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
TextBox1.Text = URL
Cancel = True
End Sub

解説

Webbrowserコントロールにファイルをドラッグ&ドロップすると表示のためファイルパスを開こうとします。
この時、BeforeNavigate2イベントは文字通りファイルを開く前に発生し、引数URLとしてファイルパスを返します。
さらに、BeforeNavigate2イベントそのものを引数Cancelで中断します。
結果としてWebbrowserコントロールのファイル読み込みによるエラーを回避しつつ、ファイルパスのみを取得することができます。

補足

ファイルパスは一つずつしか取得できません。
Webbrowserコントロールの枠とか背景色とかの変更はVBAのフォームでは簡単にはできないようです。
外部にHtmlファイル作れば表示内容の変更は可能でした。

最後に

自身の環境ではこれでファイルパスの取得がめちゃくちゃ楽になりました。
今後Webbrowserコントロールのサポートが続く限りは、使える方法だと思います。