使用VBA遍历ActiveX标签

时间:2019-03-16 09:27:14

标签: excel vba ms-word activex

我有一个Word文档,其中包含多个顺序标签(目前为ActiveX控件,可以打开建议,请参见下图),分别标记为label1,label2等。

Using 'legacy' ActiveX control label

我想使用VBA使用来自excel的数据为这些标签加上标题。

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

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

我使用ActiveX控件的原因是因为本教程建议这样做。由于它们被称为“传统”,我想有更好的选择。

这是我当前的代码:

def func_a(link):
    request = requests.get(link)
    soup = bs4.BeautifulSoup(request.text, 'lxml')
    soup = soup.find('a', {'class': 'mva_item'})
    result = soup['href']
    return result

结束子

我大多数时候会遇到以下错误:

Method or data member not found error

我确实尝试过,但是没有用。

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

VBA ActiveX label in a sheet

2 个答案:

答案 0 :(得分: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 

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

答案 1 :(得分: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名称。

  • 甚至每个Excel按钮的标题都根据Excel工作表单元格引用进行了更改。

  • 我尝试了5个Label的示例,并且程序运行正常,如所附快照所示。我只是致力于使适当的语法起作用,并且可以对文档外观和布局的美学措施进行进一步的改进。

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