我是Excel VBA的新手。 我根据工作表上特定单元格的输入触发了几个宏。
我对前两个选项没有任何问题。 但每次我使用第三个选项,即Delete Row,&每当我编辑一个单元格或删除一个单元格时,我都会遇到错误。
代码如下:
Sub Worksheet_Change(ByVal Target As Range)
Set Target = ActiveCell
If Target.Value = "Fuel Supply" Then (<=Error At This Point)
Fuel_Heating_Value
ElseIf Target.Value = "Add Row" Then
Insert_New_Row
ElseIf Target.Value = "Delete Row" Then
Delete_Row
Else:
End If
End Sub
错误始终位于第一个选项语句中代码的第三行。
第三个选项代码如下:
Sub Delete_Row()
'
' Delete_Row Macro
'
Application.ScreenUpdating = False
ActiveCell.Select
ActiveCell.EntireRow.Select
Selection.Delete Shift:=xlUp
ActiveCell.Select
ActiveCell.Offset(-1, 12).Select
ActiveCell.Select
Selection.Copy
ActiveCell.Offset(1, 0).Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveCell.Offset(0, -11).Select
Application.ScreenUpdating = True
End Sub
任何有助于消除此问题的帮助都将受到赞赏。
感谢。
答案 0 :(得分:0)
您正在从Worksheet_Change事件宏中删除行,复制和粘贴单元格等。您不应该在不禁用事件的情况下从Worksheet_Change修改您所在的工作表,否则您执行的操作将触发另一个事件,并且Worksheet_Change将尝试在其自身上运行。
此外,我不知道该怎么做Set Target = ActiveCell
。触发Worksheet_Change时,它会传递一个或多个收到更改的单元格的地址。您的条件基于该目标。您不必将其设置为任何内容。但是,你应该防止有超过一个单元格作为目标;如果您尝试将一组单元格与单个文本字符串进行比较,则代码将引发错误。也许这就是错误发生的地方。您的条件都取决于Target是单个细胞。如果Target是多个单元格,我已经输出了退出代码,因为如果它是复数则继续是没有意义的。
Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
On Error GoTo bm_Safe_Exit
Application.EnableEvents = False
If Target.Value = "Fuel Supply" Then
Fuel_Heating_Value
ElseIf Target.Value = "Add Row" Then
Insert_New_Row
ElseIf Target.Value = "Delete Row" Then
Delete_Row
Else:
End If
bm_Safe_Exit:
Application.EnableEvents = True
End Sub
现在,如果Worksheet_Change导致工作表中发生任何变化,则不会在第一个事件上运行另一个事件。
Delete_Row
例程也可以改进,但它有助于叙述它想要完成什么。选择的单元格已经被选中,ActiveCell property被抛出相当多。
有关远离依赖选择和激活以实现目标的更多方法,请参阅How to avoid using Select in Excel VBA macros。