Как мне обновить метку времени, когда ячейка содержит формулу, ссылающуюся на другую ячейку на другом листе?

Следующий код дает мне начальную метку времени (N) и обновленное время (O).

Это работает, когда ячейки в столбце D на WORKSHEET1 обновляются вручную.

Ячейка в столбце D WORKSHEET1 теперь ссылается на столбец WORKSHEET2 E. Так, например, D4 на WORKSHEET1 равно ='WORKSHEET2'!E23.

Когда значения обновляются WORKSHEET2, столбец D WORKSHEET1 обновляется автоматически.

Приведенный ниже код временной метки перестает работать и не улавливает это изменение значения. Могу ли я вставить код VBA, чтобы при изменении значений на WORKSHEET2 и обновлении на WORKSHEET1 из-за формулы в cel D метка времени работала?

Private Sub Worksheet_Change(ByVal Target As Range)

Dim myTableRange As Range

Dim myDateTimeRage As Range

Dim myUpdatedRange As Range

Set myTableRange = Range("D1:D314")

If Intersect(Target, myTableRange) Is Nothing Then Exit Sub

Set myDateTimeRage = Range("N" & Target.Row)

Set myUpdatedRange = Range("O" & Target.Row)

If myDateTimeRage.Value = "" Then

    myDateTimeRage.Value = Now
End If

myUpdatedRange.Value = Now

End Sub

person leslie    schedule 26.11.2019    source источник
comment
Этот код запускается при обнаружении изменения на листе, на котором сохраняется код. Кроме того, без квалификации листа Range() будет ссылаться на активный лист (который, как я предполагаю, тот же самый, на котором хранится этот код).   -  person BruceWayne    schedule 26.11.2019
comment
Поместите код в код Worksheet2, а затем измените ячейки на worksheet1.   -  person Scott Craner    schedule 26.11.2019
comment
Так должен ли я использовать with после того, как я установил свой диапазон? ссылаться на диапазон на неактивном листе? не уверен, какую функцию использовать   -  person leslie    schedule 27.11.2019


Ответы (1)


Попробуй это -

Private Sub Worksheet_Calculate()
    Dim myTableRange As Range
    Dim myDateTimeRage As Range
    Dim myUpdatedRange As Range
    Set myTableRange = Range("D1:D314")   

    For Each cell In myTableRange
        Dim OldValue As Variant
        Application.EnableEvents = False
        Application.Undo
        OldValue = cell.Value
        Application.Undo
        Application.EnableEvents = True
        If OldValue <> cell.Value Then
            Set myDateTimeRage = Range("N" & cell.Row)
            Set myUpdatedRange = Range("O" & cell.Row)    
                If myDateTimeRage.Value = "" Then
                    myDateTimeRage.Value = Now
                End If
            myUpdatedRange.Value = Now
        End If    
    Next cell
person Nakul Sanyashi    schedule 26.11.2019
comment
Спасибо за ответ. В этом коде есть ошибка компиляции. Ожидается конец подпрограммы, и первая строка кода выделяется желтым цветом. - person leslie; 27.11.2019
comment
@leslie просто добавьте End Sub после последней строки кода, и все заработает. - person Miles Fett; 13.12.2019