トップ > 備忘録 > Excel VBA:ドラッグ&ドロップ(1)

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・・・呼び出し側のアプリケーションがフォーカスを持つまで待機し、指定したアプリケーションをアクティブにする。

Join関数

参照


ページトップへ戻る
Copyright(C) 2009- 坂江 保 All Rights Reserved.