2017-03-03 36 views
1

我想在公式中搜索特定的一块公式,然后用一块新的替换替换文本。要做到这一点,我用下面的代码:的堆栈空间 - 在公式中

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单元格的值更改为国家,代码运行,然后用错误28完成 - 的堆栈空间。我点击确定,Excel崩溃并重新启动。在恢复的文件中,文本的所有实例都根据需要进行了替换。

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

+1

打开计算和事件处理关闭。您正在通过更改单元格中的公式来运行自己的顶部。 – Jeeped

+1

当整个工作表中的任何内容发生变化时,您肯定不希望运行/重新运行此操作。应该触发什么条件? – Jeeped

回答

1

您的代码运行递归,触发事件级联。那就是:每次你的代码访问工作表时,它都会自动关闭。由.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 
+0

这似乎只是将代码全部禁用。我需要代码在任何时间运行B1更改并在达到C135后停止运行。 –

+0

对不起,我没有注意,并没有意识到我的宏被禁用。一旦我测试了代码并将它们启用,我会报告回来。编辑:它像一个魅力。谢谢你的帮助! –

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 

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

+0

Ooopps!感谢您的支持! – Jeeped

0

而不是使用其将被称为用于每个值/式变化的变化事件时,我建议使用非易失性Excel公式代替如果可能的:

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

除了使薄片更慢和更小无需理解就依赖于Change事件可能会导致一些其他意外问题。例如:已被信任中心或由用户宏,更改范围或表名称,保存工作簿中不允许VBA如.XLSX一个格式等