Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1500to1504
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Changelog - löschen mehrere Zellen auf einmal
22.06.2016 10:22:56
Alex
Servus zusammen,
ich habe einen Changelog gebastelt, der ALLE Änderungen in einer Excel Datei protokolliert für alle ersichtlich. Somit einfacher für Nachfragen, wer was wann geändert hat, da es sofort ersichtlich ist.
Es funktioniert auch wunderbar, bis auf 2 Probleme:
1. Problem: Die Funktion "STRG-Z" funktioniert nicht mehr. Ist es mögliche, dass diese Funktion nutzbar ist zusammen mit dem Changelog?
2. Problem: Wie schaffe ich es, wenn ein Nutzer mehrere Zellen markiert und alle auf einmal löscht, alle zu protokollieren?
Aktuell bricht er ja die Protokollierungsfunktion ab, wenn mehr als 1 Zelle markiert wurde... wenn ich diese auskommentiere, wird immer nur die erste der markierten Zellen protokolliert.
Danke für Tipps/Hilfe!
Code befindet sich in "DieseArbeitsmappe":
Option Explicit
Dim vOldVal
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim bBold As Boolean
If Target.Cells.Count > 1 Then Exit Sub '
On Error Resume Next
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
If IsEmpty(vOldVal) Then vOldVal = ""
bBold = Target.HasFormula
With Worksheets("Changelog")
.Unprotect Password:="Secret"
If .Range("A1") = vbNullString Then
.Range("A1:G1") = Array("Veränderte Zelle", "Verändertes Arbeitsblatt", " _
Alter Inhalt", _
"Neuer Inhalt", "Änderungszeit", "Änderungsdatum", "Benutzer")
End If
With .Cells(.Rows.Count, 1).End(xlUp)(2, 1)
.Value = Target.Address
.Offset(0, 1) = Sh.Name
.Offset(0, 2) = vOldVal
With .Offset(0, 3)
If bBold = True Then
.ClearComments
End If
.Value = Target
.Font.Bold = bBold
End With
.Offset(0, 4) = Time
.Offset(0, 5) = Date
.Offset(0, 6) = Application.UserName
End With
.Cells.Columns.AutoFit
.Protect Password:="Secret"
End With
vOldVal = vbNullString
With Application
.ScreenUpdating = True
.EnableEvents = True
End With
On Error GoTo 0
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
vOldVal = Target
End Sub
Gruß Alex

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
keine Lösung, aber
25.06.2016 13:53:20
Michael
Hi Alex,
spiele mal damit herum:
Option Explicit
Dim vOldVal, oAd As String, isArr As Boolean
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim bBold As Boolean
If isArr Then
MsgBox "Arr: " & CStr(isArr) & " anzahl: " & UBound(vOldVal) & vbLf & _
" l.W. " & vOldVal(UBound(vOldVal), 1) & " oad " & oAd & vbLf & _
"Tar >0: " & (Target.Count > 0) & vbLf & _
" T.count: " & Target.Count & vbLf & _
" l.W. " & Target(Target.Count)
Else
MsgBox isArr & " nur 1, und tar " & Target.Count & " oad " & oAd
End If
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
isArr = Target.Count > 1
vOldVal = Target
oAd = Target.Address
End Sub
Ein grundsätzliches Problem bei einer Zuweisung á la vOldVal = Target ist, daß der Variant sowohl einen einzelnen Zellwert aufnehmen kann als auch mehrere, dann ist er ein Array.
Das muß also immer geprüft werden, sei es wie hier mit einer Variablen oder schlicht mit IsArray().
Beim Experimentieren wirst Du herausfinden, daß isArr auch dann false ist, wenn Du einen Bereich kopierst.
Weiterhin führt z.B. das Löschen oder Einfügen von Zeilen zu "seltsamen" Effekten (z.B. daß das Makro bei zwei Zeilen auch zweimal "anspringt").
Ähnlich ist es mit dem Strg-Z...
Ein 100%-Changelog würde eigentlich erfordern, daß alles ausgeschaltet wird, was die Struktur des Blattes verändern könnte...
Genaugenommen mußt Du die komplette Datei sperren und für jede Benutzereingabe eine Inputbox anlegen.
Damit möchte natürlich keiner arbeiten.
Zumindest die Sache mit Bereichen kannst Du mit application.undo in den Griff bekommen, d.h. Du ...
- sicherst die Inhalte von Target,
- machst das Undo, sicherst die vorhergehenden Inhalte
- schreibst die Werte von vor dem Undo wieder zurück
(ein Undo-Undo geht nicht, außerdem wird die Undo-Liste gelöscht, sobald VBA im Spiel ist, das läßt sich nicht umgehen)
Kurzum: es ist komplizierter, alle Eventualitäten abzufangen als mit UFs zu arbeiten.
Schöne Grüße,
Michael

Anzeige
AW: keine Lösung, aber
27.06.2016 14:59:51
Alex
Hallo Michael,
danke für deine Hilfe. Ich werde diese Woche damit ein bisschen rumbasteln und ich hoffe, dass eine Lösung drauß wird.
Richtig. Ich habe eine Wissensdatenbank mit mehreren Zusatzfunktionen in Excel per VBA als Abschlussarbeit für meine Firma erstellt. Dort ist die Eingabe/Löschen/Ändern nur über eine Userform möglich und alle anderen Funktionen sind gesperrt. Da war es recht einfach den Changelog zu implementieren, da einfach das Eingabefeld bzw. die ausgewählten Parametern aus der Userform abgegriffen werden konnten.
Das lässt sich hier definitiv nicht realisieren. Es existiere aber trotzdem Vorgaben, welche Zellen nur beschriftet/verändert werden dürften. Spalten/Zellen einfügen geht z.b. auch nicht.
Es gibt leider ein Tabellenblatt, in diesen man eben bis zu 5 Spalten markieren kann und diese auf einmal löschen (Inhalt, nicht komplett entfernen)kann.
Ich melde mich, ob es klappt ;)
Gruß+Danke,
Alex

Anzeige
AW: keine Lösung, aber
27.06.2016 17:42:33
Michael
Hi Alex,
tja, da mußt Du ja prinzipiell auch das Problem handeln, daß 5 SPALTEN viele, viele Werte enthalten können: willst Du das wirklich Zelle für Zelle im Log abbilden?
Ich meine, grundsätzlich geht das ja, aber das bläht das Log so auf, daß Du in Nullkommanix sehr viele Zeilen hast....
Hier noch eine Spielerei: lösche einfach mal die Spalte E4:E17 und schau Dir das Log an:
https://www.herber.de/bbs/user/106567.xlsm
Man könnte die komplette Ausgabe ins Log schreiben; das wird im Moment nur via MsgBox ausgegeben.
Der ins Array gesicherte Bereich könnte auch einer globalen Variablen zugewiesen werden (einfach ein Variant), damit könnte man evtl. Strg+Z "simulieren", das man auf einen Hotkey legt.
Schöne Grüße,
Michael
Anzeige

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige