【问题标题】:VBA Error - Object variable or with block variable not set in Worksheet EventVBA 错误 - 工作表事件中未设置对象变量或块变量
【发布时间】:2019-02-08 10:25:20
【问题描述】:

我设置了一个宏来向图表添加框并将它们链接到另外两个工作表中的表格。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'Declare and assign values to sh1 and sh2
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Set sh1 = ActiveWorkbook.Sheets("Training Master")
Set sh2 = ActiveWorkbook.Sheets("Attendance Master")




'Declare and assign values to sp1 and sp2
Dim sp1 As Range
Dim sp2 As Range
Set sp1 = sh1.Range("C:C").Find("2nd Process")
Set sp2 = sh2.Range("C:C").Find("2nd Process")

'Adds boxes to organizational chart
Target.Borders(xlEdgeBottom).LineStyle = xlDouble
Target.Borders(xlEdgeLeft).LineStyle = xlDouble
Target.Borders(xlEdgeRight).LineStyle = xlDouble
Target.Borders(xlEdgeTop).LineStyle = xlDouble
Target.Offset(1).Borders(xlEdgeBottom).LineStyle = xlDouble
Target.Offset(1).Borders(xlEdgeLeft).LineStyle = xlDouble
Target.Offset(1).Borders(xlEdgeRight).LineStyle = xlDouble
Target.Interior.ColorIndex = 45
Target.Font.ColorIndex = 3

'Adds line to table in Training Master, links appropriate cells to 
organizational chart
sp1.Offset(0, -2).Resize(1, 19).Insert
sp1.Offset(-2, -1).Copy sp1.Offset(-1, -1)
sp1.Offset(-2, 9).Copy sp1.Offset(-1, 9)

'Adds line to table in Attendance Master, returns error 91
sp2.Resize(1, 7).Insert 'Debug identifies this line as error 91
sp2.Offset(-2).Copy sp2.Offset(-1)

End Sub

似乎每个变量都被分配了一个值,并且我已经两次和三次检查工作表名称的拼写是否与代码中的引用匹配。为什么我会得到:

错误 91 对象变量或未设置块变量

【问题讨论】:

  • 哪一行?可能没有找到您的搜索字词。
  • 查看代码中的 cmets,倒数第四行。
  • 所以sp2 什么都没有,因此出现错误。
  • 如果你以sh1 开头,我强烈建议你使用有意义的变量名,你很快就会以sh23 结尾并迷失方向。你为什么不直接使用wsTrainingwsAttendance 呢?你的代码真的会从中受益,你可以更容易理解自己的代码,更容易维护,从而减少错误。

标签: excel vba


【解决方案1】:

使用Range.Find method后总是测试查找是否成功:

Set sp1 = sh1.Range("C:C").Find("2nd Process")

If sp1 Is Nothing Then
    MsgBox "2nd Process was not found in " & sh1.Name
    Exit Sub
End If

我强烈建议始终为 find 方法指定 LookAt 参数:

  • Find(What:="2nd Process", LookAt:=xlWhole) 查找整个单元格值,
  • Find(What:="2nd Process", LookAt:=xlPart) 查找单元格值的一部分。

如果您不指定LookAt 参数,Excel 将使用 VBA 或手动使用 find 最后使用的那个。因此,如果您不指定它,您将永远不知道 Excel 使用的是哪一个。

【讨论】:

  • 谢谢。现在我必须弄清楚为什么 Find() 不起作用。 "2nd Process" 在我的工作表上的 Range("C:C") 中肯定出现了好几次。
  • @ThomasMarkov 看看我的编辑。可能是这样,或者您必须指定其他参数(另请参阅我提供的文档链接)。特别是MatchCaseLookIn 参数可能也很重要,应该指定。
  • “Training Master”和“Attendance Master”中的 C 列是相同的,并且 find 函数与 sp1 变量一起工作得很好。当然,如果我使用相同的代码,我会怀疑它对 sp2 工作得很好。有什么理由可以区别对待这些?
  • 任何额外的空格或区分大小写都可能导致差异。您为 find 方法指定了哪个参数?
【解决方案2】:

出现错误是因为如果sp1 什么都不是,Offest 会失败。将您的代码更改为此代码以检查它是否为“某事”并采取相应措施:

'Adds line to table in Training Master, links appropriate cells to
    MsgBox sp1 Is Nothing
If Not sp1 Is Nothing Then
    MsgBox sp1.Address
    sp1.Offset(0, -2).Resize(1, 19).Insert
    sp1.Offset(-2, -1).Copy sp1.Offset(-1, -1)
    sp1.Offset(-2, 9).Copy sp1.Offset(-1, 9)
End If

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多