Moin Kevin,
du schreibst am Code herumgedoktort, ich denke das trifft es.
Lassen wir uns einmal deine fett dargestellte Anweisung "Set rngsource = .Range(Cells(ActiveCell.Row, 4))" zum Frühstück auf der Zunge zergehen.
Die Schreibweise .Range(.... nimmt also Bezug auf das übergeordnete Objekt ActiveSheet.
Da keimt bei mir erstmals die bange Frage: Warum dann ein Workbook_SheetChange(... - Ereignis
Der Nährwert dieser Auswahl besteht doch in erster Linie darin, dass die dort enthaltenen Anweisungen
bei jeder Änderung eines Zellinhaltes eines jeden Arbeitsblattes der aktiven Arbeitsmappe abgearbeitet werden (müssen).
Jetzt grenzt die Anweisung "With ActiveSheet" aber auf das gerade aktive Arbeitsblatt ein.
Das bedeutet einen Widerspruch in sich, denn so eine Konstruktion verwendet man(n) wenn irgendwelche Prozeduren
Änderungen von Zellinhalten in mehreren, oder nicht aktiven Arbeitsblättern bewerkstelligen.
Dagegen gibt es das Synonym "ActiveCell" nur für das gerade aktive Fenster und ist dies nicht gerade der Fall, dann mault die Applikation ohnedies.
Aber zurück zur Schreibweise .Range(.... für den Fall, dass gerade glücklicherweise der Umstand zutrifft, wonach die Änderung auch greift.
Bedeutet, der Variablen rngsource diese aktive Zelle wiederum als Objekt zuzuweisen.
Somit mit der Range-Anweisung ein Ziel in Form einer Adresse zu definieren.
Das darauffolgende "Cells(ActiveCell.Row, 4)", egal ob mit oder ohne führendem Punkt interpretiert sich nochmals selbst wie folgt:
Es wird ein eigenständiges Range-Objekt angenommen und mangels einer gültigen Eigenschaftsanweisung die erste Eigenschaft der Liste, der Inhalt (.Value).
Ergibt nun "Ausgabe", "Einnahme" oder "woswasi".
OK, und nun will die o.g. Range-Anweisung diesen Text in einen Zellbezug umwandeln.
A1Z1 - Notation ist nicht, daher wird nach einem benannten Zellbereich weitergesucht und selbstplaudernd keiner gefunden.
So, nun hat der Interpreter die Nase aber endgültig voll und haucht eine Fehlermeldung aus, verweigert den weiteren Ablauf.
" herumgedoktort " lässt sich auch dieses Manko lösen, dann schreibe es "eben so", die führende Punktation ist bei dem ganzen Code-Murks ohnedies egal.
Set rngsource = Range(Cells(ActiveCell.Row, 4).Address)
es geht aber auch einfach und geschmacklos, dafür aber richtig als Ereignis in der Tabellen-Klasse
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngsource As Range
Set rngsource = Cells(ActiveCell.Row, 4)
If Not Application.Intersect(rngsource, Target) Is Nothing Then
Select Case rngsource.Value
Case "Ausgabe", "Einnahme"
Range(rngsource.Offset(0, 1), rngsource.Offset(0, 2)).Merge
Case Else
Range(rngsource.Offset(0, 1), rngsource.Offset(0, 2)).UnMerge
End Select
End If
End Sub
LG
|