我正在尝试在公式中搜索特定的公式,然后用新的替换它。为此,我使用了以下代码:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim i As Integer
If Range("B1").Value = "National" Then
For i = 1 To 135
Range("C" & i).Formula = Replace(Range("C" & i).Formula, "SUMIF('Site Data '!$CR:$CR,$B$1,", "SUM(")
Next i
End If
End Sub
当我将单元格B1中的值更改为 National 时,代码将运行,然后以错误28 - 超出堆栈空间完成。我单击确定,Excel崩溃并重新启动。在恢复的文件中,文本的所有实例都已根据需要进行了替换。
从技术上讲,代码可以工作,我只需要在每次运行时都不会崩溃。感谢您提供的任何帮助!
答案 0 :(得分:1)
您的代码以递归方式运行,触发事件级联。也就是说:每当您的代码访问工作表时,它就会再次激活。通过根据需要将.EnableEvents
应用程序属性设置为False
或True
来避免它
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim i As Integer
Application.EnableEvents = False
If Range("B1").Value = "National" Then
For i = 1 To 135
Range("C" & i).Formula = Replace(Range("C" & i).Formula, "SUMIF('Site Data '!$CR:$CR,$B$1,", "SUM(")
Next i
End If
Application.EnableEvents = True
End Sub
答案 1 :(得分:1)
执行期间暂停各种环境设置。
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Not Intersect(Target, Range("B1")) Is Nothing Then
On Error GoTo Safe_Exit
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Dim i As Long
If Range("B1").Value = "National" Then
For i = 1 To 135
Range("C" & i).Formula = Replace(Range("C" & i).Formula, "SUMIF('Site Data '!$CR:$CR,$B$1,", "SUM(")
Next i
End If
End If
Safe_Exit:
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
End Sub
您正在通过编写新公式来重新触发事件宏,以便临时暂停事件处理。同样,不需要在循环中重新计算;只有在所有公式都改变之后才会发生。
答案 2 :(得分:0)
如果可能的话,我建议使用非易失性Excel公式,而不是使用将为每个值/公式更改调用的Change事件:
= If( $B$1 = "National", SUMIF_formula, SUM_formula )
除了使工作表更慢且响应速度低于所需要之外,依赖于Change事件而不理解它可能会导致其他一些意想不到的问题。例如:信任中心或用户阻止的宏,更改范围或工作表名称,以不允许VBA的格式保存工作簿,如.xlsx等。