2012-12-13 28 views
26

ExcelシートでVBAコードを実行すると、Excelがクラッシュする際に問題が発生します。次のように 私はセルの範囲に数式を追加するためにいくつかのコードを持っている:vbaコードが実行されるとMS Excelがクラッシュする

Private Sub Worksheet_Change(ByVal Target As Range) 
    Worksheets("testpage").Range("A1:A8").Formula = "=B1+C1" 
End Sub 

このコードは、私が「エクセルで問題が発生したを終了する必要があります」というメッセージを取得し、閉じエクセル実行された場合。

私はworksheet_active()クラスでコードを実行した場合、それが正常に動作して

Private Sub Worksheet_Activate() 
    Worksheets("testpage").Range("A1:A8").Formula = "=B1+C1" 
End Sub 

をクラッシュしかし、私は実際にそれがworksheet_change()クラスで作業する必要はありません。

worksheet_change()クラスを使用すると誰もが同様のクラッシュを経験しましたが、誰でもこの問題を解決するために正しい方向を指すことができますか?

+0

クラス内のコードは「クラッシュ」しませんが、呼び出し側のコードではクラッシュしません。 「testpage」は存在しますか? –

+0

はい、それはWorksheet_Changeでコードを実行するとエラーが発生したように見えます – derek

+0

式を書き込むときに "testpage"シートの範囲( "A1:A8")がきれいですか?ピボットテーブルなど何もありません。また、興味があるだけに、ワークシート内のすべての変更後に同じ場所に同じ数式を書く必要があるのはなぜですか? –

答えて

58

ノート:私はこれをかなり頻繁にこのリンクに紹介していますので、これをWorksheet_Changeの1つのストップポストにします。時間がたつごとに、新しいコンテンツを追加して人々がそれに利益をもたらすことができるようにしています。


Worksheet_Change

  1. を使用したとき、私はいつもあなたがシート名を必要としない、これをお勧めします。コードが現在のシートで実行されることが理解されていますUNLESS参照として別のシートを使用しようとしています。 "testpage"はActivesheetの名前ですか、それとも別のシートですか?

  2. Worksheet_Changeイベントで作業しているときはいつでも。セルにデータを書き込む場合は、常にOffイベントを切り替えます。これは、コードが無限ループにならないようにするために必要です。

  3. イベントをオフにするたびにエラー処理を使用します。エラーが発生した場合は、次回は実行されません。

あなたはこのイベントでの作業時に知ってほしいことがあり、この

Private Sub Worksheet_Change(ByVal Target As Range) 
    On Error GoTo Whoa 

    Application.EnableEvents = False 

    Range("A1:A8").Formula = "=B1+C1" 

Letscontinue: 
    Application.EnableEvents = True 
    Exit Sub 
Whoa: 
    MsgBox Err.Description 
    Resume Letscontinue 
End Sub 

いくつか他のものを試してみてください。

あなたはTarget.Cells.CountがどのInteger値を返すためCountLargeが以降のExcel 2007で導入された

Private Sub Worksheet_Change(ByVal Target As Range) 
    '~~> For Excel 2003 
    If Target.Cells.Count > 1 Then Exit Sub 

    ' 
    '~~> Rest of code 
    ' 
End Sub 

小さなチェックを追加し、複数のセルが、その後変更されたときに、コードが実行されないようにしたい場合行/列が増えたためにExcel 2007でエラーが発生しました。 Target.Cells.CountLargeLongの値を返します。Intersectを使用し、特定の細胞の変化を検出するために、このコード

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim aCell As Range 

    For Each aCell In Target.Cells 
     With aCell 
      '~~> Do Something 
     End With 
    Next 
End Sub 

を使用する変更されたすべてのセルで動作するように

Private Sub Worksheet_Change(ByVal Target As Range) 
    '~~> For Excel 2007 
    If Target.Cells.CountLarge > 1 Then Exit Sub 
    ' 
    '~~> Rest of code 
    ' 
End Sub 

。変化は、細胞A1に発生した場合、例えば、その後、以下のコードは、再びIntersectを使用し、範囲の特定のセットの変化を検出する

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Range("A1")) Is Nothing Then 
     MsgBox "Cell A1 was changed" 
     '~~> Your code here 
    End If 
End Sub 

を起動します。変化範囲A1:A10で起こる場合、例えば、その後、以下のコードは、Excel VBAが機能しないクラッシュし

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Range("A1:A10")) Is Nothing Then 
     MsgBox "Cell in A1:A10 range was changed" 
     '~~> Your code here 
    End If 
End Sub 
+0

ありがとうSiddharth私はそれがどんなクラッシュもなく正常に働いたシート名を削除したとき – derek

+0

Gr8!私はあなたが上記のようにイベントをオフ/オンにしてほしいと思っていますか? –

+0

いいえ、私はそれをやる必要がありますか? – derek

11

起動します。
イベントは無効になっておらず、コールスタックはOnChangeイベントの無限ループによって満たされました。
このタイプのエラーを見つけるのに役立つ小さなアドバイス:イベントの最初の行にブレークポイントを設定し、F8キーを押しながら段階的に実行します。

関連する問題