Hi,
da hast du aber Glück gehabt, dass du meinen Code vorne hin gesetzt hast. Umgekehrt wäre es nicht gegangen, da der zweite Code rigoros abbricht, falls seine Bedingungen nicht erfüllt sind. Dabei ist es ihm egal, ob weiter hinten noch weitere Bedingungen für andere Bereiche kommen.
Korrekt könnte es so aussehen:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Bereich As Range
Dim Zelle As Range
Dim temp As Variant
Dim Vorlage As Worksheet
Set Vorlage = Worksheets(Me.Name & "_V")
Set Bereich = Intersect(Target, Me.Range(Vorlage.UsedRange.Address))
If Not Bereich Is Nothing Then
For Each Zelle In Bereich.Cells
If IsEmpty(Zelle) Then
temp = Vorlage.Range(Zelle.Address)
If Not IsEmpty(temp) Then
Application.EnableEvents = False
On Error Resume Next
Zelle = temp
On Error GoTo 0
Application.EnableEvents = True
End If
End If
Next Zelle
End If
If Not Intersect(Target, Range("F6:F46,M6:M57,T6:T44")) Is Nothing Then
If Target.Count = 1 Then
If Target = "" Then
Target.Offset(0, 1).ClearContents
Else
Target.Offset(0, 1) = Format(Now, "hh:mm")
End If
End If
End If
End Sub
Habe jetzt nur mal die Abfrage der einzelnen Bedingungen in der zweiten Hälfte verändert, so dass eventuell folgende weitere Codes verarbeitet werden können. Allerdings hat der zweite Code noch einige Nachteile. So wird die gleichzeitige Verarbeitung von mehreren Zellen nicht unterstützt. Außerdem wird nur ein Text in die Nachbarzelle geschrieben, der wie eine Uhrzeit aussieht. Mit einem Text kann aber nicht vernünftig weiter gearbeitet werden. Außerdem wird durch das Schreiben in eine Zelle das Change-Ereignis erneut ausgelöst. Oft führt das zu einer Endlosschleife, hier eher nicht. Aber schön ist das nicht.
Ich würde das Ganze so schreiben:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Bereich As Range
Dim Zelle As Range
Dim temp As Variant
Dim Vorlage As Worksheet
Set Vorlage = Worksheets(Me.Name & "_V")
Set Bereich = Intersect(Target, Me.Range(Vorlage.UsedRange.Address))
If Not Bereich Is Nothing Then
Application.EnableEvents = False
On Error Resume Next
For Each Zelle In Bereich.Cells
If IsEmpty(Zelle) Then
temp = Vorlage.Range(Zelle.Address)
If Not IsEmpty(temp) Then
Zelle = temp
End If
End If
Next Zelle
On Error GoTo 0
Application.EnableEvents = True
End If
Set Bereich = Intersect(Target, Range("F6:F46,M6:M57,T6:T44"))
If Not Bereich Is Nothing Then
Application.EnableEvents = False
On Error Resume Next
For Each Zelle in Bereich
If Zelle = "" Then
Zelle.Offset(0, 1).ClearContents
Else
Zelle.Offset(0, 1) = Now
End If
Next Zelle
On Error GoTo 0
Application.EnableEvents = True
End If
End Sub
Ich habe auch mal noch das Abschalten der Events im ersten Teil weiter nach außen gepackt. Das ist noch ein klein wenig resourcenschonender. Dies wirkt sich allerdings nur minimal aus und nur dann, wenn viele Zellen mit "Vorbelegung" gleichzeitig gelöscht werden.
Die Zellen in G, N und S musst du halt einmalig als Uhrzeit formatieren. Falls dich stört, dass das Datum mit gespeichert wird (auch wenn man es dann nicht sieht), dann schreibst du statt
Now einfach
Now - CLng(Now)