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
将返回Nothing
, Nothing
没有Value
属性
工作版本可能是:
If Not Application.Intersect(Tx, Range(Target.Address)) Is Nothing And _ Tx.Value = "x" Then