5

私はVBAを使用してExcelを変更し、Sheet1内に次の単純なイベントハンドラーを持っています。

Private Sub Worksheet_Change(ByVal Target As Range)
    MsgBox "HI"
End Sub

しかし、これは決して発火しません。イミディエイトウィンドウでテストしました。

?Application.EnableEvents

最終的にTrueを返すので、起動するはずです。なぜこれがまったく発砲したくないのか誰かが知っていますか?

4

3 に答える 3

9

複数のシートをお持ちですか?シートの CodeName プロパティと Name プロパティ (Excel のタブ上の名前) は必ずしも同じではないことに注意してください。たとえば、Project Explorer に

Sheet2 (Sheet1)

次に、Sheet1 が Name で、Sheet2 が CodeName です。

コードを間違ったモジュールに配置したかどうかを確認する最も簡単な方法は、シートのタブを右クリックして [コードの表示] を選択することです。これにより、そのシートの CodePane が表示され、そこにコードが配置されます。

于 2012-07-25T18:08:58.423 に答える
4

この質問はずっと前に投稿されましたが、最近同じ問題が発生しました。これに苦労している VBA 初心者が他にいる場合は、ワークブックを保存して再度開いてみてください。それを行った後、期待どおりにシートの Worksheet_Change Sub が起動しました。

おそらく、私が見逃していたワークシートのサブをコンパイルするためのコントロールがありますか???

于 2016-02-03T16:32:13.973 に答える
2

通常は と一緒に使用しTargetます。M4 を強調表示して値を変更した場合の例を次に示します。

Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Address = "$M$4" Then
    MsgBox ("HI")
 End If
End Sub

HEREは、このイベントに関する非常に素晴らしい投稿です

その投稿からコードを適応させると、次のようなことができます

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Intersect(Target, Me.Range("$A$1:$V$100")) Is Nothing Then Exit Sub 
    If Target.Address = "$A$1" Then 
        MsgBox ("A1")
    ElseIf Target.Address = "$A$2" Then 
        MsgBox ("A2")
    End If 
End Sub 

わかりました-以下のコメントを参照してください+テストしたところ、コードは実際に機能するはずです。これを試して?これもうまくいきませんか?

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Me.Cells) Then
        MsgBox ("A1")
    End If
End Sub
于 2012-07-25T17:54:34.537 に答える