セルを手動で変更しない限り、Excelのワークシート変更イベントは発生しません


4

私は次のコードを使用しています。ただし、このイベントを発生させるセルへの変更は、セル内のエントリではなく数式を使用して行われます。エントリを入力すると、すべてが機能します。しかし、別のワークシートからデータを取得するために数式を使用する場合、そうではありません。たとえば、ADのセルにはなどの数式があり=HR!P27ます。

私は何が欠けていますか?

コード:

    Private Sub Worksheet_Change(ByVal Target As Range)
    'Update 20140722
    Dim WorkRng As Range
    Dim Rng As Range
    Dim xOffsetColumn As Integer
    Set WorkRng = Intersect(Application.ActiveSheet.Range("AD:AD"), Target)
    xOffsetColumn = -1
    If Not WorkRng Is Nothing Then
        Application.EnableEvents = False
        For Each Rng In WorkRng
           If Not VBA.IsEmpty(Rng.Value) Then
              Rng.Offset(0, xOffsetColumn).Value = Now
              Rng.Offset(0, xOffsetColumn).NumberFormat = "dd-mm-yyyy, hh:mm:ss"
           Else
             Rng.Offset(0, xOffsetColumn).ClearContents
           End If
        Next
        Application.EnableEvents = True
    End If
    End Sub

回答:


1

別の結果を返す数式は、セルの変更とは見なされません。Worksheet_Changeイベントの説明によると、次のとおりです。

ワークシート上のセルがユーザーまたは外部リンクによって変更されたときに発生します。

この動作は、セルのコンテンツが実際に変化していないことを確認したときに意味があります。例えば、含まれる細胞=HR!P27の前及び式後には、異なる結果が返されます。数式の結果のみが変更されました。このケースが肯定するように、Excelはセルのコンテンツとその出力に影響する変更を区別します。

数式が更新されるたびにコードを実行する必要がある場合は、Worksheet_Calculateイベントの使用を検討してください。ワークシートが再計算されるたびに起動します。


私はそれをやろうとしましたが、今はエラーになります。Worksheet_Calculateを使用して、これを正しく書くのを手伝ってくれる人はいますか?
テリブ

新しい質問をする必要があります。必要に応じて、この質問にリンクしてコンテキストを提供できます。
Twisty Impersonator

0

VBAコードのRange( "AD:AD")を検討してください。背後にある理由と、問題を解決する方法を提案します。

範囲が手動で更新された場合(実際に行ったこと)、変更イベントを使用できます。

レンジ場合は任意の式が含まれ、その後、計算イベントを使用することができます。

Range に外部データまたはFormulaを介して更新される値が含まれる場合、Range ( "AD" AD ")に=(" AD:AD ")と入力し、Calculateイベントも使用できます。

Thaesが考えられる理由です。そのため、範囲が更新されると、AD:ADが自動的に計算され、イベントがトリガーされます。

ThisWorkbookにコードを入力していないと思いますコードはSheetの下に入力する必要があり、それから動作します。

そのため、結論はイベントの計算を使用します。

以下の2つのサンプルコーディング方法は、状況を取り除くのに役立ちます。

方法1:

Private Sub Worksheet_Calculate()
    Dim target As Range
    Set target = Range("AD:AD")

    If Not Intersect(target, Range("AD:AD")) Is Nothing Then

    PASTE YOUR VB CODE HERE.

    End If

End Sub

方法2:

これを作成するだけです。

Private Sub Worksheet_Calculate()
   Worksheet_Change Range("AD:AD")
End Sub

注意: このコードは、既存の「ワークシート変更イベント」演習を処理します。

これがあなたのお役に立てば幸いです。


これを試すとエラーが発生します
Terrib

提案した場所にコードを貼り付けると、4行目を指す「Expected End Sub」エラーが表示されます。「If Not Intersect(Target、Range( "AD:AD"))Is Nothing then .....すべてのコードが貼り付けられます
Terrib

ChangeイベントのコードをトリガーするCalculateイベントにコードを配置すると、特定の状況でChangeイベントが重複して発生します。これは望ましい動作ではありません。
Twisty Impersonator

@Terribでコードを貼り付けると、Line Private Sub Worksheet_ChangeとEnd Subが削除されるだけです。実際、Private Sub、および、End Subを含むコード全体を貼り付けました。それが動作します。
ラジェシュS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.