|
▼亜矢 さん:
>>参考リンクだけですけど、
>>
>>mougの即効テクニックに こんなのがあります。
>>■ドラッグ&ドロップ−ListBox⇒ListBox
>>ht tp://www.moug.net/tech/exvba/0150045.html
> 上記の2点はすでにチェック済みでした。
> 結局Listboxが1列だけが取得されています。
> 今考えているのは10列のリストボックスでリストボックスで行を選択したときに
> その10列そのものが移動してほしいことなのです。
そういうことでしたか、それは失礼しました。
いま問題になっていることは主として2つの点だと思います。
1. 1列目だけでなく、10列一括して移動したい。
2. ドロップした位置に挿入したい
そこで、(きょうはちょっと時間がないので)
1.のほうだけ
mougの参考ページをアレンジしながら、
ListBox1から 任意のアイテムを ListBox2 の先頭アイテムに
追加する 処理だけ、編集してみます。
修正内容は
DataObjectにクリップするとき、列データをTABコードを
区切り記号として連結した文字列を送り、
ListBox2でドロップするとき、 DataObjectの文字列を
TABで列に分解して 0番アイテムに挿入する。
ということです。
Private Sub UserForm_Initialize()
With ListBox1
.List = Range("A1:D10").Value
.ColumnCount = 4
.ColumnWidths = "20;20;20;20"
End With
With ListBox2
.List = Range("A11:D26").Value
.ColumnCount = 4
.ColumnWidths = "20;20;20;20"
End With
End Sub
'○リストボックス1のマウス移動時イベント(ドラッグ開始)
Private Sub ListBox1_MouseMove _
(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
'マウス左ボタンのドラッグ時に対応
If Button <> 1 Then Exit Sub
'データオブジェクトに現在の選択地を格納
Dim i As Long
With ListBox1
ReDim ss(.ColumnCount - 1)
For i = 0 To .ColumnCount - 1
ss(i) = .List(.ListIndex, i)
Next
End With
With New DataObject
.SetText Join(ss, vbTab)
.StartDrag 'ドラッグ開始
End With
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)
Dim ss
Dim i As Long
Dim NewIndex As Long
'ドラッグ時のみドラッグされたデータをリスト項目に追加
If Action = fmActionDragDrop Then
ss = Split(Data.GetText(), vbTab)
With ListBox2
.AddItem ss(0), NewIndex
For i = 1 To UBound(ss)
.List(NewIndex, i) = ss(i)
Next
.TopIndex = 0
End With
End If
Data.Clear 'DataObjectのデータクリア
End Sub
ListBox2でマウスをドロップした位置へ AddItem する方法は
ListBox2のうえを MouseMove するとき X,Y座標が得られますので、
それを「一行の行間を含む高さ」で除してやれば .ListIndex が
得られるので、これを使います。
|
|