HOME > 即効テクニック > Excel VBA > その他関連のテクニック > ドラッグ&ドロップ−ListBox⇒ListBox

即効テクニック

その他関連のテクニック

ドラッグ&ドロップ−ListBox⇒ListBox

(Excel 97/2000)
サンプルでは2つのリストボックスを用意し、あらかじめリスト項目が設定されているリストボックスから他方のリストボックスへ項目をコピーします。
ドラッグ&ドロップにはDataObjectと関連するイベント処理が重要です。
併せてヘルプもご確認ください。

(前提)ListBox2個(ListBox1,ListBox2)
  ※下記コードをそのまま貼り付けて実行したときにコンパイルエラーが
    発生する場合、必要なイベントプロシージャの中身だけをコピーする
    用にして下さい。
'○ユーザフォーム初期化イベント
Private Sub UserForm_Initialize()
ListBox1.List = _
    Array("Excel", "Access", "PPT", "Outlook")
End Sub

'○リストボックス1のマウス移動時イベント(ドラッグ開始)
Private Sub ListBox1_MouseMove _
    (ByVal Button As Integer, ByVal Shift As Integer, _
    ByVal X As Single, ByVal Y As Single)
Dim D As DataObject
'マウス左ボタンのドラッグ時に対応
If Button <> 1 Then Exit Sub
'データオブジェクトに現在の選択地を格納
Set D = New DataObject
D.SetText ListBox1.Value
D.StartDrag 'ドラッグ開始

End Sub

'○リストボックス2へのドラッグ(In)
Private Sub ListBox2_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)
'二番目のリストボックスにマウスが入った時のイベント
'Cancel=TrueでDrag&Drop継続
Cancel = True

End Sub

'○リストボックス2へのドロップ
Private Sub ListBox2_BeforeDropOrPaste _
        (ByVal Cancel As MSForms.ReturnBoolean, _
        ByVal Action As MSForms.fmAction, _
        ByVal Data As MSForms.DataObject, ByVal X As Single, _
        ByVal Y As Single, ByVal Effect As MSForms.ReturnEffect, _
        ByVal Shift As Integer)

'ドラッグ時のみドラッグされたデータをリスト項目に追加
If Action = fmActionDragDrop Then _
    ListBox2.AddItem Data.GetText
Data.Clear'DataObjectのデータクリア

End Sub