Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1348to1352
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

zwei Bereiche auf Änderungen überwachen

zwei Bereiche auf Änderungen überwachen
21.02.2014 10:06:46
Schmecks
Hallo Leute,
nachdem letzens beim Erstellen einer Logdatei sehr geholfen wurde, wollte ich nun das Event Worksheet_Change um einen Bereich erweitern. Ich erzeuge in einer gesperrten und automatisch über Wenn-Bedingungen generierten Zelle folgende Zeichen:
1. "-" steht für in Bearbeitung / offen (Arial)
2. "ü" steht für in Erledigt (Wingdings)
3. "û" steht für in Problem (Wingdings)
Da ich die Schriftart nicht über eine bedingte Formatierung ändern kann, folgende Lösung über VBA. Leider funktiniert die Lösung nur in einer eingeständigen datei und nicht in Zusammenhang mit dem nachstehenden Code. Hier hätte ich gern Hilfe bzw. eine Erklärung.
Option Explicit
Dim intRow As Integer
Dim intDate As Long
Dim wks As Worksheet
Dim strAlterWert As String
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Bereich As Range
Dim c As Range
Set Bereich = Range("B10:B3000") '   Bereich der Wirksamkeit
If InStr(Target.Address, ":") = 0 Then  '   wurden mehere Zellen markiert ist Wert größer 0
If Intersect(Target, Bereich) Is Nothing Then Exit Sub  ' Abbruch, wenn Aktion nicht im  _
Zielbereich
ActiveSheet.Unprotect ("abc")
For Each c In Target
Select Case LCase(c.Value)
Case "-": c.Font.Name = "Arial"
c.Font.ColorIndex = 5
c.Font.Size = 10
Case "ü": c.Font.Name = "Wingdings"
c.Font.Size = 10
Case "û": c.Font.Name = "Wingdings"
c.Font.Size = 10
Case Else
c.Font.ColorIndex = 0
End Select
Next
'ActiveSheet.Protect ("abc")
End If
Set wks = Worksheets("Log")
If Intersect(Range("C10:AD3000"), Target) Is Nothing Then Exit Sub
If Target.Cells.Count > 1 Then Exit Sub
On Error Resume Next
Application.ScreenUpdating = False
wks.Unprotect ("abc")
With wks
intRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
.Cells(intRow, 1).Value = ActiveSheet.Name
.Cells(intRow, 2).Value = Target.Address(0, 0)
.Cells(intRow, 3).Value = strAlterWert
.Cells(intRow, 4).Value = Target.Value
.Cells(intRow, 5).Value = Application.UserName
.Cells(intRow, 6).Value = Environ("Computername")
.Cells(intRow, 7).Value = Date
.Cells(intRow, 8).Value = Time
End With
wks.Protect ("abc")
Application.ScreenUpdating = True
On Error GoTo 0
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Intersect(Range("C10:AD3000"), Target) Is Nothing Then Exit Sub
If Target.Cells.Count > 1 Then Exit Sub
strAlterWert = Target.Value
ErrorExit:
End Sub

mfg der Schmecks

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: zwei Bereiche auf Änderungen überwachen
21.02.2014 10:18:16
EtoPHG
Hallo Schmecks,
Bitte erläutere, Zitat: Leider funktiniert die Lösung nur in einer eingeständigen datei und nicht in Zusammenhang mit dem nachstehenden Code.
Ich kann mir darunter überhaupt nichts vorstellen!
Übrigens: Statt InStr(Target.Address, ":") = 0, besser Target.Count > 1
Der For Each c In Target Loop ist völlig überflüssig, da ja nur 1 Zelländerung zugelassen ist.
ActiveSheet... ist überflüssig, da sich der Code in einer Blattklasse befindet, beziehen sich alle (unreferenzierte) Bereiche/Methoden auf dieses Blatt.
Gruess Hansueli

Anzeige
AW: zwei Bereiche auf Änderungen überwachen
21.02.2014 11:17:29
Bastian
Hallo Schmecks,
da Du nun zwei Bedingungen beim Change-Ereignis abfragen möchtest, musst Du den Code etwas umstrukturieren. Erst wird überprüft, ob die Änderung im Zielbereich B10:B3000 erfolgt ist. Wenn ja, wird der entsprechende Code abgearbeitet. Wenn die Änderung nicht im Bereich B10:B3000 erfolgt ist, wird der Code an der Sprungmarke "Log" fortgesetzt. Die Befehle zum Aufheben und Setzen des Blattschutzes habe ich vorerst auskommentiert, da Du in einem geschützten Blatt keine Änderungen vornehmen kannst und dann auch das Change-Ereignis nicht funktioniert (es sei denn, Du nimmst bestimmte Bereiche aus dem Blattschutz raus).
Gruß, Bastian
Option Explicit
Dim intRow As Integer
Dim intDate As Long
Dim wks As Worksheet
Dim strAlterWert As String
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
If Intersect(Target, Range("B10:B3000")) Is Nothing Then GoTo Log  'wenn Aktion nicht im  _
Zielbereich, gehe weiter zu Log
'ActiveSheet.Unprotect ("abc")
With Target
Select Case .Value
Case "-": .Font.Name = "Arial"
.Font.ColorIndex = 5
.Font.Size = 10
Case "ü": .Font.Name = "Wingdings"
.Font.Size = 10
Case "û": .Font.Name = "Wingdings"
.Font.Size = 10
Case Else
.Font.ColorIndex = 0
End Select
End With
'ActiveSheet.Protect ("abc")
Log:
Set wks = Worksheets("Log")
If Intersect(Range("C10:AD65536"), Target) Is Nothing Then Exit Sub
On Error Resume Next
wks.Unprotect ("abc")
With wks
intRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
.Cells(intRow, 1).Value = ActiveSheet.Name
.Cells(intRow, 2).Value = Target.Address(0, 0)
.Cells(intRow, 3).Value = strAlterWert
.Cells(intRow, 4).Value = Target.Value
.Cells(intRow, 5).Value = Application.UserName
.Cells(intRow, 6).Value = Environ("Computername")
.Cells(intRow, 7).Value = Date
.Cells(intRow, 8).Value = Time
End With
wks.Protect ("abc")
On Error GoTo 0
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' Verhindern, dass mehr als eine Zelle selektiert wird
On Error GoTo ErrorExit
Application.EnableEvents = False
ActiveCell.Select
ErrExit:
Application.EnableEvents = True
If Intersect(Range("C10:AD65536"), Target) Is Nothing Then Exit Sub
If Target.Cells.Count > 1 Then Exit Sub
'Wert der ausgewaehlten Zelle merken, um im Changelog den alten Zellwert zu dokumentieren
strAlterWert = Target.Value
ErrorExit:
End Sub

Anzeige
AW: zwei Bereiche auf Änderungen überwachen
25.02.2014 10:46:52
Schmecks
Hallo Bastian,
Danke für Deine Hilfe, das Prinzip habe ich jetzt verstanden. Leider funktioniert der Code noch nicht wie gewünscht.
In der schreibgeschützten Spalte B steht folgende Formel:
=WENN(UND(E67"";ODER(C67="DDD";C67="EEE";C67="BBB"));"-";WENN(UND(E67"";AB67="x");"ü"; WENN(UND(E67"";AB67="");"û";"")))
Das heißt, das einmal die Änderungen aus den Bereich C10:C3000 im Tabellenblatt "Log" protokolliert werden sollen und zum anderen in der Spalte B (B10:B3000) entsprechend der Formel, die Schriftart je nach Zeichen automatisch angepasst wird.
Wie kann ich das umsetzten?
Den Blattschutz benötige ich, da nur Änderungen im Bereich C10:C3000 zulässig sind.
mfg der Schmecks

