Автоматическое обновление даты в ячейке при изменении значения другой ячейки (рассчитывается по формуле) - PullRequest
5 голосов
/ 16 февраля 2012

У меня есть формула в C2, скажем =A2+B2.Всякий раз, когда C2 меняет значение (фактическое значение, а не формула), я хочу, чтобы текущая дата и время обновлялись в D2.

Я перепробовал много кодов и приемов VBA, и ни один из них не работает, если введена формулав С2.НО, если я ввожу значение вручную в C2, дата и время обновляются по мере необходимости.Это, конечно, потому что вводится / изменяется реальное значение - где формула остается неизменной, так сказать.

Вопрос: Можно ли создать код VBA (или что-то еще?) что обновляет D2 при изменении результата формулы в C2?

Если возможно, мне нужно, чтобы это было активным для ячеек C2: C30 (+ D2: D30 для даты + время)

Использование Excel 2010.

Ответы [ 4 ]

10 голосов
/ 16 февраля 2012

Вы можете заполнить зависимую ячейку (D2) с помощью пользовательской функции (макрофункция VBA), которая принимает значение ячейки C2 в качестве входного параметра, возвращая текущую дату в качестве результата.

Наличие C2 в качестве входного параметра для UDF в D2 говорит Excel, что ему необходимо переоценивать D2 при каждом изменении C2 (то есть, если для рабочей книги включен автоматический расчет формул).

EDIT:

Вот код:

Для UDF:

    Public Function UDF_Date(ByVal data) As Date

        UDF_Date = Now()

    End Function

Как формула в D2:

=UDF_Date(C2)

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

И вы можете расширить формулу по требуемому диапазону, перетаскивая ее, если вы сохраните ссылку C2 в относительной формуле D2.

Примечание: Это все еще может быть не идеальным решением, потому что каждый раз, когда Excel пересчитывает рабочую книгу, дата в D2 сбрасывается до текущего значения. Чтобы D2 отражал только последний раз, когда C2 был изменен, должно быть какое-то отслеживание прошлых значений C2. Это, например, может быть реализовано в UDF путем предоставления адреса рядом со значением входного параметра, сохранения входных параметров в скрытом листе и сравнения их с предыдущими значениями каждый раз, когда вызывается UDF.

Добавление:

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

  • Использование UDF такое же, как описано выше.

  • UDF работает только для входных диапазонов с одной ячейкой.

  • Значения ячейки отслеживаются путем сохранения последнего значения ячейки и дата и время, когда изменение было обнаружено в свойствах документа Учебное пособие. Если формула используется для больших наборов данных, размер файл может значительно увеличиться как для каждой ячейки, которая отслеживается формула увеличения требований к памяти (последнее значение ячейки + дата последнего изменения.) Кроме того, возможно, Excel не способен обрабатывать очень большое количество свойств документа, и код может затормозить определенный момент.

  • Если имя рабочего листа изменяется, вся информация об отслеживании содержащихся в нем ячеек теряется.

  • Код может нарушать значения ячеек, для которых преобразование в строку недетерминировано.

  • Код ниже не проверен и должен рассматриваться только как доказательство концепция. Используйте его на свой страх и риск .

    Public Function UDF_Date(ByVal inData As Range) As Date
    
        Dim wb As Workbook
        Dim dProps As DocumentProperties
        Dim pValue As DocumentProperty
        Dim pDate As DocumentProperty
        Dim sName As String
        Dim sNameDate As String
    
        Dim bDate As Boolean
        Dim bValue As Boolean
        Dim bChanged As Boolean
    
        bDate = True
        bValue = True
    
        bChanged = False
    
    
        Dim sVal As String
        Dim dDate As Date
    
        sName = inData.Address & "_" & inData.Worksheet.Name
        sNameDate = sName & "_dat"
    
        sVal = CStr(inData.Value)
        dDate = Now()
    
        Set wb = inData.Worksheet.Parent
    
        Set dProps = wb.CustomDocumentProperties
    
    On Error Resume Next
    
        Set pValue = dProps.Item(sName)
    
        If Err.Number <> 0 Then
            bValue = False
            Err.Clear
        End If
    
    On Error GoTo 0
    
        If Not bValue Then
            bChanged = True
            Set pValue = dProps.Add(sName, False, msoPropertyTypeString, sVal)
        Else
            bChanged = pValue.Value <> sVal
            If bChanged Then
                pValue.Value = sVal
            End If
        End If
    
    On Error Resume Next
    
        Set pDate = dProps.Item(sNameDate)
    
        If Err.Number <> 0 Then
            bDate = False
            Err.Clear
        End If
    
    On Error GoTo 0
    
        If Not bDate Then
            Set pDate = dProps.Add(sNameDate, False, msoPropertyTypeDate, dDate)
        End If
    
        If bChanged Then
            pDate.Value = dDate
        Else
            dDate = pDate.Value
        End If
    
    
        UDF_Date = dDate
     End Function
    
4 голосов
/ 09 марта 2012

Сделать вставку даты условной для диапазона.

Это имеет преимущество в том, что не изменяет даты, если содержимое ячейки не изменяется, и оно находится в диапазоне C2: C2, даже если лист закрыт и сохранен, он не пересчитывается, если не изменяется соседняя ячейка .

Адаптировано из этого совета и @Paul S answer

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim R1 As Range
 Dim R2 As Range
 Dim InRange As Boolean
    Set R1 = Range(Target.Address)
    Set R2 = Range("C2:C20")
    Set InterSectRange = Application.Intersect(R1, R2)

  InRange = Not InterSectRange Is Nothing
     Set InterSectRange = Nothing
   If InRange = True Then
     R1.Offset(0, 1).Value = Now()
   End If
     Set R1 = Nothing
     Set R2 = Nothing
 End Sub
0 голосов
/ 13 июня 2016

Самый простой способ - добавить =IF(B3="","Not Allocated",Now()) и изменить формат столбца на требуемый формат даты и времени.Но здесь, если столбец B редактируется, дата и время соответствующего столбца, который нуждается в обновлении, будет обновляться автоматически для всех столбцов, поскольку не проверяется старое значение.Но если можно получить текущее время, это можно легко использовать.

0 голосов
/ 09 марта 2012
Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Address = "$C$2" Then

        ActiveSheet.Range("D2").Value = Now()

    End If

End Sub
...