Итерация по метке ActiveX с помощью VBA - PullRequest
0 голосов
/ 16 марта 2019

У меня есть текстовый документ, содержащий несколько последовательных меток (на данный момент элементы управления 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

End Sub

Большую часть времени я получаю следующую ошибку:

Method or data member not found error

Я попробовал это, но это не сработало.

VBA: Как перебирать метки (не в пользовательской форме)?

метка VBA ActiveX на листе

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Обратите внимание на следующие моменты при настройке этой программы.

  • 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 и т. Д.

  • Даже заголовки кнопок команд изменены в соответствии с ссылками на ячейки листа Excel.

  • Я опробовал образец из 5 ярлыков, и программа отлично работает, как видно из прилагаемого снимка. Я работал только над созданием правильного синтаксиса, и дальнейшие улучшения могут быть сделаны для внешнего вида документа и эстетических мер для макета.

iterate_activex_labels

  • Этот пример кода, сохраненного в файле cost2.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 голосов
/ 16 марта 2019

Вы можете попробовать что-то вроде этого, чтобы перебрать объекты ActiveX в документе word:

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 

В приведенном мною примере напечатано имя метки, но вы можете взять его в качестве примера и попробоватьизменить его в соответствии с вашими потребностями.

...