2016-07-18 25 views
1

Worksheet_Calculate()Worksheet_Change(ByVal Target As Range)を含むVBAコードがあります。再計算が行われるときにいくつかのセルを更新する必要があります。 。これらのサブルーチンは、まったく同じサブルーチンを呼び出します。ただし、両方がまったく同じ関数を呼び出すにもかかわらず、それらのうちの1つは正しく(Worksheet_Change)動作し、もう1つ(Worksheet_Calculate)は動作しません。Excel/VBAコードをステップ実行して正常に実行すると動作が異なる

私が取った次のステップは、再計算が行われたときに問題が発生したと思われる場所にブレークポイントを設定することでした。そして、驚いたことに、Worksheet_Calculate()によって実行されたコードが正しく動作しましたブレークポイントなど)。さらに、通常のモード(デバッグではない)でも正常に動作することがありますが、これは非常にランダムです。私は何が起こっているのか分かりません。

Private Sub Worksheet_Calculate() 

    MakeVisible 
    UpdateBaseline 

    If ([F4] > 0) Then 
     UpdateDerivative1 
    End If 
    If ([F4] > 1) Then 
     UpdateDerivative2 
    End If 
    If ([F4] > 2) Then 
     UpdateDerivative3 
    End If 
    If ([F4] > 3) Then 
     UpdateDerivative4 
    End If 


End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 

    If Not Application.Intersect(Sheets("Main").Range("C7:C61"), Range(Target.Address)) Is Nothing Then 

     MakeVisible 
     UpdateBaseline 

     If ([F4] > 0) Then 
      UpdateDerivative1 
     End If 
     If ([F4] > 1) Then 
      UpdateDerivative2 
     End If 
     If ([F4] > 2) Then 
      UpdateDerivative3 
     End If 
     If ([F4] > 3) Then 
      UpdateDerivative4 
     End If 
    End If 
End Sub 

いくつかのより多くの時間のデバッグを過ごした後、私は以来、いくつかの競合状態があることを信じている:以下は私の潜水艦の短縮版(MakeVisibleUpdateBaselineUpdateDerivative1は私が後で定義されたすべてのサブルーチンがある...)ですUpdateBaselineUpdateDerivative1などのコードは、実際には星やストレートコネクタなどの形状オブジェクトをサイズ変更したり動かしたりしていますが、それらの位置を指定する変数には、正しい値。私の直感は、形の移動やプロパティの変更は、ある種の競合状態を引き起こす可能性のある計算を必要としますが、これは単なる推測であり、完全に無関係である可能性があります。

ありがとうございました!

+0

私の他の推測は、あなたのコードのいくつかは現在の選択に依存するかもしれないということです。たとえば、 '[F4]'はどのシートがアクティブ/選択されているかによって異なる値を返すことができますが、 '[Main!F4]'は少し具体的です。 – Slai

答えて

0

ような何かを試すことができます。このバグは実際に現在アクティブなシート上のコードの依存関係によって引き起こされていますが、特定のセルのシートを指定した後は修正されませんでした([F4][Main!F4]に変更しました)私のコードのすべてが具体的には[Main!<Cell>]またはのいずれかで動作することを確認したので、問題が何であるかはわかりません。これにより、現在アクティブなシートに依存することがなくなります。しかし、Worksheet_Calculate()がトリガされたときに、現在アクティブなシートを "Main"に戻すコードを追加しました。これが正しい動作を引き起こしました。私が追加したコードはWorksheet_Calculate()の最初の行にWorksheets("Main").Activateでした。

ありがとうございました!

0

あなたは、私が問題に@Slaiに感謝を識別することができた。この

Dim ignoreEvents As Boolean 

Private Sub Worksheet_Calculate() 

    If ignoreEvents = True Then Exit Sub 
    ignoreEvents = True 

    ' your code here 

    ignoreEvents = False 
End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 

    If ignoreEvents = True Then Exit Sub 
    ignoreEvents = True 

    ' your code here 

    ignoreEvents = False 
End Sub 
+0

こんにちはスレイ、答えてくれてありがとう。しかし、ここでの問題は、同じコードが2回実行されるかどうかではありません。これをコードに追加しようとしましたが、動作は同じです。この動作は、デバッグモードではコードを変更せずにノーマルモードとは異なる場合がありますが、これは何度もやったことがありますが、理由はわかりません。デバッガで変数モニタも使用しました。変数は、 'Worksheet_Change()'または 'Worksheet_Calculate()'のいずれかからサブルーチンを呼び出すと、まったく同じ値を表示します。ありがとう! –

関連する問題