Excel VBA:ドラッグ&ドロップ(1)ListViewコントロールを利用したドラッグ&ドロップ 2015.02.08
ListViewコントロールを利用したドラッグ&ドロップで、ファイルパスを取得するためのコードとメモです。
ポイント
・ListViewコントロール
・AppActivateステートメント
ListViewコントロールのOLEDragDropイベントを利用すると、他のアプリケーションと連携する「OLEドラッグ&ドロップ」でファイルパスを取得できる。今回はユーザーフォームに、それを実装する。
※ListViewコントロールは64bit版のOfficeに対応していない。(2014年時点) [参考]
以下のコードやサンプルファイルは32bit版のExcelを対象とする。
※2022年時点で、ListViewコントロールが64bit版のOfficeに対応していることを確認済み
サンプルファイル
サンプルファイルを準備した。使用は各々の責任で。 ダウンロード
この方法を応用したソフトはこちら。 「画像を縮変」
Excelマクロ管理ツール
準備
まず、ユーザーフォームを挿入する。
ListViewコントロールを利用するためには、コントロールを追加する必要がある。ツールボックスの空いているスペースで右クリックし、その他のコントロールを選択。その中のListViewコントロールにチェックを入れる。
フォームにListViewコントロールを貼り付ける。
次に、ListViewコントロールのプロパティを変更。
OLEDragModeプロパティ・・・ドラッグ操作をコンポーネントが行うか、プログラマが行うかの設定
OLEDropModeプロパティ・・・ドロップ操作を処理する方法
Viewプロパティ・・・コントロール内のアイテムの表示方法
サンプルコード2015.02.08
ユーザーフォームのフォームモジュールに以下のコードを貼り付ける。
Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, _ Effect As Long, Button As Integer, _ Shift As Integer, _ x As Single, _ y As Single) Dim i As Long Dim strFilesPath() As String With Me AppActivate .Caption 'ユーザーフォームをアクティブにする .ListView1.ListItems.Clear If Data.Files.count < 1 Then Exit Sub '引数Data ReDim strFilesPath(1 To Data.Files.count) For i = 1 To Data.Files.count strFilesPath(i) = Data.Files(i) Next MsgBox Join$(strFilesPath, vbCrLf) End With End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) With Excel.Application If 1 < .Workbooks.count Then .Visible = True With .ThisWorkbook .Saved = True .Close End With Else .Visible = True .DisplayAlerts = False .Quit End If End With End Sub
標準モジュールに以下のコードを貼り付ける。
Public Sub Main_Form_Show() Excel.Application.Visible = False UserForm1.Show vbModeless End Sub
貼り付け後、このコードを実行するとフォームが起ちあがる。そのフォームのListViewにファイルをドラッグ&ドロップする。
実行例
ここで取得できるのは、ファイルパスであって、ファイルそのものではない。
メモ
AppActivate ステートメント
アプリケーション ウィンドウをアクティブする。
構文:AppActivate title[, wait]
[ title ]
必ず指定。アクティブにするアプリケーション ウィンドウのタイトルを表す文字列式を指定。
Shell 関数によって返されるタスク ID を指定することも可能。
[ wait ]
省略可能。アプリケーションをアクティブにする前に、呼び出し側のアプリケーションにフォーカスを持たせるかどうかをBooleanの値で設定。
False・・・既定値。呼び出し側のアプリケーションがフォーカスを持っていなくても、指定したアプリケーションをアクティブにする。
True・・・呼び出し側のアプリケーションがフォーカスを持つまで待機し、指定したアプリケーションをアクティブにする。