Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 尝试将选定treeview节点的文本复制到剪贴板,但仅获取剪贴板中的最后一个节点_Excel_Vba - Fatal编程技术网

Excel 尝试将选定treeview节点的文本复制到剪贴板,但仅获取剪贴板中的最后一个节点

Excel 尝试将选定treeview节点的文本复制到剪贴板,但仅获取剪贴板中的最后一个节点,excel,vba,Excel,Vba,我正在使用excel/vba创建树结构。节点前面有复选框。我使用递归函数遍历节点并复制选定/选中节点的文本。我试图把它放在变量、excel行、数组中,但我只得到最后一个选定节点的文本 下面是递归函数 我正在将根节点传递给它。如何复制所选项目 Public Sub TraverseTree(objNode As Node) Dim objSiblingNode As Node Set objSiblingNode = objNode Do If o

我正在使用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?"

因此,请尝试下一个场景:

  • 在表单模块顶部(声明区域中)声明一个
    私有变量
  • 您的
    TraverseTree
    Sub
    将成为:
  • 您需要函数将结果字符串放入剪贴板:
  • 您的
    复制
    按钮
    单击
    事件将变为:
  • 运行应用程序。检查要返回文本的树节点,然后按
    Copy
    按钮。打开记事本、写字板、Word(任何文本编辑器)并尝试
    Ctrl+V

  • 你能编辑你的文章并分享(至少一张照片)你的工作表吗?当然。我会的。excel表中没有任何内容。一切都是在VBA代码中定义的。父母,孩子都没有在纸上,没有必要给我们看。。。但是,为了让上述代码返回节点子节点,它是如何在VBA中构建的?整个树结构是在Private Sub UserForm_Initialize()下定义的。在这种情况下,您必须在
    TreeView1.Nodes
    之间迭代,并检索您要查找的节点的文本值,当存在匹配项时,它会起作用,但也只是将一行(并非所有选定节点)添加到剪贴板上,这是最后一个选定节点的文本。我尝试了dataobject,但没有在函数中使用。@Munish Saxena:当然,只有一个节点。一次一个。。。事实上,你能展示(在一张图片中,如果不是可编辑的),你真正需要什么吗?是否希望字符串保留分析的节点文本及其所有子节点?最终用前面的
    选项卡表达?如果是,则必须构建并返回…是的,我希望将所有选中节点的文本从根节点到结束节点保存在剪贴板中。我可以和你们分享这张照片。。如果需要,我可以发送excel文件。我如何直接发送给你。@Munish Saxena:使用我的个人邮件(在我的个人资料中)。但请尝试解释/展示您希望字符串的外观。@Munish Saxena:或者使用传输站点并将链接放在这里。是一个可靠的网站,易于使用。。。
    
        Private strWiew As String
    
    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
    
        Dim clipboard As New MSForms.DataObject
    
        clipboard.SetText strNode
        clipboard.PutInClipboard
    End Sub
    
        Private Sub CommandButton1_Click()
         Dim objNode As Node
            
         Set objNode = TreeView1.Nodes("P1")
         strWiew = ""
         TraverseTree objNode
         CopyToClipboard strWiew
        End Sub