ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何利用自定义的剪切和粘贴实现TreeView的节点移动?

如何利用自定义的剪切和粘贴实现TreeView的节点移动?

作者:绿色风 分类: 时间:2022-08-17 浏览:88
楼主
amulee
Q:如何利用自定义的剪切和粘贴实现TreeView的节点移动?
A:由于在VBA中,Treeview没了Drag方法,连鼠标的MouseUp事件也有问题。因而拖曳的方**有些问题,但是可以采取剪切和粘贴的方法移动节点。效果如动画:

 

参考代码如下:
  1. Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
  2. Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nindex As Long) As Long
  3. Private BlnCut As Boolean
  4. Private Nodex As Node        '源节点
  5. Private NodeD As Node        '目标节点
  6. Private PixX2TwipX As Double '像素转换成缇
  7. Private PixX2TwipY As Double
  8. Private Const LOGPIXELSX = 88
  9. Private Const LOGPIXELSY = 90
  10. '按下鼠标时显示右键菜单
  11. 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)
  12.     If Button = 2 Then
  13.         '非剪切状态,设定源节点
  14.         If Not BlnCut Then
  15.             Set Nodex = TreeView1.HitTest(x * PixX2TwipX, y * PixX2TwipY)
  16.             If Not Nodex Is Nothing Then
  17.                 Set TreeView1.DropHighlight = Nodex
  18.                 Application.CommandBars("右键菜单").Controls("粘贴").Enabled = False
  19.                 Application.CommandBars("右键菜单").ShowPopup   '显示菜单
  20.             End If
  21.         Else
  22.             '当前剪切状态,设定目标节点
  23.             Set NodeD = TreeView1.HitTest(x * PixX2TwipX, y * PixX2TwipY)
  24.             If Not NodeD Is Nothing Then
  25.                 Set TreeView1.DropHighlight = NodeD
  26.                 Application.CommandBars("右键菜单").Controls("粘贴").Enabled = True
  27.                 Application.CommandBars("右键菜单").ShowPopup   '显示菜单
  28.             End If
  29.         End If
  30.     End If
  31. End Sub
  32. ''初始化窗体
  33. Private Sub UserForm_Initialize()
  34.     Dim Dep1 As Node
  35.     Dim Dep2 As Node
  36.     Dim MyBar As CommandBar
  37.     Dim MyItem As CommandBarControl
  38.     Dim i As Long
  39.     Dim Arr
  40.    
  41.     '数据初始化
  42.     On Error Resume Next
  43.     Arr = Range("A2:C" & Range("A65536").End(xlUp).Row)
  44.     With TreeView1
  45.         For i = 1 To UBound(Arr)
  46.             Set Dep1 = .Nodes(Arr(i, 2))
  47.             If Err.Number <> 0 Then
  48.                 Err.Clear
  49.                 Set Dep1 = .Nodes.Add(Key:=Arr(i, 2), Text:=Arr(i, 2))
  50.             End If
  51.             Set Dep2 = .Nodes(Arr(i, 3))
  52.             If Err.Number <> 0 Then
  53.                 Err.Clear
  54.                 Set Dep2 = .Nodes.Add(relative:=Dep1, relationship:=tvwChild, Key:=Arr(i, 3), Text:=Arr(i, 3))
  55.             End If
  56.             .Nodes.Add relative:=Dep2, relationship:=tvwChild, Key:=i & Arr(i, 1), Text:=Arr(i, 1)
  57.         Next
  58.         Set Dep1 = .Nodes("人事")
  59.     End With
  60.     On Error GoTo 0
  61.     PixX2TwipX = Application.InchesToPoints(1) * 20 / GetDeviceCaps(GetDC(0), LOGPIXELSX)
  62.     PixX2TwipY = Application.InchesToPoints(1) * 20 / GetDeviceCaps(GetDC(0), LOGPIXELSY)
  63.   
  64.     '右键菜单的创建
  65.     '创建新的自定义快捷菜单,类型为临时
  66.     Set MyBar = Application.CommandBars.Add(Name:="右键菜单", _
  67.         Position:=msoBarPopup, Temporary:=True)
  68.         
  69.     '为自定义快捷菜单添加菜单项
  70.     Set MyItem = MyBar.Controls.Add(Type:=msoControlButton)
  71.     MyItem.Caption = "剪切"
  72.     MyItem.OnAction = "NodeCut"
  73.    
  74.     Set MyItem = MyBar.Controls.Add(Type:=msoControlButton)
  75.     MyItem.Caption = "粘贴"
  76.     MyItem.OnAction = "NodePaste"
  77.    
  78.     Set MyItem = Nothing
  79.     Set MyBar = Nothing
  80. End Sub
  81. '剪切
  82. Sub NodeCut()
  83.     BlnCut = True
  84.     Application.CommandBars("右键菜单").Controls("粘贴").Enabled = True
  85. End Sub
  86. '粘贴
  87. Sub NodePaste()
  88.     BlnCut = False
  89.     On Error Resume Next
  90.     Set Nodex.Parent = NodeD
  91. End Sub
  92. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  93.     Application.CommandBars("右键菜单").Delete
  94. End Sub



附件下载:
Treeview移动.rar
2楼
水星钓鱼
阿木VBA功力深厚
3楼
hhzjxss
哈哈,在这里找到阿木的代码了,学习一下先!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap