Vba 在循环中创建ActiveX标签
我正在尝试通过VBA自动创建标签 代码运行到 运行时错误91-对象变量或未设置块变量 我希望代码从label1(已经在Word中创建)运行到label24。 这些标签在Word中,并从Excel中获取数据 如果没有循环部分,代码将正常运行,因此问题是一致的Vba 在循环中创建ActiveX标签,vba,controls,label,activex,Vba,Controls,Label,Activex,我正在尝试通过VBA自动创建标签 代码运行到 运行时错误91-对象变量或未设置块变量 我希望代码从label1(已经在Word中创建)运行到label24。 这些标签在Word中,并从Excel中获取数据 如果没有循环部分,代码将正常运行,因此问题是一致的 UserForm1.Controls(“Label”&i)。Caption= 当切换到以下代码时,宏将正常运行: ThisDocument.Label1.Caption= 我在模块部分做这个 Sub CreateLabels() Dim e
UserForm1.Controls(“Label”&i)。Caption=
当切换到以下代码时,宏将正常运行:
ThisDocument.Label1.Caption=
我在模块部分做这个
Sub CreateLabels()
Dim exWb As Object
Set exWb = CreateObject("Excel.Application")
exWb.Workbooks.Open ("C:\Users\xxxx")
Dim i As Integer
Dim UserForm1 As Object
For i = 1 To 24
If exWb.Sheets("Final").Range("I2").Value = _
"" And exWb.Sheets("Final").Range("F2").Value = "" Then
'do not put I2 and F2 values if they are missing
' (as it creates blank row in the label)
UserForm1.Controls("Label" & i).Caption = _
exWb.Sheets("Final").Cells(2, 7) & vbCrLf & _
exWb.Sheets("Final").Cells(2, 8) & vbCrLf & _
exWb.Sheets("Final").Cells(2, 10) & vbCrLf & _
exWb.Sheets("Final").Cells(2, 11)
ElseIf exWb.Sheets("Final").Range("I2").Value = "" Then
UserForm1.Controls("Label" & i).Caption = _
exWb.Sheets("Final").Cells(2, 7) & vbCrLf & _
exWb.Sheets("Final").Cells(2, 6) & vbCrLf & _
exWb.Sheets("Final").Cells(2, 8) & vbCrLf & _
exWb.Sheets("Final").Cells(2, 10) & vbCrLf & _
exWb.Sheets("Final").Cells(2, 11)
ElseIf exWb.Sheets("Final").Range("F2").Value = "" Then
UserForm1.Controls("Label" & i).Caption = _
exWb.Sheets("Final").Cells(2, 7) & vbCrLf & _
exWb.Sheets("Final").Cells(2, 8) & vbCrLf & _
exWb.Sheets("Final").Cells(2, 9) & vbCrLf & _
exWb.Sheets("Final").Cells(2, 10) & vbCrLf & _
exWb.Sheets("Final").Cells(2, 11)
Else: UserForm1.Controls("Label" & i).Caption = _
exWb.Sheets("Final").Cells(2, 7) & vbCrLf & _
exWb.Sheets("Final").Cells(2, 6) & vbCrLf & _
exWb.Sheets("Final").Cells(2, 8) & vbCrLf & _
exWb.Sheets("Final").Cells(2, 9) & vbCrLf & _
exWb.Sheets("Final").Cells(2, 10) & vbCrLf & _
exWb.Sheets("Final").Cells(2, 11)
End If
Next i
Set exWb = Nothing
End Sub
您正在声明一个变量
UserForm1
,但不实例化它。此变量将阻止VBA运行时创建默认实例。删除此声明将修复此问题
但是,你应该考虑阅读评论中提到的RubBurk文章L8N,并重构代码,这样你就不依赖默认实例。可以创建表单对象并将其作为参数传递给子例程。
问题已通过使用字段解决:Dim fld As字段
对于此文档中的每个fld。字段
如果exWb.Sheets(“最终”)范围(“I2”).Value=”“和exWb.Sheets(“最终”)范围(“F2”).Value=”“,则
'如果缺少I2和F2值,请不要放置它们(因为它会在标签中创建空白行)
fld.OLEFormat.Object.Caption=exWb.Sheets(“最终”)单元格(q,7)和vbCrLf
&exWb表格(“最终”)单元格(q,8)_
&vbCrLf和exWb表(“最终”)单元格(q、10)和vbCrLf&
exWb.Sheets(“Final”).Cells(q,11)
不是问题的解决方案,但您确实不应该使用Userform的默认实例。这里有一个很好的解释:另外,当代码失败时,i的值是多少?仅仅因为它与Label1
一起工作并不意味着从1到24都有可用的标签。更好的方法是正确地命名标签,即使最初的工作成本更高,但最终会得到回报。我经常在公共模块中使用函数将Excel单元格/带标签的行映射到特定的值/名称,这样可以很容易地扩展列表并快速识别错误。如果ActiveX部分位于页面本身,请检查如何在页面上获取ActiveX元素的集合。InlineShapes可能是一种方法。i=1的值,因此它应该能够正常工作,因为它会生成Label1,正如您所说,Label1是word文档页面上activex标签的标签名。我刚刚用.inlineshapes尝试过,但是我没有看到任何属性如何在那里插入文本。谢谢你的回答,但是由于我是VBA新手,我不知道如何“创建表单对象并将其作为参数传递给子例程”。我已经在文档本身上创建了作为activeX部件的标签,我没有在vba中创建它作为用户表单-我认为这是正确的方法,但我不知道如何将它们从vba转换到文档