Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
TreeViewコントロールのドラッグ&ドロップについて
投稿日時: 19/10/24 22:03:20
投稿者: コレ

 TreeViewコントロールのノード間をドラッグ&ドロップで移動させるのに、ドロップ先のノードが取得できず困っています。
 下記コードでとりあえずドロップ先を取得しようとしましたが、HitTest(x, y)のxとyの座標が違うのかノードが取得できません。例えば、Aマグロをマグロの子ノードにしようとマグロにドラッグ&ドロップしても、魚の子ノードになってしまいます。また、AマグロをBマグロにドラッグ&ドロップしても、魚の子ノードになります。
 どなたかアドバイスをよろしくお願い致します。
 
Private mNode As Node
 
Private Sub TreeView1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As stdole.OLE_XPOS_PIXELS, ByVal y As stdole.OLE_YPOS_PIXELS)
     
    If Button = 1 Then
        Set mNode = Me.TreeView1.SelectedItem
    End If
     
End Sub
 
Private Sub TreeView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
     
    If Me.TreeView1.HitTest(x, y).Key <> "" Then
        Me.TreeView1.Nodes.Add relative:=Me.TreeView1.HitTest(x, y).Index, relationship:=tvwChild, Text:=mNode.Text
' Me.TreeView1.Nodes.Remove mNode.Index
    End If
     
End Sub
 
Private Sub TreeView1_OLEDragOver(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single, State As Integer)
     
    Me.Label1.Caption = Me.TreeView1.HitTest(x, y).Text
    DoEvents
 
End Sub
 
Private Sub UserForm_Initialize()
    Dim idx As Integer
    Dim idx2 As Integer
    Dim myNode As Node
     
    With Me.TreeView1
        .OLEDragMode = ccOLEDragAutomatic
        .OLEDropMode = ccOLEDropManual
        .Style = tvwTreelinesText
' .LineStyle = tvwRootLines
        With .Nodes
            idx = .Add(Key:="S", Text:="??").Index
            idx2 = .Add(relative:=idx, relationship:=tvwChild, Key:="A", Text:="?}?O??").Index
            idx2 = .Add(relative:=idx2, relationship:=tvwChild, Key:="B", Text:="?a?}?O??").Index
            idx = .Add(relative:=idx, relationship:=tvwChild, Key:="C", Text:="?`?}?O??").Index
        End With
    End With
     
    For Each myNode In Me.TreeView1.Nodes
        myNode.Expanded = True
    Next myNode
     
End Sub

投稿日時: 19/10/24 23:59:17
投稿者: コレ

 文字化けしていたので訂正します。
 

引用:

        With .Nodes
            idx = .Add(Key:="S", Text:="??").Index
            idx2 = .Add(relative:=idx, relationship:=tvwChild, Key:="A", Text:="?}?O??").Index
            idx2 = .Add(relative:=idx2, relationship:=tvwChild, Key:="B", Text:="?a?}?O??").Index
            idx = .Add(relative:=idx, relationship:=tvwChild, Key:="C", Text:="?`?}?O??").Index
        End With
    End With
      
End Sub

 
        With .Nodes
            idx = .Add(Key:="S", Text:="魚").Index
            idx2 = .Add(relative:=idx, relationship:=tvwChild, Key:="A", Text:="マグロ").Index
            idx2 = .Add(relative:=idx2, relationship:=tvwChild, Key:="B", Text:="Bマグロ").Index
            idx = .Add(relative:=idx, relationship:=tvwChild, Key:="C", Text:="Aマグロ").Index
        End With
[/quote]

回答
投稿日時: 19/10/25 18:26:41
投稿者: simple

事象確認しました。
>HitTest(x, y)のxとyの座標が違うのかノードが取得できません。
x,yは正常に取得されているように思いますが、
HitTestが機能不全を起こしているようですね。
残念ながらドラッグ&ドロップは使えないのではないかと思われます。

投稿日時: 19/10/26 23:53:18
投稿者: コレ

 返信遅くなりすみませんでした。
 
 同じ現象になるということで、ドラッグ&ドロップを別の方法で代用するしかない気がしてきました。
 ですが、xとy座標を調整すればできるのかと思い試行錯誤しているところです。
 
 もう少しアドバイスを待ってみることにします。

投稿日時: 19/11/07 00:18:44
投稿者: コレ

 いろいろな方法を試しましたが、ドラッグ&ドロップした先の座標が取得できませんでした。
ドラッグ&ドロップに代わる方法で考えたいと思います。
 
 ありがとうございました。