2017-03-03 40 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一個格式等