Wieder einmal ein Kampf mit einem UDF
Mit der Funktion NULL4 prüfe ich, ob in den übergebenenen Bereichen 1,2,3,4 (alles gleichgrosse Spaltenbereiche) auf der gleichen Zeile 4 x eine Null vorkommt.
Die Funktion lief bisher prima, nur wenn ich diese gleichzeitig an mehreren Orten verwende, gibt es ein Durcheinander.
Deshalb habe ich versucht, die Anwendung mit einer WITH -- END WITH Regelung einzugrenzen.
Dabei habe ich bei allen übergebenen Bereichen, also rngA, rngB, rngC und rngD einen Punkt vorneangesetzt.
Ich habe versucht WITH ThisWorkbook, With rngA.Parent.Parent, With Application.Caller.Parent und With Application.Caller.Parent.Parent
Doch bei allen Varianten erhalte ich jetzt als Ergebnis #WERT!
Was mache ich falsch? Die Funktion sollte innerhalb der gleichen Datei an verschiedenen Orten aufgerufen werden können und auch wenn diese in mehreren offenen Dateien verwendet wird, sollte die Funktion nicht durch andere Aufrufe gestört werden.
Wer kann mir helfen?
Gruss, Peter
Function NULL4(rngA As Range, rngB As Range, rngC As Range, rngD As Range, dummy As Date) As _
String
Dim zz As Long, rngT As Range, lngT As Long, lngB As Long, lngC As Long, lngD As Long
With Application.Caller.Parent.Parent
If .rngA.Columns.Count * .rngB.Columns.Count * .rngC.Columns.Count * .rngD.Columns.Count _
1 Then
NULL4 = "Jeder Bereich muss einspaltig sein."
ElseIf .rngA.Areas.Count .rngB.Areas.Count Or _
.rngB.Areas.Count .rngC.Areas.Count Or _
.rngC.Areas.Count .rngD.Areas.Count Then
NULL4 = "Die Bereiche müssen gleich viele Teilbereiche haben."
ElseIf .rngA.Row .rngB.Row Or .rngB.Row .rngC.Row Or .rngA.Row .rngD.Row Then
NULL4 = "Die Bereiche müssen in der selben Zeile beginnen."
ElseIf .rngA.Count = .rngB.Count And .rngA.Count = .rngC.Count And .rngA.Count = .rngD.Count _
Then
lngB = .rngB.Column
lngC = .rngC.Column
lngD = .rngD.Column
For Each rngT In .rngA.Areas
For zz = 1 To rngT.Count
lngT = rngT.Rows(zz).Row
If rngT(zz).EntireRow.Hidden Then
ElseIf IsEmpty(rngT(zz)) Or _
IsEmpty(.Cells(lngT, lngB)) Or IsEmpty(.Cells(lngT, lngC)) Or IsEmpty(.Cells( _
lngT, lngD)) Then
ElseIf rngT(zz) = 0 And _
.Cells(lngT, lngB) = 0 And .Cells(lngT, lngC) = 0 And .Cells(lngT, lngD) = 0 _
Then
If Len(NULL4) > 0 Then NULL4 = NULL4 & ";"
NULL4 = NULL4 & CStr(zz + rngT.Row - 1)
End If
Next zz
Next rngT
If NULL4 = "" Then NULL4 = "OK"
Else
NULL4 = "Alle Bereiche müssen gleiche Zeilenzahl haben."
End If
End With
End Function