Änderungsliste führen
#1
Hallo,

es soll eine Änderungsliste erstellt werden. Dazu wird über Worksheet_Change bei jeder Änderung im Worksheet mit dem folgenden Code das Datum, der User und diverse andere Feldinhalte übertragen.
Da aber auch noch der alte Zellinhalt vor Änderung in Spalte 4 übertragen werden soll, hatte ich mir überlegt, die Zelle anzuklicken, dann auf Buttondruck den Inhalt der aktuellen Zelle in eine Variable zu kopieren und dann daraus im Change-Ereignis auf der Änderungsliste in die Spalte 4 einzufügen.

Aber geht das nicht auch ohne den Buttondruck?

Code:
Option Explicit
Public strInhalt As String

Private Sub CommandButton1_Click()
  strInhalt = ActiveCell.Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
 
  Dim loLetzte1 As Long
  Dim loLetzte2 As Long
 
  loLetzte1 = Cells(Rows.Count, 1).End(xlUp).Row              'letzte belegte in Spalte A (1)
 
  With Worksheets("Änderungsliste")
     loLetzte2 = .Cells(Rows.Count, 1).End(xlUp).Row          'letzte belegte in Spalte A (1)
     If Not Intersect(Target, Range("A5:L" & loLetzte1)) Is Nothing Then
        .Cells(loLetzte2 + 1, 1) = .Cells(loLetzte2, 1)       'Versionswechsel wie Zeile drüber
        .Cells(loLetzte2 + 1, 2) = Cells(Target.Row, 2)       'Bauteiltyp geänderter Zelle nach Spalte B
        .Cells(loLetzte2 + 1, 3) = Cells(Target.Row, 3)       'Bauteilnamen geänderter Zelle nach Spalte C
        .Cells(loLetzte2 + 1, 4) = strInhalt                  'Inhalt geänderter Zelle nach Spalte D
        .Cells(loLetzte2 + 1, 5) = Cells(Target.Row, Target.Column)    'geänderter Inhalt nach Spalte E
        .Cells(loLetzte2 + 1, 6) = Date
        .Cells(loLetzte2 + 1, 7) = VBA.Environ("Username")
     End If
  End With
End Sub
Top
#2
Hallo Ralf,

könntest Du nicht das SelectionChange-Ereignis verwenden? Übrigens: In einem Klassenmodul wie das der Tabelle solltest Du anstelle von Public Private verwenden.

Nachtrag: In deinem Code würden mir Application.EnableEvents fehlen.
Gruß Stefan
Win 10 / Office 2016
[-] Folgende(r) 1 Nutzer sagt Danke an Steffl für diesen Beitrag:
  • Rabe
Top
#3
(24.08.2016, 12:22)Rabe schrieb: ...
Aber geht das nicht auch ohne den Buttondruck?
...
Hallo Ralf,
mal als Idee, ich habe das noch nie in dieser Form getestet. Was hälst Du von einer Inputbox?
Über ActiveCell den alten Wert wegschreiben den neuen Wert über eine Inputbox erfassen und dann den neuen Wert zurückschreiben.

Code:
Altwert = ActiveCell.Value
Neuwert = InputBox("Bitte neuen Wert eingeben!", "Werteingabe")

Gruß
Ich
[-] Folgende(r) 1 Nutzer sagt Danke an IchBinIch für diesen Beitrag:
  • Rabe
Top
#4
Hi!
Zitat:In einem Klassenmodul wie das der Tabelle solltest Du anstelle von Public Private verwenden.

[Klugscheißmodus]
Public-Variablen funktionieren nur in einem allgemeinen Modul.
[/Klugscheißmodus]

Ansonsten, wie Steffl ja angedeutet hat:
Fülle die modulweite Variable (die sinnvollerweise ein Variant sein sollte) per Selection_Change und verwurste sie im _Change.

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top
#5
Hallo,

um sowohl der neuen als auch den vorherigen Wert in das log-file zu schreiben, ist ein Möglichkeit:

(ungeprüft)


Code:
sub sheet_change()
neuerWert = Target.Value
application.Undo
alterWert = Target.Value
'beide Werte ins log schreiben
'neuen Wert zurücksetzen
Target = neuerWert
end sub


mfg
[-] Folgende(r) 1 Nutzer sagt Danke an Fennek für diesen Beitrag:
  • Rabe
Top
#6
Hallo Ralf,

da keiner die Abläufe im Umgang mit der Tabelle kennt, sind m.E. alle Automatismen sehr fragwürdig. Ich hätte da im Angebot:

worksheet.activate --> da muß vor jedem neuen Eintrag das Blatt verlassen und neu geöffnet werden.
beforeDoubleclick -->  das verlangt, die Zelle per Doppelklick anzuwählen, ist für eine Eingabe eher hinderlich
rightclick--> ähnlich

Steffl´s Version kann ich nichts zu sagen.

Workbook.open fiel mir noch ein, die Spalte 4 in ein Array einlesen und die alten Daten bei Änderung daraus abgreifen. Versagt aber bei einer zweiten Änderung in der gleichen Zelle, ohne dass vorher geschlossen wurde. Evtl. könnte man zum Abschluß Deines Makros das Array aktualisieren. Frage ist, wie das funktioniert, wenn mehrere Leute gleichzeitig auf die Datei zugreifen.
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Top
#7
Hi Ich,

(24.08.2016, 12:46)IchBinIch schrieb: Was hälst Du von einer Inputbox?

danke, gute Idee, so klappt es.

Jetzt kamen gleich neue Anforderungen wie Aufnahme Neu-Bauteil mit Eingabemaske, Passwortabfrage, usw.
Dann setze ich mich jetzt mal daran.
Top
#8
Hi Du Fuchs,

(24.08.2016, 13:05)Fennek schrieb: um sowohl der neuen als auch den vorherigen Wert in das log-file zu schreiben, ist ein Möglichkeit:

das ist auch eine gute Idee.
Top
#9
Hi Edgar,

(24.08.2016, 13:07)BoskoBiati schrieb: da keiner die Abläufe im Umgang mit der Tabelle kennt, sind m.E. alle Automatismen sehr fragwürdig.

ja stimmt, aber mit Ichs und Fenneks Antworten bin ich erst mal zufrieden, das reicht so.
Top
#10
Hallo Ralf,

ich habe hier noch etwas gefunden:
http://www.j-hennekes.de/1783333.htm

Das entspricht den Ansätzen von Stefan und Ralf.

Gruß
Ich
Top


Gehe zu:


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