Anzeige
AW: zwei Bereiche auf Änderungen überwachen
25.02.2014 11:15:29
EtoPHG
Hallo Schmecks,
Wenn Zellen ihren Inhalt durch Formel-Resultate ändern, wie in deinem Fall in Spalte B, wird nie ein _Change Ereignis ausgelöst. Solchen Änderungen müsstes du mit dem _Calculate Ereignis überwachen. Allerdings finde ich das gefährlich, da du ja vermutlich noch mehr als nur diese Formeln im Blatt hast. In deinem Fall müsstest du die Veränderung in Spalte C, E und AB nach den Bedingungen in der Formel so auswerten, dass du entsprechend die Farben in B setzten könntest.
Gruess Hansueli

AW: zwei Bereiche auf Änderungen überwachen
25.02.2014 13:01:03
Schmecks
Hallo,
achso ... jetzt wieder was gelernt. Aber warum müsste ich die Spalten C, E und AB auswerten?
Ich kann das Calculate Ereignis doch wie schon gehabt nur auf diesen Bereich B10:B3000 beziehen. Diese Spalte "B" kann nur die Werte "-", "ü" oder "û" annehmen. Sollte funktionieren oder übersehe ich etwas?
So wäre mein Ansatz:
Private Sub Worksheet_Calculate()
Dim Target As Range
Set Target = ActiveSheet.Range("B10:B3000").SpecialCells(xlCellTypeFormulas)
If Not Target Is Nothing Then Exit Sub
ActiveSheet.Unprotect ("abc")
With Target
Select Case .Value
Case "-": .Font.Name = "Arial"
.Font.ColorIndex = 5
.Font.Size = 10
Case "ü": .Font.Name = "Wingdings"
.Font.Size = 10
Case "û": .Font.Name = "Wingdings"
.Font.Size = 10
Case Else
.Font.ColorIndex = 0
End Select
End With
ActiveSheet.Protect ("abc")
End Sub
mfg der Schmecks

Anzeige
AW: zwei Bereiche auf Änderungen überwachen
25.02.2014 13:16:40
EtoPHG
Hallo Schmecks,
Nein kannst du nicht: Weil das _Calculate Ereignis kein Target kennt! Das heisst du müsstest jedesmal ALLE zellen in B, welche die Formel enthalten auf ihren Zustand (nach der Berechnung) überprüfen. Das ist einer der Gründe, warum dieses Ereignis nicht für jeden Fall geeignet ist, besonders dann, wenn eine grosse Anzahl Zellen überprüft werden muss.
Da die Resultat von B vom Inhalt von C, E und AB abhängen, sage ich: Wenn eine Zelle in diesen Spalten geändert hat, sollte das Setzen der Farben/Schriftart in der entsprechen Zelle in Spalte B erfolgen.
Gruess Hansueli

Anzeige
AW: zwei Bereiche auf Änderungen überwachen
25.02.2014 13:34:04
Schmecks
Ok.
Ein anderer Ansatz der mir noch in den Sinn kommen würde, wäre die Berechung der Formel von VBA durchführen zu lassen und gleich die Bedingungen der Schriftwahl mit einzubauen. Geht sowas?
mfg der Schmecks

genau den Ansatz empfehle ich doch! (owT)
25.02.2014 13:50:01
EtoPHG

AW: genau den Ansatz empfehle ich doch! (owT)
25.02.2014 14:35:20
Schmecks
Ok. Wie stelle ich das an? Ich habe keine Ahnung wie ich das im VBA umsetzte. In Excel hab ich damit kein Problem. Kannst du mir an dieser Stelle nochmals helfen?
Meine Formel habe ich schon mal mit dem Makrorecorder wie folgt erzeugt:
Sub Status_Berechnung()
Range("B1466").Select
ActiveCell.FormulaR1C1 = _
"=IF(AND(RC[3]"""",OR(RC[1]=""DDD"",RC[1]=""EEE"",RC[1]=""BBB"")),""-"",IF(AND(RC[3] _
"""",RC[26]=""x""),""ü"",IF(AND(RC[3]"""",RC[26]=""""),""û"","""")))"
Range("C1466").Select
ActiveCell.FormulaR1C1 = "DDD"
Range("B1466").Select
With Selection.Font
.Name = "Arial"
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = 2
End With
Range("B1467").Select
End Sub

Anzeige
Alles in einem....
25.02.2014 15:26:39
EtoPHG
Hallo Schmecks,
So, ersetze den ganzen Tabellencode durch
Option Explicit
Dim strAlterWert As String
Private Sub Worksheet_Change(ByVal Target As Range)
Dim intRow As Long
Dim wks As Worksheet
If Target.Cells.Count > 1 Then Exit Sub
If Intersect(Range("C10:AD65536"), Target) Is Nothing Then Exit Sub
Set wks = Worksheets("Log")
On Error Resume Next
With wks
.Unprotect ("abc")
intRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
.Cells(intRow, 1).Value = ActiveSheet.Name
.Cells(intRow, 2).Value = Target.Address(0, 0)
.Cells(intRow, 3).Value = strAlterWert
.Cells(intRow, 4).Value = Target.Value
.Cells(intRow, 5).Value = Application.UserName
.Cells(intRow, 6).Value = Environ("Computername")
.Cells(intRow, 7).Value = Date
.Cells(intRow, 8).Value = Time
.Protect ("abc")
End With
On Error GoTo 0
If Target.Column = 3 Or _
Target.Column = 5 Or _
Target.Column = 28 Then
Application.EnableEvents = False
With Cells(Target.Row, 2)
.Calculate
Select Case .Text
Case "-": .Font.Name = "Arial"
.Font.ColorIndex = 5
.Font.Size = 10
Case "ü": .Font.Name = "Wingdings"
.Font.Size = 10
Case "û": .Font.Name = "Wingdings"
.Font.Size = 10
Case Else
.Font.ColorIndex = 0
End Select
End With
Application.EnableEvents = True
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' Verhindern, dass mehr als eine Zelle selektiert wird
On Error GoTo ErrorExit
Application.EnableEvents = False
ActiveCell.Select
ErrExit:
Application.EnableEvents = True
If Intersect(Range("C10:AD65536"), Target) Is Nothing Then Exit Sub
If Target.Cells.Count > 1 Then Exit Sub
'Wert der ausgewaehlten Zelle merken, um im Changelog den alten Zellwert zu dokumentieren
strAlterWert = Target.Text
ErrorExit:
End Sub
Gruess Hansueli

Anzeige
AW: Alles in einem....
25.02.2014 17:50:25
Schmecks
Danke erstmal. Hattest du den Code getested?
Also bei mir zeigt sich nicht die gewünschte Veränderung.
Es wird aber auch keine Fehlermeldung ausgegeben.
mfg der Schmecks

AW: Alles in einem....
25.02.2014 18:59:08
EtoPHG
Hallo,
Zitat: Hattest du den Code getested?
Glaubst du wirklich, ich baue deine Mappe nach?
Ich bin dann raus. Lass dir's schmecken! :-(
Gruess Hansueli

AW: Alles in einem....
26.02.2014 06:55:38
Schmecks
ich könnte dir die Mappe auch zur Verfügung stellen,
wenn das hilft.
mfg der Schmecks und Danke noch mal für Deine Ausdauer und Geduld ;)

Und warum machst du es nicht?
26.02.2014 08:49:04
EtoPHG
Hallo Schmecks,
Anonymisiere die Daten in der Mappe und lade sie ins Forum!
Gruess Hansueli

Anzeige
AW: Und warum machst du es nicht?
26.02.2014 15:36:27
Schmecks
Hallo,
ich schaffe das heut nicht zu annoymisieren, werde aber morgen soweit sein.
Dann lade ich es hoch und in der Hoffnung das wir eine Lösung finden.
mfg der Schmecks

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige