画像をドラッグ&ドロップで表示させる

最終更新: 3月23日


今回は画像をユーザーフォームにドラッグ&ドロップして表示させる方法を紹介します。 サンプルファイル

画像をデータベースなどに登録する場合、「開く」ボタンからファイルを指定して行うのが一般的な方法ですが、ドラグ&ドロップの方が便利な場合もあります。

1. ユーザーフォームにコントロールを配置

まず、ユーザーフォームの上に次の通りコントロールを配置してください。

Image1、lblDropImageHere、lvDropImageHereの順で配置してください。重なる順番が重要です。

lvDropImageHereのプロパティを次の通り設定してください。

Appearance: 1 - ccFlat

OLEDropMode: 1 - ccOLEDropManual

Visible: False

Listviewはその名のとおり、主に文字列をリスト表示する際に使用するもので、リストボックスの代わりに使うことが多いコントロールです。また、ファイルをドロップした時にイベントが発生するのが特徴です。他にドロップ時のイベントを扱えるコントロールが見当たらないので、私はこれを使っています。

2. 画像をドロップした時の処理の流れ

1.画像がImage1の上に来る

2. Image1のBeforeDropOverイベントが発生

3. lvDropImageHereのvisibleをtrueに変更する

4. 画像をドロップする

5. lvDropImageHereのOLEDragDropイベントが発生する

6. ドロップした画像ファイルのパス、名前を取得

7. 画像ファイルを読み込み、Image1に設定する 8. 画像のパス、名前をラベルに表示

9. lvDropImageHereとlblDropImageHereを隠す

3. ドロップ時のイベントプロシージャーの実装

いよいよ実装です。

次のコードをUserform1のコードウィンドウに貼り付けてください。

Private Sub Image1_BeforeDragOver(ByVal Cancel As MSForms.ReturnBoolean, ByVal Data As   MSForms.DataObject, ByVal x As Single, ByVal y As Single, ByVal DragState As MSForms.fmDragState, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)
 
    Me.lvDropImageHere.Visible = True

End Sub


Private Sub LvDropImageHere_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)

    Dim filePath As String

    Dim fileName As String
 
  '画像ファイルのパスと名前を取得

    filePath = Data.Files(1)

    fileName = Dir(filePath)
  '取得したパスとファイル名をラベルに表示させる

    Me.lblFileName.Caption = fileName

    Me.lblFilePath.Caption = filePath
  '画像を読み込んでImageコントロールに設定する

    Me.Image1.Picture = LoadPicture(filePath)
  'リストビューとラベルを隠す

    Me.lvDropImageHere.Visible = False

    Me.lblDropImageHere.Visible = False

End Sub
 

3. Imageコントロールに登録された画像をダブルクリックで開く機能を追加

下記のコードをImage1のDblClickイベントプロシージャーに貼り付けます。

Private Sub Image1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

    On Error GoTo ErrorHundler
    'ラベル(lblFilePath)に表示されているファイルのパスを参照する

    CreateObject("WScript.Shell").Run ("""" & Me.lblFilePath.Caption & """")

    Exit Sub

 ErrorHundler: MsgBox "File Not Found."
End Sub
 

4. 画像ファイルの保存フォルダをエクスプローラーで開いて、画像ファイルを選択する機能を追加

cmdOpen(Openボタン)のClickイベントプロシージャーに次のコードを貼り付けます。

Private Sub cmdFindFile_Click()

    Shell "C:\Windows\Explorer.exe /select, " & Me.lblFilePath.Caption, vbNormalFocus

End Sub

以上です。

私はデータベースと連携したマクロを組むことが多いです。画像をレコードと紐づける際は、画像の名前だけを保存し、画像は決められた特定のフォルダにコピーを置き、呼び出すときは、画像が保存してあるフォルダのパスと画像の名前を結合してImageコントロールに渡す方法を採っています。

追記

画像ファイルをネットワーク上に保存する場合は注意が必要です。

まず、エクスプローラで開く場合は、事前にPCのネットワークドライブを設定しておく必要があります。

また、クライアントPC1から画像ファイルを保存しているネットワークドライブを参照するときは(X:)、クライアントPC2からは(Y:)になどというように、クライアントPCごとにパスが変わってしまいます。ドライブ名を含む画像データの保存場所パスを各クライアントPCのレジストリ(又はワークシート上のどこか)に保存し、マクロ実行時にレジストリ(又はワークシート上のどこか)からドライブ名を取得するためのコーディングが必要です。

#ExcelVBA #DragDrop #画像 #ドラッグ #ドロップ #Listview