使用VBA迭代ActiveX标签

问题描述 投票:0回答:2

我有一个word文档,其中包含几个顺序标签(目前是ActiveX控件,对建议开放,见下图),标记为label1,label2等。

Using 'legacy' ActiveX control label

我想使用VBA使用excel中的数据为这些标签添加标题。

到目前为止,我已经基于这篇文章的方法,但是想要添加一个循环来获得每个标签(我有大约40个)没有40行代码。

https://www.makeuseof.com/tag/integrate-excel-data-word-document/

我使用ActiveX控件的原因是因为教程建议了它。由于它们被称为“遗产”,我认为有更好的选择。

这是我目前的代码:

Private Sub LoadText1_Click()

Dim objExcel As New Excel.Application
Dim exWb As Excel.Workbook
Dim cnt As Integer

Set exWb = objExcel.Workbooks.Open("D:\...\content.xlsx")

For cnt = 1 To 40

    ThisDocument.ContentControls("label" & cnt).Caption = exWb.Sheets("Sheet1").Cells(cnt, 1)

    'Alternative methods tried:
    ThisDocument.OLEObjects("label" & cnt).Object.Caption = exWb.Sheets("Sheet1").Cells(cnt, 1)
    ThisDocument.Controls("label" & cnt).Caption = exWb.Sheets("Sheet1").Cells(cnt, 1)
    ThisDocument.Shapes("label" & cnt).OLEFormat.Caption = exWb.Sheets("Sheet1").Cells(cnt, 1)

Next cnt

exWb.Close

Set exWb = Nothing

结束子

我大部分时间都得到以下错误:

Method or data member not found error

我试过这个,但它没有用。

VBA: How to loop through labels (not on a userform)?

VBA ActiveX label in a sheet

excel vba ms-word activex
2个回答
0
投票

设置此程序时请注意以下几点。

  • Word VB Editor中的Tools-References包含对应于您的版本的Microsoft Excel对象库的引用。
  • 在程序设置期间可能会发生Excel实例未正确关闭然后Excel文件被锁定以进行编辑。您可以保存新版本的文件并在Word程序中进行相应的更改,也可以重新启动系统以保留相同的程序版本。
  • 以下用于循环的代码语法为我工作。将for loop限制为有限数量的字段的其他变体对我来说不起作用并且引起语法错误。如果您愿意,可以尝试其他变体。 For Each fld In ThisDocument.Fields fld.OLEFormat.Object.Caption = exWb.Sheets("Sheet1").Cells(i, 1) & exWb.Sheets("Sheet1").Cells(i, 2) i = i + 1 Next
  • 我使用Label1,Label2,Label3等序列保留Label名称。
  • 甚至Command按钮标题也会根据Excel工作表单元格引用进行更改。
  • 我尝试了5个标签样本,程序工作正常,可以从附加的快照中看到。我只是努力使正确的语法工作,并可以进一步改进文档外观和布局的美学措施。

iterate_activex_labels

  • 保存在expense2.docm文件中的示例代码适用于我: Private Sub CommandButton1_Click() Dim objExcel As New Excel.Application Dim fld As Field Dim exWb As Excel.Workbook Dim i As Integer Set exWb = objExcel.Workbooks.Open("C:\mydirb\expenses2.xlsx") 'Change path as per your requirement i = 2 For Each fld In ThisDocument.Fields fld.OLEFormat.Object.Caption = exWb.Sheets("Sheet1").Cells(i, 1) & exWb.Sheets("Sheet1").Cells(i, 2) i = i + 1 Next For Each fld In ThisDocument.Fields Debug.Print fld.OLEFormat.Object.Caption Next exWb.Close Set exWb = Nothing End Sub

0
投票

你可以尝试这样的东西来循环word文档中的ActiveX对象:

For Each AX_Controls In ActiveDocument.InlineShapes
    If AX_Controls.OLEFormat.ProgID = "Forms.Label.1" Then
       MsgBox  AX_Controls.OLEFormat.Object.Name
    End If
Next AX_Controls 

我在这里提供的示例打印出标签名称,但您可以将其作为示例,并尝试根据您的需要进行修改。

© www.soinside.com 2019 - 2024. All rights reserved.