2017-03-03 11 views
1

特定の数式内の数式内を検索し、新しい数式に置き換えようとしています。スタック領域の不足 - 私は国立、コードが実行にセルB1の値を変更して、エラー28で終了するとスタックの空き領域 - 式内のテキストを置換する

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 

:これを達成するために、私は次のコードを使用しています。 [OK]をクリックすると、Excelがクラッシュして再起動します。復元されたファイルでは、テキストのすべてのインスタンスが必要に応じて置き換えられました。

技術的にはコードが機能するので、実行するたびにExcelのクラッシュが発生しないようにするだけです。ご提供いただけるお手伝いをありがとうございます!

+1

計算とイベントの処理をオフにします。あなたは、セル内の数式を変更することによって、あなた自身の上を走っています。 – Jeeped

+1

確かに、ワークシート全体の中の何かが変更されたときにはいつでも、これを実行/再実行する必要はありません。これをどのような条件で引き起こすべきですか? – Jeeped

答えて

1

コードは再帰的に実行され、イベントカスケードをトリガします。つまり、コードがワークシートにアクセスするたびに、再度コードが実行されます。必要に応じて、実行中のさまざまな環境設定をサスペンド

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

FalseまたはTrue.EnableEventsアプリケーションプロパティを設定することにより、それを避けてください。

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

それをキャッチするためにありがとう! – Jeeped

0

代わりに、すべての値/式の変更のために呼び出されますChangeイベントを使用しての、私は可能な場合は代わりに、不揮発性Excelの数式を使用することをお勧めします:シートが遅く、あまりすることに加えて

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

必要以上に反応し、それを理解せずにChangeイベントに頼ると、他の予期しない問題が発生する可能性があります。例:Trust Centerまたはユーザーによってブロックされたマクロ、範囲またはシート名の変更、.xlsxなどのVBAを許可しない形式でのブックの保存

関連する問題