Вы получите ошибку несоответствия типов в строке «Set ils», если InlineShape, на который ссылается InlineShapes (1), равен , а не MSForms.Label. Так что, возможно, ваш код работает с неправильной формой. Если InlineShapes (1) является MSForms.Label, это должно работать:
Dim ils As Word.InlineShape
Dim olef As Word.OLEFormat
Dim tb As MSForms.Label
Set ils = ActiveDocument.InlineShapes(1)
Set olef = ils.OLEFormat
Set tb = olef.Object
tb.Caption = ""
tb.BackColor = RGB(255, 255, 255)
Эта строка
tb = lbl_test
может делать что-то несколько отличное от того, что вы считать. Помещение
lbl_test.Caption = ""
после того, как оно предполагает, что вы пытаетесь создать ссылку на объект MSForms.Label, но я бы предположил, что lbl_test является строковой переменной (мы можем не вижу из предоставленного вами фрагмента). Если это так, попытка установить
lbl_test.Caption
также приведет к ошибке.
Что на самом деле делает
tb = lbl_test
, так это присвоение значению lbl_test значения по умолчанию член "объекта ТБ. Для объекта MSForms.Label членом по умолчанию является .Caption (вы можете посмотреть его в средстве просмотра объектов редактора VB), так что на самом деле эта строка должна устанавливать заголовок метки. Но лучше не полагаться на элементы по умолчанию и указывать их как
tb.Caption = lbl_test
Существует несколько способов получить доступ к элементам управления ActiveX на поверхности документа. Он есть, но вы также можете получить доступ к элементу управления непосредственно из ThisDocument, если вам известно его имя, например, через ThisDocument.Label1. Тогда вам на самом деле не нужно знать тип элемента управления.
Но в противном случае вам придется обращаться к InlineShape или Shape, как вы делаете. Поскольку разные элементы управления ActiveX имеют разные элементы (например, метка имеет заголовок, а TextBox - нет), вам лучше проверить тип объекта перед работой с ним, возможно, вот так ...
Dim ils As Word.InlineShape
Set ils = ActiveDocument.InlineShapes(1)
If Not (ils.OLEFormat Is Nothing) Then
With ils.OLEFormat
Select Case .ClassType
Case "Forms.Label.1"
' You don't even need to assign to an object variable
With .Object
.Caption = ""
.BackColor = RGB(255, 255, 255)
End With
Case "Forms.TextBox.1"
' do the appropriate thing
Case "Forms.CheckBox.1"
' do the appropriate thing
Case Else
' e.g. it might not be an ActiveX control
' perhaps do nothing
End Select
End With
End If