ListViewコントロールを利用したドラッグ&ドロップ

ドラッグ&ドロップ(1)

 ListViewコントロールを利用したドラッグ&ドロップで、ファイルパスを取得するためのコードとメモです。

ポイント

 ・ListViewコントロール
 ・AppActivateステートメント

 ListViewコントロールのOLEDragDropイベントを利用すると、他のアプリケーションと連携する「OLEドラッグ&ドロップ」でファイルパスを取得できる。今回はユーザーフォームに、それを実装する。
 ※ListViewコントロールは64bit版のOfficeに対応していない。  [参考]
  以下のコードやサンプルファイルは32bit版のExcelを対象とする。

サンプルファイル

サンプルファイルを準備した。使用は各々の責任で。・・・Sample1_D&D.xls 37KB

この方法を応用したソフトはこちら・・・「画像を縮変

準備

 まず、ユーザーフォームを挿入する。

 ListViewコントロールを利用するためには、コントロールを追加する必要がある。ツールボックスの空いているスペースで右クリックし、その他のコントロールを選択。その中のListViewコントロールにチェックを入れる。


 フォームにListViewコントロールを貼り付ける。


 次に、ListViewコントロールのプロパティを変更。
 OLEDragModeプロパティ・・・ドラッグ操作をコンポーネントが行うか、プログラマが行うかの設定
 OLEDropModeプロパティ・・・ドロップ操作を処理する方法
 Viewプロパティ・・・コントロール内のアイテムの表示方法


サンプルコード

フォームモジュールに以下のコードを貼り付ける。

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

 貼り付け後、このコードを実行するとフォームが起ちあがる。

◆実行例
 ここで取得できるのは、ファイルパスであって、ファイルそのものではない。


メモ

◆AppActivate ステートメント
 アプリケーション ウィンドウをアクティブする。
 構文:AppActivate title[, wait]

[ title ]
 必ず指定。アクティブにするアプリケーション ウィンドウのタイトルを表す文字列式を指定。
 Shell 関数によって返されるタスク ID を指定することも可能。

[ wait ]
 省略可能。アプリケーションをアクティブにする前に呼び出し側のアプリケーションに
 フォーカスを持たせるかどうかをBooleanの値で設定。
 False・・・既定値。呼び出し側のアプリケーションがフォーカスを持っていなくても、
       指定したアプリケーションをアクティブにする。
 True・・・呼び出し側のアプリケーションがフォーカスを持つまで待機し、
      指定したアプリケーションをアクティブにする。

◆Join関数
 参照

Excel Tips for Teachers

Copyright (C) 2009- 坂江 保 All Rights Reserved.