Ein komplettes Beispiel:
15.03.2005 12:09:23
Boris
Hi K.Rola,
ich hab jetzt mal eine diesbezügliche UDF geschrieben. Sie soll in der Lage sein, auch über mehrere Blätter zu zählen.
Syntax: =ZÄHLEN3D(Bezug;Suchtext)
Also z.B.:
=ZÄHLEN3D(Tabelle1:Tabelle3!C4:D100;"u")
Aber auch mit der normalen ZÄHLENWENN-Syntax:
=ZÄHLEN3D(C3:F13;"u")
Sieht dein geschultes Auge irgendwelche Schwachstellen / Umständlichkeiten / Verbesserungsmöglichkeiten?
Option Explicit
Function Zählen3D(Bezug As Variant, Suchtext As String) As Variant
Dim s As String 'Formelstring
Dim WsStart As String 'Name Erstes Blatt
Dim WsEnde As String 'Name Letztes Blatt
Dim iCount As Integer 'Zähler vom 1. bis zum letzten Blatt
Dim i As Integer 'Index des 1. Blattes
Dim j As Integer 'Index des letzten Blattes
Dim B As Boolean 'Prüfung, ob Mehrfachbezug vorhanden
Dim sBereich As String 'Bereich auslesen bei Mehrfachmarkierung
s = Application.Caller.Formula 'Formel auslesen
'Prüfen, ob Mehrfachmarkierung vorliegt
B = (InStr(1, s, ":") > 0) * (InStr(1, s, "!") > InStr(1, s, ":")) * (InStr(1, s, "!") < InStr(1, s, ","))
If B Then 'Falls Mehrfachbezug vorhanden in der Form: Tabelle1:Tabelle3!A1:C100
'Formelstring auslesen und an s übergeben
s = Mid(s, InStr(1, s, "(") + 1, InStr(1, s, ")") - InStr(1, s, "(") - 1)
'Erstes Blatt auslesen
WsStart = Trim(Left(s, InStr(1, s, ":") - 1))
'Letztes Blatt auslesen
WsEnde = Trim(Mid(s, InStr(1, s, ":") + 1, InStr(1, s, "!") - InStr(1, s, ":") - 1))
'Zellbereich auslesen
sBereich = Trim(Mid(s, InStr(1, s, "!") + 1, InStr(1, s, ",") - InStr(1, s, "!") - 1))
'Index des 1. Blattes ermitteln
i = Worksheets(WsStart).Index
'Index des letzten Blattes ermitteln
j = Worksheets(WsEnde).Index
'Schleife über alle tangierten Blätter
For iCount = i To j
Zählen3D = Zählen3D + WorksheetFunction.CountIf(Sheets(iCount).Range(sBereich), Suchtext)
Next iCount
Else 'Falls kein Mehrfachbezug vorhanden: Einfaches ZÄHLENWENN
Zählen3D = WorksheetFunction.CountIf(Bezug, Suchtext)
End If
End Function
Danke und Grüße
Boris