Элементы управления содержимым Word не могут быть получены с использованием строки в качестве значения индекса, как это могут делать другие вещи.Следующая строка из примера кода в вопросе не может работать:
.ContentControls(controlThis & " cats").Range.Text = eval.ActiveSheet.Cells(5, 4)
Единственное допустимое значение индекса для ContentControl - ID
, то есть длинный номер (GUID), назначенный приложением Wordкогда генерируется ContentControl.
Причина этого заключается в том, что более одного элемента управления контентом могут иметь одинаковые Title
(имя) и / или Tag
.Поскольку эта информация не является уникальной, ее нельзя использовать для получения одного элемента управления содержимым.
Вместо этого код должен использовать Document.SelectContentControlsByTitle
или Document.SelectContentControlsByTag
.Они возвращают набор элементов управления контентом, которые соответствуют указанному критерию.Например:
Dim cc as Word.ContentControls ' As Object if late-binding is used
With objWord.ActiveDocument
Set cc = .SelectContentControlsByTitle(controlThis & " cats")
'Now loop all the content controls in the collection to work with individual ones
End With
Если есть уверенность, что есть только один элемент управления содержимым с Title
, или требуется только первый, тогда можно сделать это:
Dim cc as Word.ContentControl ' As Object if late-binding is used
With objWord.ActiveDocument
Set cc = .SelectContentControlsByTitle(controlThis & " cats").Item(1)
cc.Range.Text = eval.ActiveSheet.Cells(5, 4)
End With
Совет 1: Использование ActiveDocument
не считается хорошей практикой для Word.Как и в случае ActiveCell
(или чего-либо еще) в Excel, нет уверенности в том, что «активная» вещь - это та, которой следует манипулировать.Более надежным является использование объекта, который в этом случае может быть назначен непосредственно открываемому документу.Основываясь на коде в вопросе:
Dim wdDoc as Object 'Word.Document
Set wdDoc = objWord.Documents.Open(FileName:="myFilePath\Myfile.docx", noencodingdialog:=True)
With wdDoc 'instead of objWord.ActiveDocument
Совет 2. Поскольку код в вопросе предназначен для нескольких элементов управления контентом, а не для объявления нескольких объектов управления контентом, может быть более эффективно поместить заголовки и значения вмассив и цикл, что.