首页 > 解决方案 > 尝试将选定树视图节点的文本复制到剪贴板,但只获取剪贴板中的最后一个节点

问题描述

我正在使用 excel/vba 创建树结构。节点前面有复选框。我正在使用递归函数来遍历节点并复制选定/选中节点的文本。我试图把它放在变量、excel 行、数组中,但我只得到最后选择的节点的文本。

下面是递归函数。

我将根节点传递给它。如何复制选定的项目?

Public Sub TraverseTree(objNode As Node)

    Dim objSiblingNode As Node
    Set objSiblingNode = objNode
    
   Do
        If objSiblingNode.Checked Then
        Debug.Print objSiblingNode.Text
        End If
        If Not objSiblingNode.Child Is Nothing Then
            Call TraverseTree(objSiblingNode.Child)
        End If
        Set objSiblingNode = objSiblingNode.Next
   Loop While Not objSiblingNode Is Nothing
   
End Sub

VBA 代码中定义的树节点

'Parent Nodes

TreeView1.Nodes.Add Key:="P1", Text:="Phone is down/blank screen"
TreeView1.Nodes.Add Key:="P2", Text:="phone is showing Configuring IP"
TreeView1.Nodes.Add Key:="P3", Text:="Phone stuck at registering"

'Child for P1

TreeView1.Nodes.Add "P1", tvwChild, "ch1", "Is the phone getting power?"

'Child for ch1

TreeView1.Nodes.Add "ch1", tvwChild, "ch1.1", "Yes"
TreeView1.Nodes.Add "ch1", tvwChild, "ch1.2", "No"

'Child for ch1.1

TreeView1.Nodes.Add "ch1.1", tvwChild, "ch1.1.1", "Do you see any buttons lit up, what are they?"

在此处输入图像描述

标签: excelvba

解决方案


所以,请尝试下一个场景:

  1. 在表单模块顶部声明一个Private Variable(在声明区域中):
    Private strWiew As String
  1. TraverseTree Sub将成为:
Private Sub TraverseTree(objNode As Node)
   Do
        If objNode.Checked Then
            If strWiew = "" Then
               strWiew = objNode.Text
            Else
               strWiew = strWiew & vbCrLf & vbTab & objNode.Text
            End If
        End If
        If Not objNode.Child Is Nothing Then
            Call TraverseTree(objNode.Child)
        End If
        Set objNode = objNode.Next
   Loop While Not objNode Is Nothing
End Sub
  1. 您需要将结果字符串放入剪贴板的函数:
    Dim clipboard As New MSForms.DataObject

    clipboard.SetText strNode
    clipboard.PutInClipboard
End Sub
  1. 您的Copy按钮Click事件将变为:
    Private Sub CommandButton1_Click()
     Dim objNode As Node
        
     Set objNode = TreeView1.Nodes("P1")
     strWiew = ""
     TraverseTree objNode
     CopyToClipboard strWiew
    End Sub
  1. 运行您的应用程序。检查您希望返回其文本的树节点并按下Copy按钮。打开记事本、写字板、Word(任何文本编辑器)并尝试Ctrl + V...

推荐阅读