Arbeiten mehrere Personen mit einer Exceldatei kann es notwendig werden, das jeweilige Bearbeitungsdatum und den zuständigen Ansprechpartner nachvollziehen zu können. Müssen große Listen abgearbeitet werden, kann z.B. eine Spalte für einen Prüfvermerk in die Exceldatei integriert werden. Sind es immer dieselben Eintragungen, die vorgenommen werden sollen, z.B. um im Rahmen einer Bestellabwicklung den aktuellen Status festzustellen kann diese Spalte mit einer Dropdown-Box bereits alle möglichen Vermerke bereitstellen, so dass der Vermerk nur noch aus der Liste ausgewählt werden muss. Um hinterher noch nachvollziehen zu können, wann und wer diesen Vermerk hinzugefügt hat, stelle ich Ihnen heute eine recht einfache Lösung für ein entsprechendes Excel Makro vor. Die Beispieldatei können Sie am Ende des Beitrags herunterladen. Für die Funktion des Makros müssen Makros aktiviert sein!
Im Beispiel (Abb. 1) stehen die Daten der Bestellungen in Spalte A und B. Je nach Umfang Ihrer Liste wird der Bereich sicher einige Spalten mehr beinhalten. Die Spalte für die Prüfvermerke kann direkt rechts neben dem genutzten Spaltenbereich hinzugefügt werden. Im Beispiel also Spalte C. Möchten Sie ebenfalls eine Auswahlbox in dieser Spalte nutzen, können Sie dies gegebenenfalls in der Menüleiste mit der Option „Daten“, „Gültigkeit“ realisieren.
Abb. 1
Das Makro tragen Sie im VBA-Editor im benötigten Tabellenblatt ein.
Private Sub Worksheet_Change(ByVal Target As Range) Dim Zelle As Range Dim Zeilen As String Zeilen = Selection.Rows.Count 'Hier die Spalte für den Prüfvermerk eintragen, hier Spalte C von Zeile 2 bis zum Ende des Tabellenblatts. If Intersect(Target, Range("C2:C" & Rows.Count)) Is Nothing Then Exit Sub Application.EnableEvents = False If Zeilen = 1 Then If Target.Value <> "" Then If Target.Offset(0, 1).Value = "" Then 'Erste Bearbeitung eine Spalte rechts vom Prüfvermerk Target.Offset(0, 1).Value = Now 'Person, die die Kontrolle durchgeführt hat drei Spalten rechts vom Prüfvermerk Target.Offset(0, 3).Value = Application.UserName Else 'Letzte Bearbeitung zwei Spalten rechts vom Prüfvermerk Target.Offset(0, 2).Value = Now Target.Offset(0, 3).Value = Application.UserName End If Else Target.Offset(0, 1).Value = "" Target.Offset(0, 2).Value = "" Target.Offset(0, 3).Value = "" End If ElseIf Zeilen > 1 Then For Each Zelle In Selection Zelle.Offset(0, 1).Value = "" Zelle.Offset(0, 2).Value = "" Zelle.Offset(0, 3).Value = "" Next Zelle End If Application.EnableEvents = True End Sub
Möchten Sie für den Prüfvermerk nicht die Spalte C verwenden, ist im Makro der Code an der Stelle:
Range("C2:C" & Rows.Count)
anzupassen. Die beiden Bearbeitungsdatums und der Kontrolleur werden automatisch in die drei Spalten rechts neben dem Prüfvermerk eingetragen. Möchten Sie auch die Spalten verändern, passen Sie außerdem noch diesen Code an:
Offset(0, 1)
Der erste Wert in der Klammer steht für die Zeile abhängig von der aktuellen Zeile des Prüfvermerks. 0 bedeutet, es wird die gleiche Zeile wie für den Prüfvermerk verwendet. Negative Werte würden in Zeilen darüber den Wert eintragen. Mit dem Wert -3 erfolgt der Eintrag also 3 Zeilen über dem Prüfvermerk, mit einem positiven Wert die entsprechende Zeilenzahl darunter. Der zweite Wert in der Klammer steht folgerichtig für die Spalte. Auch hier würden negative Werte wieder davor, also in Spalten vor dem Prüfvermerk eingetragen, positive Werte danach, also rechts davon. Im Beispiel werden (0, 1) für die Erste Bearbeitung, (0, 2) für die Letzte Bearbeitung und (0, 3) für „Kontrolle erfolgt von“ verwendet.
Ein sehr interessantes Script.
Ich bräuchte aber eine leicht abgewandelte Version und möchte hier mal um Unterstützung bitten.
Ich würde gerne in einer Liste mehrere Spalten auf Änderungen überwachen und dann am Ende der Tabelle die Daten in fixen Spalten ausgeben.
Auf ihr Beispiel bezogen:
Alle Änderungen in den Spalte A-C sollen in den Spalten D-F vermerkt werden. Jeweils in der selben Zeile.
Wenn man die Zeile
If Intersect(Target, Range(„C2:C65536“)) Is Nothing Then Exit Sub
ändert in
If Intersect(Target, Range(„A2:C65536“)) Is Nothing Then Exit Sub
dann werden auch alle Spalten überwacht. Nur leider macht dann natürlich der variable Bezug der Ausgabe z.B.
Target.Offset(0, 2).Value = Now
Probleme.
An welchen Stellen und mit welcher Syntax muss ich nun diese Variable abändern um zu meinem Ziel zu gelangen?