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