Worksheet_Change循环会导致 Excel 停止响应



我有一个VBA脚本,因此当单元格值为" N/A"时,它将一个单元格向右偏移并写入" N/A"。脚本有效,但会导致 Excel 停止响应。我希望每次更改单元格范围时它都这样做,所以我把它做了一个"Worksheet_Change"。我的想法(我可能而且可能是错的(是,它必须对工作表所做的每次更改都这样做,从而导致程序"烧坏"。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
Dim i As Long
Set rng = Range("E267:E1000")
For Each cell In rng
'test if cell is empty
If cell.Value = "N/A" Then
'write to adjacent cell
cell.Offset(0, 1).Value = "N/A"
End If
Next  
End Sub

如果要物理更改单元格,则可以定位要更改的单元格范围。 例如,每次您物理更改指定范围内的单元格时,都会启动以下代码。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub    ' this stops code error if more than one cell is changed at once
If Not Application.Intersect(Target, Me.Range("E267:E1000")) Is Nothing Then    ' indicates the Target range
If Target.Value = "N/A" Then
Target.Offset(, 1) = Target.Value
End If
End If
End Sub

如果您必须为此使用 VBA,您可以尝试此操作。在进行更改时禁用循环中的事件,以确保您不会陷入无限循环。此外,如果您的范围是动态的,我强烈建议将下限 (E1000( 替换为跟踪数据集中最后一行的动态变量,以最大程度地减少宏运行的循环次数。

例如,如果您的宏在工作表上,则可以将其用作范围的下限,然后set rng=Range("E267:E" & LROW)

Dim LROW as Long
LROW = Range("E" & Rows.Count).End(xlUp).Row 

宏观

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
Dim i As Long
Set rng = Range("E267:E1000")
For Each cell In rng
Application.Enable Events = False
'test if cell is empty
If cell.Value = "N/A" Then
'write to adjacent cell
cell.Offset(0, 1).Value = "N/A"
End If
Application.EnableEvents=True
Next  
End Sub

最新更新