如果单元格A为空,则清除列B到F的内容

我有一个工作表,其值取决于单元格A.如果A列中的一行包含一个值,那么列B到H中的单元格将相应地更改。

如果列A的单元格为空,则要重置列D至F中的单元格。

我写下了下面的VBA代码

Private Sub Worksheet_Change(ByVal Target As Range) Dim n As Integer For n = 5 To 75 Application.EnableEvents = False If VarType(Cells(n, 1)) = vbEmpty Then Cells(n, 4).ClearContents Cells(n, 5).ClearContents Cells(n, 6).ClearContents Application.EnableEvents = True End If Next n End Sub 

“FOR”循环令人讨厌,并且在任何进入任何单元格之后让Excel暂停1秒或更长时间,任何人都可以帮助我纠正上面的代码,以便在没有“FOR”循环的情况下执行我所需的操作。

您正在使用一个Worksheet_Change事件,并且每次更改时都会迭代70行。这对于这类问题是一个坏的方法,这就是为什么会有延迟。

相反,尝试

 Private Sub Worksheet_Change(ByVal Target As Range) Dim n As Long If Target.Column = 1 Then If IsEmpty(Cells(Target.Row, 1)) Then Range("B" & Target.Row & ":F" & Target.Row).ClearContents End If End If End Sub 

这只会清除单元格,如果您从列A =>中删除一个值,当列A中的单元格为空时

尝试这个:

 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Integer If Mid(Target.Address(1, 1), 1, 2) = "$A" Then If Target.Cells(1, 1).Value = "" Then For i = 4 To 6 Target.Cells(1, i).Value = "" Next i End If End If End Sub 

试试这个:

 Private Sub Worksheet_Change(ByVal Target As Range) Dim rLook As Range, r As Range, Intr As Range Set rLook = Range("A5:A75") Set Intr = Intersect(rLook, Target) If Intr Is Nothing Then Exit Sub Application.EnableEvents = False For Each r In Intr If r.Value = "" Then rw = r.Row Range("D" & rw & ":F" & rw).ClearContents End If Next r Application.EnableEvents = True End Sub 

它应该对时间影响最小。

使用范围对象。 下面这行代码将打印我们将用来清除内容的Range的地址。 第一个单元格调用获取范围的左上angular,第二个单元格调用获取范围的右下angular。

 Private Sub test() Debug.Print Range(Cells(5, 4), Cells(75, 6)).Address End Sub 

我们把这个应用到你的代码中,像这样:

 Private Sub Worksheet_Change(ByVal Target As Range) If VarType(Cells(Target.Row, 1)) = vbEmpty Then Application.EnableEvents = False Range(Cells(Target.Row, 4), Cells(Target.Row, 6)).ClearContents Application.EnableEvents = True End If End Sub 

最后一个注意事项:即使发生错误,您也应该使用error handling程序来确保子项退出时始终启用事件。

 Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ErrHandler If VarType(Cells(Target.Row, 1)) = vbEmpty Then Application.EnableEvents = False Range(Cells(Target.Row, 4), Cells(Target.Row, 6)).ClearContents End If ExitSub: Application.EnableEvents = True Exit Sub ErrHandler: MsgBox "Oh Noes!", vbCritical Resume ExitSub End Sub 

在使用Change事件时,您应该禁用事件并迎合多个单元格。

 Private Sub Worksheet_Change(ByVal Target As Range) Dim rng1 As Range Dim rng2 As Range Set rng1 = Intersect(Columns("A"), Target) If rng1 Is Nothing Then Exit Sub With Application .EnableEvents = False .ScreenUpdating = False End With For Each rng2 In rng1.Cells If IsEmpty(rng2.Value) Then rng2.Offset(0, 1).Resize(1, 5).ClearContents Next With Application .EnableEvents = True .ScreenUpdating = True End With End Sub 

对于那些需要在一个单元格中input数据的情况(在列中),当另一列发生变化时,使用这个,这是对Gary的学生的修改。

 Private Sub Worksheet_Change(ByVal Target As Range) Dim rLook As Range, r As Range, Intr As Range Set rLook = Range("D:D") Set Intr = Intersect(rLook, Target) If Intr Is Nothing Then Exit Sub Application.EnableEvents = False For Each r In Intr If r.Value = "" Then rw = r.Row Range("L:L").ClearContents End If Next r Application.EnableEvents = True 

结束小组