Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1260to1264
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

UDF soll nicht andere UDFs beeinträchtigen

UDF soll nicht andere UDFs beeinträchtigen
Peter
Guten Tag
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

AW: UDF soll nicht andere UDFs beeinträchtigen
27.04.2012 12:52:29
Reinhard
Hallo Peter,
setz mal bei
With Application.Caller.Parent.Parent
einen Haltepunkt und gehe dann mit F8 weiter wenn die Funktion ausgelöst wird.
In welcher Codezeile "steigt" die Fkt. aus?
Gruß
Reinhard
AW: UDF soll nicht andere UDFs beeinträchtigen
27.04.2012 13:33:36
Peter
Hallo Reinhard
Die Funktion steigt schon bei der nächsten Zeile, also
If .rngA.Columns.Count * .rngB.Columns.Count .....
aus.
Wenn ich anschliessend an With Application.Caller.Parent.Parent
Debug.Print .rngA.Name
einfüge, steigt sie auch aus,
wenn ich
Debug.Print rngA.Name (also ohne Punkt)
einsetze,
wird der Range ausgegeben.
Gruss, Peter
Anzeige
AW: UDF soll nicht andere UDFs beeinträchtigen
27.04.2012 13:45:08
Rudi
Hallo,
die Ranges sind an sich eindeutig. Da musst du nicht auf das übergeordnete Objekt referenzieren.
Versuch mal:
Function NULL4(rngA As Range, rngB As Range, rngC As Range, rngD As Range) As String
Dim lngB As Long, lngC As Long, lngD As Long
Dim rngArea As Range, rngCell As Range, rngCheck As Range, rngChk As Range, bln0 As Boolean
Dim strTmp As String
If rngA.Columns.Count * rngB.Columns.Count * rngC.Columns.Count * rngD.Columns.Count  1  _
Then
NULL4 = "Jeder Bereich muss einspaltig sein."
Exit Function
End If
If rngA.Areas.Count  rngB.Areas.Count Or _
rngA.Areas.Count  rngC.Areas.Count Or _
rngA.Areas.Count  rngD.Areas.Count Then
NULL4 = "Die Bereiche müssen gleich viele Teilbereiche haben."
Exit Function
End If
If 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."
Exit Function
End If
If rngA.Count = rngB.Count And rngA.Count = rngC.Count And rngA.Count = rngD.Count Then
lngB = rngB.Column - rngA.Column
lngC = rngC.Column - rngA.Column
lngD = rngD.Column - rngA.Column
For Each rngArea In rngA.Areas
For Each rngCell In rngArea
bln0 = True
If Not rngCell.EntireRow.Hidden Then
Set rngCheck = _
Union(rngCell, _
rngCell.Offset(, lngB), _
rngCell.Offset(, lngC), _
rngCell.Offset(, lngD))
If Application.Count(rngCheck) = 4 Then
For Each rngChk In rngCheck
bln0 = bln0 And (rngChk = 0)
Next
If bln0 Then strTmp = strTmp & IIf(Len(strTmp), ";", "") & rngCell.Row
End If
End If
Next rngCell
Next rngArea
If Len(strTmp) = 0 Then
NULL4 = "OK"
Else
NULL4 = strTmp
End If
Else
NULL4 = "Alle Bereiche müssen gleiche Zeilenzahl haben."
End If
End Function

Gruß
Rudi
Anzeige
AW: UDF soll nicht andere UDFs beeinträchtigen
27.04.2012 14:01:25
Peter
Hallo Rudi
Das klappt. Vielen Dank! Muss allerdings noch hinter das Geheimnis kommen, was genau geändert wurde.
Gruss, Peter
AW: UDF soll nicht andere UDFs beeinträchtigen
27.04.2012 22:21:45
Peter
Hallo Rudi
Nochmals besten Dank für den angepassten Code. Ich habe diesen nun noch durchgesehen
Der untenstehende Codeteil und insbesondere bei der Zeile
bln0 = bln0 And (rngChk = 0)
ist mir nicht klar, was da genau passiert.
Könntest du mir das noch kurz erklären?
Danke, Peter
If Not rngCell.EntireRow.Hidden Then
Set rngCheck = _
Union(rngCell, _
rngCell.Offset(, lngB), _
rngCell.Offset(, lngC), _
rngCell.Offset(, lngD))
If Application.Count(rngCheck) = 4 Then
For Each rngChk In rngCheck
bln0 = bln0 And (rngChk = 0)
Next
If bln0 Then strTmp = strTmp & IIf(Len(strTmp), ";", "") & rngCell.Row
End If
End If
Anzeige
AW: UDF soll nicht andere UDFs beeinträchtigen
28.04.2012 01:59:18
Reinhard
Hallo Peter,
bln0 = bln0 And (rngChk = 0)
bln0 ist eine variable die nut True/False, Whr/Falsch kennt.
Auf Deutsch bedeutet die Formel
bzw. vorher erkläre ich noch was
bln0 = (bln0=True) And (rngChk = 0)
wäre ausführlicher aber gleichwertig
In Vba ist es gleichwertig ob du sagst
Wenn bol0=true
oder
Wenn Bol0
Ergo steht da
bln0 = (bln0=True) And (rngChk = 0)
Übersetzt bedeutet diese "Formel", wenn die "Bedingung erfüllt ist weise der variablen bln0 den Wert True zu, wenn nicht False.
Die Bedingung ist daß das (alte) bln0 den Wert True hat UND rngChk den Wert 0.
Stimmt BEIDES hat danach bln0 den Wert True. Stimmt eines nicht oder beides nicht hat
bln0 den Wert False.
Gruß
Reinhard
Anzeige
AW: UDF soll nicht andere UDFs beeinträchtigen
28.04.2012 23:12:43
Peter
Hallo Reinhard
Danke vielmals für die Erläuterung.
Gruss, Peter

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige