超出堆栈空间 - 替换公式中的文本

时间:2017-03-03 17:44:11

标签: excel vba excel-vba

我正在尝试在公式中搜索特定的公式,然后用新的替换它。为此,我使用了以下代码:

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

从技术上讲,代码可以工作,我只需要在每次运行时都不会崩溃。感谢您提供的任何帮助!

3 个答案:

答案 0 :(得分:1)

您的代码以递归方式运行,触发事件级联。也就是说:每当您的代码访问工作表时,它就会再次激活。通过根据需要将.EnableEvents应用程序属性设置为FalseTrue来避免它

this

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等。