Vba 堆栈空间不足-替换公式中的文本

Vba 堆栈空间不足-替换公式中的文本,vba,excel,Vba,Excel,我试图在公式中搜索公式中的特定部分,然后用新部分替换它。为了实现这一点,我使用了以下代码: 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

我试图在公式中搜索公式中的特定部分,然后用新部分替换它。为了实现这一点,我使用了以下代码:

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崩溃并重新启动。在恢复的文件中,文本的所有实例都已根据需要替换


所以从技术上讲,代码是有效的,我只需要不让Excel在每次运行时崩溃。感谢您提供的任何帮助

您的代码以递归方式运行,触发事件级联。也就是说:每次代码访问工作表时,它都会再次触发自身。根据需要将
.EnableEvents
应用程序属性设置为
False
True
,以避免出现这种情况


在执行期间挂起各种环境设置

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

您正在通过写入新公式重新触发事件宏,因此暂时挂起事件处理。类似地,不需要在循环中重新计算;只有在所有公式都已更改之后。

如果可能,我建议使用非易失性Excel公式,而不是使用每次值/公式更改都将调用的更改事件:

= If( $B$1 = "National", SUMIF_formula, SUM_formula ) 

除了使工作表变得比需要的慢和响应性差之外,在不了解更改事件的情况下依赖更改事件还可能导致其他一些意外问题。例如:受信任中心或用户阻止的宏、范围或工作表名称的更改、以不允许VBA(如.xlsx等)的格式保存工作簿。

关闭计算和事件处理。通过更改单元格中的公式,您正在自力更生地运行。当整个工作表中的任何内容发生更改时,您肯定不希望运行/重新运行此操作。这应该在什么条件下触发?哎哟!谢谢你抓住了!这似乎只是一起禁用了代码。我需要的代码运行任何时候B1的变化,并停止运行后,它达到C135。对不起,我没有注意,并没有意识到我的宏被禁用。一旦我在启用它们的情况下测试代码,我将向您报告。编辑:它就像一个符咒。谢谢你的帮助!
= If( $B$1 = "National", SUMIF_formula, SUM_formula )