Vba 在循环中创建ActiveX标签

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

我正在尝试通过VBA自动创建标签

代码运行到

运行时错误91-对象变量或未设置块变量

我希望代码从label1(已经在Word中创建)运行到label24。 这些标签在Word中,并从Excel中获取数据

如果没有循环部分,代码将正常运行,因此问题是一致的

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转换到文档