Track Changes mittels VBA
#1
Hallo,

ich habe ein folgendes Problem. Da meine VBA Kenntnisse gegen null laufen wollte ich euch Profis Fragen ob jemand mir sowas schreiben könnte.

Ich habe eine Wartungstabelle mit mehreren Blättern 
Maschine A
Maschine B
Maschine C
...
Dort sind Wartungspositionen mit z.B. Fenster reinigen --> Betriebsstunden --> Wartungsintervall --> Letzte Wartung --> Wartung fällig --> Wartung erledigt --> Bemerkung

Ich möchte jetzt wenn jemand jetzt das Datum bei Wartung erledigt ändert und was Bei Bemerkung schreibt das es in einem Separaten Blatt (Schwarzer Pfeil im Bild) aufgeführt wird.

Könnte mir jemand damit helfen?
Herzlichen Dank schon mal

MfG
XenOn655


Angehängte Dateien Thumbnail(s)
   
Top
#2
Hallo XenOn655.
Wie soll denn der Eintrag in Tabelle1 ausschauen? Welche Spalten gibt es da?

Gruß
Sebastian
Top
#3
Hallo,


In A1 soll dann stehen bei welcher Maschine (also MaschineA) geändert worden ist
In B1 soll dann stehen was in der Zeile stand
In C1 soll dann stehen in was es geändert worden ist
In D1 soll dann stehen welcher User es geändert hat
In E1 soll dann stehen wann es geändert worden ist mit Datum&Uhrzeit

und bei jedem Eintrag soll der neue Eintrag eine Zeile tiefer rutschen.

MfG
XenOn655
Top
#4
Ok, ganz verstehe ich das noch nicht.
Was soll genau in B1 und C1 stehen? Der Inhalt aus der Bemerkungsspalte?
Woher ist der User bekannt?

Gruß
Sebastian
Top
#5
Moin,

Das Programm soll sowas ausgeben. Habe es jetzt per Hand rein geschrieben.

MfG
XenOn655


Angehängte Dateien Thumbnail(s)
   
Top
#6
Wenn ich so drüber nachdenke, ist der Vorherzustand einer Zelle, also das was in B1 stehen soll, aufwändig zu erfassen. Man muss dann vor jeder Änderung den Zelleninhalt zwischenspeichern, und danach prüfen, ob überhaupt eine echte Änderung stattgefunden hat, oder ob der Benutzer die Zelle einfach nur wieder verlassen hat,.......
Du könnstest jede Änderung in Tabelle1 eintragen. Den Vorherzustand siehst Du dann an dem historisch älteren Eintrag zur selben Maschine. Eine unechte Bearbeitung der Zelle, also nur aktivieren, und nichts ändern, würde dann trotzdem zu Einträgen in der Tabelle1 führen.
Da musst Du nochmal drüber nachdenken, was hier der schönste Weg ist.

Gruß
Sebastian
Top
#7
Hi,


ergibt es nicht Sinn, wenn man Folgendes umsetzt:

Sobald ein Mitarbeiter in der Spalte "Wartung erledigt" ein Datum einträgt und er das Tabellenblatt verlässt, soll dieser Eintrag in das "Log"-Blatt geschrieben werden. Anschließend soll die Spalte "Letzte Wartung" überschrieben werden mit dem Eintrag aus "Wartung erledigt". Danach wird "Wartung erledigt" wieder gelöscht!

Gruß Tim
Top
#8
Moin,

easY das ist ein guter Einwand. Wäre es ein Programm schwer zu schreiben. Leider sind meine VBA Kenntnisse nicht so gut.
Könntest du mir evtl. so ein Programm schreiben?

MfG
XenOn655
Top
#9
Hi...

grundsätzlich könnte ich das, allerdings ruft jetzt die Arbeit und ich wäre ggf. erst morgen wieder am PC. Ich bin nicht der super-VBA-Programmierer, sodass das sicher einige Zeit in Anspruch nehmen würde. Vielleicht hilft dir ja auch ein anderer User aus dem Forum.
Was auf jeden Fall helfen würde wäre ein Beispielmappe, die dem Aufbau deiner Mappe exakt entspricht jedoch nur anonymisierte Dummy-Daten enthält.


Gruß
Top
#10
Hier mal ein Ansatz nach der ursprünglichen Idee.

Code:
Option Explicit
Const SPALTE_AENDERUNG = 8 'Nummer der Spalte auf deren Änderung reagiert wird
Const SPALTE_DATUM = 8 'Nummer der Spalte die das zu übertragende Datum enthält

Const LOG_BLATT = "Tabelle1" 'Name des Blattes, das das Log enthält
'#

Private Sub Worksheet_Change(ByVal Target As Range) 'Event bei Ändern eines Zelleninhalts

Dim Datum As Long
Dim LetzteZeile As Long
Dim Blattname As String

If Target.Column = SPALTE_AENDERUNG Then
   Datum = Cells(Target.Row, SPALTE_DATUM)
   Blattname = ActiveSheet.Name
   
   LetzteZeile = TabellenendeSuchen(LOG_BLATT, 1)
   ActiveWorkbook.Worksheets(LOG_BLATT).Cells(LetzteZeile + 1, 1) = Blattname
   ActiveWorkbook.Worksheets(LOG_BLATT).Cells(LetzteZeile + 1, 3) = Datum
   ActiveWorkbook.Worksheets(LOG_BLATT).Cells(LetzteZeile + 1, 4) = Environ("UserName") 'Application.UserName
   ActiveWorkbook.Worksheets(LOG_BLATT).Cells(LetzteZeile + 1, 5) = Now
   
   ActiveWorkbook.Worksheets(LOG_BLATT).Columns(3).NumberFormat = "dd/mm/yyyy"
   ActiveWorkbook.Worksheets(LOG_BLATT).Columns(5).NumberFormat = "dd/mm/yyyy hh:mm"
End If

End Sub
Function TabellenendeSuchen(Arbeitsblatt As String, Spalte As Integer) As Long

TabellenendeSuchen = ActiveWorkbook.Worksheets(Arbeitsblatt).Cells(Rows.Count, Spalte).End(xlUp).Row

End Function
Damit hast Du mal ein Grundgerüst. Das kannst Du ja noch anpassen. Damit kommst Du ins Programmieren auch ein bisschen rein.

Gruß
Sebastian
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste