vba - VBA Word:您可以将类、标签或名称分配给范围以独立于表格格式访问它们吗?
问题描述
我有一个必须在 VBA Word 中完成的项目。它具有针对不同库存项目的重复、动态生成的表。每个表都有访问表内数据以执行某些功能的宏按钮。
挑战在于代码非常依赖于布局。例如,要获取库存编号,我必须引用表中的特定单元格。如果表格布局发生变化,我必须重做很多代码。在 JavaScript 中,我将命名库存编号元素并使用以下内容访问它:
table.getElementsByName('inventoryNumber')[0].innerHTML
有没有像getElementsByName
, getElementsByTag
, 或者getElementsByClassName
我可以在 VBA Word 中使用的东西?我尝试使用书签,但我认为您不能在重复的表中使用相同的书签名称。
解决方案
实际上,书签名称在文档中必须是唯一的。一种可能是在每个表中使用不同的后缀。例如,库存项目的 ID。或者保留一个正在运行的计数器,可能与文档中的表格具有相同的索引号。
另一种可能性是使用内容控件。它们可以使用与文档中其他内容控件相同的 Title 和/或 Tag 属性。
因此,单个内容控件不能直接按名称访问,只能通过 Word 在插入它们时为其生成的 ID 号访问。按名称(或标签)寻址它们只能使用Document.SelectContentControlByTitle
or完成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
推荐阅读
- matplotlib - Matplotlib 生成的 PDF 中的绝对文本位置(用于文本的 figimage?)
- html - XPath:从最近的父节点中查找节点
- android - 为什么在 MaterialCardView 中设置 shapeAppearanceModel 会停止子剪辑?
- linux - 从 zip 文件中提取 200 行第一行并将此文件创建到不同的文件夹中
- git - 如何通过 git diff 命令仅获取已删除的行?
- c# - PDF 未下载 MVC dotnet core 3.1“无法下载”错误
- javascript - Navigator 中的“共享链接”在 Messenger 上不起作用
- c# - 在 docker 容器 C# App 之外连接被拒绝
- powershell - 带有 7zip 输出的 Powershell 调用命令
- python-3.x - 运行“make html”后,Sphinx Docs 不呈现样式/CSS