循环创建ActiveX标签

时间:2019-08-13 08:25:06

标签: vba controls label activex

我正在尝试通过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

2 个答案:

答案 0 :(得分:0)

您要声明变量UserForm1,但不要实例化它。此变量将阻止VBA运行时创建默认实例。删除此声明应解决此问题。

但是,您应该考虑阅读注释中提到的Rubberduck-article L8n 并重构代码,以使您不必依赖默认实例。也许创建表单对象并将其作为参数传递给子例程。

答案 1 :(得分:0)

问题已通过使用字段解决:

Dim fld As Field For Each fld In ThisDocument.Fields 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) fld.OLEFormat.Object.Caption = exWb.Sheets("Final").Cells(q, 7) & vbCrLf & exWb.Sheets("Final").Cells(q, 8) _ & vbCrLf & exWb.Sheets("Final").Cells(q, 10) & vbCrLf & exWb.Sheets("Final").Cells(q, 11)