2017-12-15 6 views
-2

Ich möchte die Daten in der ersten Spalte (A) aktualisieren, wenn sich die Werte in derselben Zeile mit dem Datum ändern.VBA, dasselbe Makro für Mehrfachauswahl ausführen

Ich könnte es für eine Zelle zu einer Zeit mit dem folgenden Code tun. Wenn jedoch mehrere Zellen ausgewählt sind, wird der Makro nicht mehr ausgeführt. Kannst du mir helfen, unter Code zu aktualisieren, um auch für mehrere Zellen zu arbeiten?

Ich fand Codes, die tun, was ich für vordefinierte Ziele und Bereiche will, aber ich will, dass es funktioniert, ohne Ziel oder Auswahlbereich im Code zu definieren.

Example

Dim oldValue As Variant 

'Get the old selected cell value 
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    oldValue = Target.Value 
End Sub 

'Update the date in first column when new value on selected cell 
Private Sub Worksheet_Change(ByVal Target As Range) 
    If (Target.Count = 1) And Not (Target.Column = 1) And Not (Target.Value = oldValue) Then 
     Cells(Target.Row, 1) = Date 
    Else 

    End If 
End Sub 

Edit (aus den Kommentaren):

Ich möchte die relevanten Daten aktualisieren können, wenn mehrere Zellen verändert werden. Wenn zum Beispiel der Buchstabe "x" in den Bereich C6,C8:C9 kopiert wird, sollten sich die Daten in A6, A8 und A9 ändern. Aber wenn der Buchstabe "a" in dieselben Zellen kopiert wird, sollten nur A6 und A9 geändert werden, weil C8 bereits "a" war, bevor die Änderung vorgenommen wurde.

+1

Verwenden Sie eine Schleife. Einfach. –

+0

Wie werden Daten aktualisiert? Plus eines Tages? Minus 10 Tage? – JohnyL

+0

bis zum Datum der letzten Änderung – SOKRATES

Antwort

1
Dim dict As Object 

'Get the old selected cell value 
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    Set dict = CreateObject("Scripting.Dictionary") 
    For Each cell In UsedRange.Cells 
     dict.Add cell.Address, cell.Value 
    Next cell 
End Sub 

'Update the date in first column when new value on selected cell 
Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not (Target.Column = 1) Then 
     For Each cell In Target.Cells 
      If dict.exists(cell.Address) Then 
       If dict(cell.Address) <> cell.Value Then 
        Application.EnableEvents = False 
        Cells(cell.Row, 1) = Date 
        Application.EnableEvents = True 
       End If 
      Else 'if the cell was not used before and this is a new row being filled 
       Application.EnableEvents = False 
       Cells(cell.Row, 1) = Date 
       Application.EnableEvents = False 
      End If 
     Next cell 
    End If 
End Sub 
+0

"Können Sie mir helfen, unter Code zu aktualisieren, um auch für mehrere Zellen zu arbeiten" - Ihr Vorschlag wird nur funktionieren, wenn eine einzelne Zelle geändert wird. – YowE3K

+0

Sie meinen, wenn eine Zelle sich ändert, aktualisiert sie alle Daten? – Ibo

+1

Nein, das OP möchte die relevanten Daten aktualisieren können, wenn mehrere Zellen geändert werden. Vielleicht kopieren sie (von irgendwo) den Buchstaben "x" in den Bereich "C6, C8: C9", dann wollen sie, dass sich die Daten in A6, A8 und A9 ändern. (Aber wenn sie "a" in dieselben Zellen kopieren würden, anstatt "x", würden sich nur A6 und A9 ändern, weil C8 vor der Kopie "a" war.) – YowE3K