首页 > 解决方案 > VBA Word:您可以将类、标签或名称分配给范围以独立于表格格式访问它们吗?

问题描述

我有一个必须在 VBA Word 中完成的项目。它具有针对不同库存项目的重复、动态生成的表。每个表都有访问表内数据以执行某些功能的宏按钮。

挑战在于代码非常依赖于布局。例如,要获取库存编号,我必须引用表中的特定单元格。如果表格布局发生变化,我必须重做很多代码。在 JavaScript 中,我将命名库存编号元素并使用以下内容访问它:

table.getElementsByName('inventoryNumber')[0].innerHTML

有没有像getElementsByName, getElementsByTag, 或者getElementsByClassName我可以在 VBA Word 中使用的东西?我尝试使用书签,但我认为您不能在重复的表中使用相同的书签名称。

标签: vbams-word

解决方案


实际上,书签名称在文档中必须是唯一的。一种可能是在每个表中使用不同的后缀。例如,库存项目的 ID。或者保留一个正在运行的计数器,可能与文档中的表格具有相同的索引号。

另一种可能性是使用内容控件。它们可以使用与文档中其他内容控件相同的 Title 和/或 Tag 属性。

因此,单个内容控件不能直接按名称访问,只能通过 Word 在插入它们时为其生成的 ID 号访问。按名称(或标签)寻址它们只能使用Document.SelectContentControlByTitleor完成Document.SelectContentControlByTag,它返回与标准匹配的所有内容控件的集合,类似于您提供的 JavaScript 示例。在这种情况下,这将是在单击宏按钮的表中识别内容控件的问题。例如:

Sub GetCCinSameTable1()
    Dim ccs As Word.Contentcontrols, cc As ContentControl
    Dim cName As String
    Dim tblRange As Word.Range

    Set tblRange = Selection.Tables(1).Range
    cName = "Test"
    Set ccs = ActiveDocument.SelectContentControlsByTitle(cName)
    For Each cc In ccs
        If cc.Range.InRange(tblRange) Then
            Debug.Print "Right cc!" & " " & cc.Range.Text
            Exit For
        End If
    Next
End Sub

另一种方法是获取单击宏按钮的表格并循环其中包含的所有内容控件,直到识别出正确的内容:

Sub GetCCinSameTable2()
    Dim ccs As Word.Contentcontrols, cc As ContentControl
    Dim cName As String
    Dim tblRange As Word.Range

    Set tblRange = Selection.Tables(1).Range
    cName = "X"
    Set ccs = tblRange.Contentcontrols
    For Each cc In ccs
        If cc.title = cName Then
            Debug.Print "Right cc!" & " " & cc.Range.Text
            Exit For
        End If
    Next
End Sub

推荐阅读