Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1368to1372
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
Inhaltsverzeichnis

Historie Funktion - ausgeblendete Zeilen = Fehler

Historie Funktion - ausgeblendete Zeilen = Fehler
04.07.2014 11:11:59
Robert
Hallo zusammen,
Ich schreibe grade an einer allgemeinen Historiefunktion für Excel-Arbeitsmappen, die von mehreren Personen auf einem Netzlaufwerk verändert werden können.
Sobald eine Zeile geändert wird, wird diese markiert, mit einem Kommentar versehen und die Änderung für jede Einzelne Zelle in Chronologischer Reihenfolge in ein Tabellenblatt "History" geschrieben.
' Begin history function + marking of changed cells
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim intSpalte As Integer, lngZeile As Long, strBuchstabe1 As String, strBuchstabe2 As  _
String
Dim varArray_neu As Variant, varArray_alt As Variant, intArrayspalte As Integer, strAdresse  _
_
As String
Dim lngArrayzeile As Long, varAlt As Variant, varNeu As Variant
' Defining sheet in which changes are logged
If Sh.Name  "History" Then
' When changing multiple cells at once:
If Target.Count > 1 Then varArray_neu = Range(Target.Address) Else varNeu = Target
strAdresse = Selection.Address
With Application
.ScreenUpdating = False
.EnableEvents = False
.Undo
End With
If Target.Count > 1 Then
varArray_alt = Range(Target.Address)
Application.Undo
With Worksheets("History")
For intSpalte = Target.Column To Target.Column + Target.Columns.Count - 1
intArrayspalte = intArrayspalte + 1
lngArrayzeile = 0
For lngZeile = Target.Row To Target.Row + Target.Rows.Count - 1
lngArrayzeile = lngArrayzeile + 1
If varArray_alt(lngArrayzeile, intArrayspalte)  varArray_neu( _
lngArrayzeile, intArrayspalte) Then
'Marking cells that are changed (yellow color and comment):
Target.Interior.ColorIndex = 6
Target.NoteText "This cell was modified last on " & Format(Date, "  _
_
MMM dd yyyy") & ", see history for details "
'Inserting into protocol sheet:
Worksheets("History").Unprotect Password:="zugang"
.Rows(2).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow
.Rows(2).ClearContents
.Rows(2).ClearFormats
.Cells(2, 1) = Now
.Cells(2, 2) = Sh.Name
.Cells(2, 3) = Cells(lngZeile, intSpalte).Address(0, 0)
.Cells(2, 4) = varArray_alt(lngArrayzeile, intArrayspalte)
.Cells(2, 5) = varArray_neu(lngArrayzeile, intArrayspalte)
.Cells(2, 6) = ActiveWorkbook.BuiltinDocumentProperties(7).Value
Worksheets("History").Protect Password:="zugang", AllowFiltering:=  _
_
True
End If
Next
Next
End With
'When changing only one cell:
Else
varAlt = Range(Target.Address)
Application.Undo
With Worksheets("History")
If varAlt  varNeu Then
'Marking cells that are changed (yellow color and comment):
Target.Interior.ColorIndex = 6
Target.NoteText "This cell was modified last on " & Format(Date, "MMM dd  _
yyyy") & ", see history for details "
'Inserting into protocol sheet:
Worksheets("History").Unprotect Password:="zugang"
.Rows(2).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow
.Rows(2).ClearContents
.Rows(2).ClearFormats
.Cells(2, 1) = Now
.Cells(2, 2) = Sh.Name
.Cells(2, 3) = Target.Address(False, False)
.Cells(2, 4) = varAlt
.Cells(2, 5) = varNeu
.Cells(2, 6) = ActiveWorkbook.BuiltinDocumentProperties(7).Value
Worksheets("History").Protect Password:="zugang", AllowFiltering:=True
End If
End With
End If
Range(strAdresse).Select
With Application
.ScreenUpdating = True
.EnableEvents = True
End With
End If
End Sub

Nun habe ich das Problem, dass meine Funktion nicht mit mehreren, nicht zusammenhängenden Zellen funktionert. Eine Lösung hierfür wäre vmtl. zu aufwändig und auch nicht zielführend.
Deshalb wurde die Funktion, mit STRG+Click mehrere unabhängige Felder auszuwählen deaktiviert.
' blocking CTRL + click function to avoid overflow
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Areas.Count > 1 Then
MsgBox "Editing for multiple, non connected cells has been deactivated.", 48, "Warning"
Application.EnableEvents = False
Range(Target.Address).Cells(1, 1).Select
Application.EnableEvents = True
End If
End Sub

Dies funktioniert zufriedenstellend.
Problem: Bei verwenden von Filtern oder generell ausgeblendeten Zeilen kommt die Funktion nicht klar. Ich bin nun mit meinem Latein am Ende, da ich den Code auch größtenteils nur zusammenkopiert und nicht selbst geschrieben habe.
Gibt es eine Möglichkeit, beim Schreiben der Selection in das Array sämtliche ausgeblendeten Zeilen zu ignorieren?

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Historie Funktion - ausgeblendete Zeilen = Fehler
04.07.2014 11:41:39
Nepumuk
Hallo,
1. Würde ich nicht in die selbe Mappe protokollieren, das ist zu langsam und bläht die Mappe nur unnötig auf.
2. Würde ich nicht mit Undo-Do arbeiten, viel zu langsam.
Schau mal hier: http://www.office-loesung.de/ftopic599975_0_0_asc.php
ist zwar etwas mehr Code, aber das kann dem Benutzer ja egal sein, oder besser, er sollte nichts davon bemerken. Deine Kommentarausgabe einzubauen sollte kein Problem sein, dabei kann ich dir bei Bedarf auch helfen.
Gruß
Nepumuk

AW: Historie Funktion - ausgeblendete Zeilen = Fehler
04.07.2014 12:40:42
Robert
Hallo Nepomuk, danke für die schnelle Antwort!
zu 1: Das Protokoll muss in die selbe Mappe. Das hat den Hintergrund, dass die Mitarbeiter die Files vom Netzlaufwerk ziehen können (und auch dürfen), offline in verschiedenen Meetings bearbeiten und anschließend wieder hochladen oder per Email an verschiedene Standorte weitergeben etc. egal wohin das File Wandert, eventuelle Änderungen sollen mit Benutzernamen (Konzernweit unique) protokolliert werden (auch bei Offlinenutzung). Dazu werden die Nutzer zum aktivieren vom Makros gezwungen und
zu 2: Okay, Undo/Do ist zu langsam. Geschwindigkeit ist eigentlich nebensächlich, da im Normalfall nur 1-20 Zellen auf einmal geändert werden, maximal vllt 100 zellen (nicht Zeilen!) auf einmal gelöscht werden.
Wenn es da eine elegantere Lösung gibt, die vllt auch gleichzeitig mein Problem mit dem Filter löst, sehr gerne. :)
Frage:
Ist es denn (von der Performance jetzt mal abgesehen) möglich, dieses Problem mit den Ausgeblendeten Zellen im bestehenden Code zu beheben?

Anzeige
AW: Historie Funktion - ausgeblendete Zeilen = Fehler
04.07.2014 14:39:38
Robert
Hallo nochmal ich hab mal ein bisschen rumgepfuscht...
Statt Target.Adress benutze ich nun Target.SpecialCells(xlCellTypeVisible).Adress
Nun habe ich das Problem, dass ich diese beiden Schleifen nicht auf Sichtbare Spalten und Zeilen beschränken kann. Hilfe!
For intSpalte = Target.Column To Target.Column + Target.Columns.Count - 1
intArrayspalte = intArrayspalte + 1
lngArrayzeile = 0
For lngZeile = Target.Row To Target.Row + Target.Rows.Count - 1
lngArrayzeile = lngArrayzeile + 1
If varArray_alt(lngArrayzeile, intArrayspalte)  varArray_neu( _
lngArrayzeile, intArrayspalte) Then
'Marking cells that are changed (yellow color and comment)
'Inserting into protocol sheet
End If
Next
Next

Anzeige
AW: Historie Funktion - ausgeblendete Zeilen = Fehler
04.07.2014 16:21:42
Robert
Häckchen für aktiv vergessen

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige