AW: Zählenwenn über VBA. Range-Problem
15.07.2007 11:07:00
ingUR
Hallo, Peter,
meiner Kenntnis nach, kann der Zählbefehl, wie auch einige andere Befehle, die mit Zellenbereichen arbeiten, nur einen Bereich untersuchen und der muß ununterbrochen sein.
Nun liegt es an Deiner Anwendung, ob Du nun eine Zellenformel in der Zelle BM202 benötigst oder das Ergebnis der Zählung genügt.
Die Zellenformel, die @Oberschlumpf" herausgesucht hat, läßt sich per VBA als Zellenformel so eintragen:
[BM202].Formula = "=SUM(COUNTIF(INDIRECT({""BM60"",""BM75"",""BM90"",""BM105"",""BM120"","" _
BM135"",""BM150"",""BM165""}),""M2""))"
Jedoch kann sie so nicht in einen Aufruf via WorksheetFunction umgeformt werden, da die Bedeutung der geschweiften Klammern nicht erkannt wird.
Nun kenne ich nicht den Kontext, in dem Deine Programmzeile steht, so dass es verschiedene Möglickeiten gibt, die Aufgabe in VBA umzusetzen.
Vielleicht reicht diese Funktion, die auch als Zellenformel für Dein spezielles Beispiel in Zelle BM202 eingesetzt werden kann ( =CountInRangeStep), zur Erledigung Deiner speziellen Aufgabe:
Function CountInRangeStep() As Long
Dim r As Long, sItem As Variant, c As Long
sItem = [M2] Zelle mit Suchwert oder Ändernng, wenn String "M2" als Suchzeichenkette
For r = 60 To 165 Step 15
If Cells(r, "B") = sItem Then c = c + 1
Next
CountInRangeStep = c
End Function
In Deinem Programm verkürztt sich die rechte Seite Deiner Zuweisungszeile, und die Zeile sieht so aus:
Range("BM202").Value = CountInRangeStep
Ansonsten bestünde die allgemeine Möglichkeit über UNION, mehrere Bereich zusammenzufassen. Dieser Vereinigungsbereich kann jedoch auch nicht in de Count-Formel benutzt werden:
Sub ZaehlelInMultiRange() as Long
Dim rngMR As Range, rngC As Range, sItem As Variant, c As Long
sItem = [M2]
Set rngMR = Union([BM60], [BM70], [BM85], [BM90], [BM105], [BM120], [BM135], [BM150], [ _
BM165])
For Each rngC In rngMR
If rngC = sItem Then c = c + 1
Next
Set rngMR = Nothing
[BM202] = c
End Sub
Auch diese Sub-Prozedur läßt sich in eine Funktion umschreiben und entsprechend einsetzen.
Gruß,
Uwe