Registro de data e hora quando várias células em uma linha são alteradas

0

Eu tenho tentado usar uma macro para marcar as células em uma coluna, quando outra célula naquela linha é alterada, o abaixo que eu obtive de outro thread aqui funciona perfeitamente.

No entanto, quero fazer o mesmo, mas desta vez, se alguma célula da linha for alterada. Eu adicionei uma coluna adicional que combina todas as outras entradas na linha por um simples "&" fórmula, mas parece que o abaixo não funciona quando uma célula de fórmula é atualizada.

Alguém sabe como posso fazer isso?

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
    
por Armanny Málaga 07.04.2017 / 12:58

2 respostas

0

Eu posso não estar interpretando o que você quer fazer corretamente; no entanto, se eu sou, há uma maneira de fazer isso usando uma variável global para armazenar o valor da célula original. No evento SelectionChange, defina o valor global (old_Value) = valor de destino e, em seguida, você pode usar isso para comparar valores de célula e atualizar o registro de data e hora conforme apropriado no evento 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

Eu provavelmente adicionaria a ressalva de que isso causaria um erro se você estivesse selecionando um intervalo ou arrastando um valor de célula por várias células (linha ou coluna) de uma só vez.

    
por 07.04.2017 / 19:41
0

Com base nas informações adicionais fornecidas, acho que posso ter uma solução viável para você. Pensei em editar minha resposta original, mas ela mudou drasticamente, então achei que seria mais útil apenas fornecer uma nova. À primeira vista, pode parecer longo e prolongado, mas remover os comentários e é muito menos "pesado". Eu comentei um pouco extensivamente apenas para fornecer uma melhor clareza.

'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

Eu não posso dizer definitivamente que esta é a melhor maneira de fazê-lo, mas funciona para o que você descreveu. Espero que você ache útil.

    
por 28.04.2017 / 21:10