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?