Событие изменения листа Excel не срабатывает, если ячейка не изменяется вручную

Я использую следующий код, который прекрасно работает. Однако изменения в ячейке, которая должна инициировать это событие, выполняются с использованием формулы, а не записи в ячейке. Если я введу запись, все будет работать. Но если я использую формулу для получения данных с другого листа, это не так. Например, ячейки в 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
2
задан Twisty Impersonator
20.02.2023 15:53 Количество просмотров материала 3313
Распечатать страницу

2 ответа

формула, возвращающая другой результат, не квалифицируется как изменение ячейки. В соответствии с описанием Worksheet_Change событие, это:

происходит, когда ячейки на листе изменяются пользователем или внешней ссылкой.

это поведение имеет смысл, когда вы наблюдаете, что содержимое ячейки фактически не изменяется. Например, ячейка содержала =HR!P27 до и после Формулы вернул различный результат. Изменился только результат формулы. В этом случае Excel различает изменения, влияющие на содержимое ячейки, и выходные данные.

Если вам нужно, чтобы ваш код запускался при каждом обновлении формулы, используйте Worksheet_Calculate событие. Он срабатывает при каждом пересчете листа.

2
отвечен Twisty Impersonator 2023-02-21 23:41

рассмотрим диапазон ("AD: AD") в вашем коде VBA, я хотел бы предложить вам причину, а также решения, которые, как вы могли бы решить эту проблему

Если диапазон составляет Обновить Вручную (то, что вы сделали на самом деле), то событие изменения можно использовать.

Если диапазон содержит любую формулу, потом вычислить событие может быть использовано.

Если диапазон содержит значение то есть обновляется через внешние данные или формулу, затем в диапазон ("AD" AD") входит =("AD: AD") и вычислить событие может затем также использоваться.

Thaes возможные причины. Таким образом, если диапазон обновляется, то AD:AD будет автоматически рассчитываться и событие будет срабатывать.

Я думаю, что вы не ввели код под ThisWorkbook. код требуется ввести под лист, потом он завод.

так, что заключение польза высчитывает событие.

Ниже приведены два примера методов кодирования, помогут вам избавиться от ситуации.

Способ 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

NB: этот код позаботится о существующем событии изменения листа" упражнение.

я надеюсь, что это поможет вам.

0
отвечен Rajesh S 2023-02-22 01:58

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх