VBA – 不明原因的错误

我得到一个“对象variables或块方差没有设置”错误的原因,我不明白。 使用error handling程序,VBA代码似乎按预期工作。 我想解决这个错误,而不是跳过它。 任何人都可以指出哪里/为什么这个错误发生? 或者这个代码的任何其他build议? 任何帮助表示赞赏!

Private Sub Worksheet_Change(ByVal Target As Range) Dim Tx As Range Dim Rw As Variant On Error GoTo E_H 'If this error handler is not in effect, and an edit is ' made in column D, the error occurs. Set Tx = Range("E44") Set Rw = Rows("47") If Application.Intersect(Tx, Range(Target.Address)).Value = "x" Then Application.EnableEvents = False With Range("C45") .Value = "T - 10" End With With Range("C45").Characters(Start:=36, Length:=5).Font .Color = -16776961 End With With Range("I45") .Value = "T - 10 - LOS" End With Rw.Hidden = False With Range("B48") .Formula = "=B47+1" End With Sheets("DropDowns").Range("M6").Value = "65" Application.EnableEvents = True Else Application.EnableEvents = False With Range("C45") .Value = "25Ac" End With With Range("I45") .Value = "25Ac - LOS" End With Rw.Hidden = True With Range("B48") .Formula = "=B46+1" End With Sheets("DropDowns").Range("M6").Value = "64" Application.EnableEvents = True End If E_H: Application.EnableEvents = True Exit Sub End Sub 

问题似乎是在这一行。

 If Application.Intersect(Tx, Range(Target.Address)).Value = "x" Then 'better and more succinct as, If Application.Intersect(Tx, Target).Value = "x" Then 

您不知道Target是否与Range("E44")相交,但您正试图从交集中获取该值,而不确定是否实际上有任何值可以从中获取。

 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Range("E44"), Target) Is Nothing Then On Error GoTo E_H Application.EnableEvents = False If LCase(Range("E44").Value) = "x" Then With Range("C45") .Value = "T - 10" .Characters(Start:=36, Length:=5).Font.Color = -16776961 End With Range("I45") = "T - 10 - LOS" Range("B48").Formula = "=B47+1" Rows("47").EntireRow.Hidden = False Worksheets("DropDowns").Range("M6").Value = 65 Else Range("C45") = "I45" Range("I45") = "25Ac - LOS" Range("B48").Formula = "=B46+1" Rows("47").EntireRow.Hidden = True Worksheets("DropDowns").Range("M6").Value = 64 End If End If E_H: Application.EnableEvents = True End Sub 

我不知道我的逻辑stream程是否正确,但这是我最好的猜测。 如果E44改变,现在是一个x ,取消隐藏47行,调整公式等。如果E44改变,它不是一个x然后隐藏47行,调整公式等。

当Target不包含E44时,此行将引发错误:

  If Application.Intersect(Tx, Range(Target.Address)).Value = "x" Then 

Intersect将返回NothingNothing没有Value属性

工作版本可能是:

  If Not Application.Intersect(Tx, Range(Target.Address)) Is Nothing And _ Tx.Value = "x" Then