Worksheet_Change und Target als Array
16.05.2020 13:36:13
Clemens
ich habe seid einigen Tagen das Problem was ich gleich schildern möchte:
ich habe eine Eingabemaske gebastelt in der im Zellverbund D11:E11 eine Formel steht "=WENN(A11=0;"";A11)", da ich die 0 leider aus anderen Gründen nicht ausblenden kann. Diese Zelle D11:E11 ist aber gleichzeitig auch ein Eingabefeld und soll überschrieben werden können. So weit so gut. Nun soll aber wenn die Zelle geleert wird wieder die Formel rein geschrieben werden.
Dafür habe ich ein Worksheet_Change eingerichtet:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Target = Functions.eraseArray(Target)
If Target.value = "" Then
Target.FormulaLocal = "=WENN(A" & Target.row & "=0;"""";A" & Targfet.row & ")"
End If
Application.EnableEvents = True
End Sub
in dem Modul Functions ist jetzt die function eraseArray und hier beginnt auch meine Frage.Wenn ich in einen Zellverbund schreibe wird als Target nur die erste Zelle des Verbundes übergeben und ich habe kein Array. Wenn ich aber die Zelle leere (entweder mit entf, Inhalt löschen und enter drücken, macht keinen unterschied) dann wird der ganze Verbund als Array übergeben und genau das möchte ich abfangen, da sonst z.B. Target.Value nicht funktioniert. Natürlich könnte ich den gesamten Code mit IsArray doppelt schreiben, aber das würde ich gerne vermeiden um es meinem Nachfolger ein weniger lesbarer und einfacher zu bearbeiten zu machen (bin vermutlich eh ich selber :-) ).
In eraseArray habe ich schon einiges versucht aber bekomme immer wieder die Range als Array zurück und verzweifle so langsam :-).
Mein Ansatz:
1 Function eraseArray(arr as Range) As Range
2 If IsArray(arr) Then
3 Set eraseArray = Arr.Cells(1, 1)
4 Else
5 Set eraseArray = arr
6 End If
7 End Function
In Zeile 3 habe ich schon "alles" versucht. Zum mindest alles was mir eingefallen ist, um in eraseArray nur die obere Linke Zelle des Arrays zu schreiben. Da ich für mein aktuelles Projekt schon ungefähr 200 Stunden als stummer Teilnehmer verbracht habe, bin ich mir sicher hier finde ich ein offenes Ohr.
Vielen Dank fürs lesen
Clemens
PS: es könnten kleine Rechtschreibfehler im Code sein, die daher kommen, dass ich ihn abtippen musste.