超出堆栈空间 – replace公式中的文本

我试图在公式中search一个特定的公式的一个片段,然后用一个新的片段replace它。 为了达到这个目的,我使用了下面的代码:

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时 ,代码将运行,然后以Error 28 – Out of Stack Space结束。 我单击确定,Excel崩溃并重新启动。 在恢复的文件中,文本的所有实例都已根据需要进行了replace。

所以在技术上,代码的工作原理,我只需要不要让Excel每次运行崩溃。 感谢您提供任何帮助!

您的代码正在recursion运行,触发事件级联。 就是说:每次你的代码访问工作表时,它都会自动closures。 通过将.EnableEvents应用程序属性设置为FalseTrue来避免它

https://msdn.microsoft.com/en-us/library/aa264523(v=vs.60).aspx

 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 

执行期间暂停各种环境设置。

 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 

您正在通过编写新的公式来重新触发事件macros,以暂时中止事件处理。 同样,不需要在循环中重新计算。 只有在所有的公式被改变之后。

如果可能的话,我会build议使用非易失性Excel公式,而不是使用每个值/公式更改都要调用的Change事件:

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

除了使表单变得比需要的更慢,反应更less之外,依赖于Change事件而不理解它可能会导致一些其他意外问题。 例如:由信任中心或用户阻止的macros,对范围或工作表名称的更改,以不允许VBA的格式(如.xlsx等)保存工作簿