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

Однако я хочу сделать то же самое, но на этот раз, если какая-либо ячейка в строке изменится. Я добавил дополнительный столбец, который объединяет все остальные записи в строке с помощью простой формулы «&», но кажется, что приведенное ниже не работает при обновлении ячейки формулы.

Кто-нибудь знает, как я могу это сделать?

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim wk As Workbook
    Set wk = ThisWorkbook
    Dim ws As Worksheet
    Set ws = ActiveSheet

    WatchedColumn = 2
    BlockedRow = 1
    TimestampColumn = 4
    Crow = Target.Row
    CColumn = Target.Column
    If CColumn = WatchedColumn And Crow > BlockedRow Then
            Cells(Crow, TimestampColumn) = Now()
    End If
End Sub

2 ответа2

0

Исходя из предоставленной дополнительной информации, я думаю, что у меня может быть жизнеспособное решение для вас. Я думал о редактировании своего первоначального ответа, но он довольно сильно изменился, поэтому подумал, что может быть более полезным просто предоставить новый. На первый взгляд он может выглядеть длинным и вытянутым, но убрать комментарии, и это гораздо менее "громоздко". Я прокомментировал это несколько широко, чтобы обеспечить лучшую ясность.

'global variable for the original value
Dim old_Value As Variant

'on select change event is used to trap original value of the cell being changed
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    'check to see if it is a single cell or multiple cells
    If Selection.Cells.Count = 1 Then

        'check if cell is in appropriate range
        If Target.Row < 6 And Target.Column = 1 Then

            'set original value of the cell to the global "old_Value" variable
            old_Value = Target.Value
        End If

    'if more than one cell is being updated (dragging, ctrl-enter, etc.)
    Else

        'set value of old value to concatenation of original values
        For i = 1 To 5
            old_Value = old_Value & Cells(i, 1)
        Next
    End If
End Sub


'on change event is used to compare the values of the old cell vs the new cell
Private Sub Worksheet_Change(ByVal Target As Range)

    Dim i As Integer            'variable for for loop (if needed)
    Dim new_Value As String     'variable for storing new values concatenation (if needed)

    'check to see if it is a single cell or multiple cells
    If Selection.Cells.Count = 1 Then

        'make sure cell is in appropriate row and column range and compare old value to new value
        If Target.Row < 6 And Target.Column = 1 And old_Value <> Target.Value Then

            'if change happened set timestamp
            Cells(6, 1) = Now()
        End If

    'if more than one cell is being updated (dragging, ctrl-enter, etc.)
    Else

        'concatenate new values into one variable
        For i = 1 To 5
            new_Value = new_Value & Cells(i, 1)
        Next

        'compare new with old and set timestamp if appropriate
        If new_Value <> old_Value Then
            Cells(6, 1) = Now()
        End If
    End If
End Sub

Я не могу однозначно сказать, что это ЛУЧШИЙ способ сделать это, но он работает для того, что вы описали. Надеюсь, вы найдете это полезным.

0

Возможно, я не правильно истолковываю то, что вы хотите сделать; однако, если это так, есть способ сделать это, используя глобальную переменную для хранения исходного значения ячейки. В событии SelectionChange задайте глобальное значение (old_Value) = целевое значение, а затем вы можете использовать его для сравнения значений ячеек и обновления временной отметки в зависимости от ситуации в событии Worksheet_Change.

Dim old_Value As String

Private Sub Worksheet_Change(ByVal Target As Range)

   TimestampColumn = 4
   Ccolumn = Target.Column
   Crow = Target.Row

   If old_Value <> Cells(Crow, Ccolumn) Then
      Cells(Crow, TimestampColumn) = Now()
   End If

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   old_Value = Target.Value
End Sub

Я, вероятно, должен добавить предупреждение, что это приведет к ошибке, если вы выбираете диапазон или перетаскиваете значение ячейки через несколько ячеек (строки или столбца) одновременно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .