dポイントプレゼントキャンペーン実施中!

はじめまして
複数範囲のCOUNTIFがしたくて、過去ログ、WEBなどで試しましたが、書かれている内容が難しいです。なら自分で作ってしまおうと思い作ってわからないことは質問などして勉強しようと思いましたが、動いてしまって、知識のない私では、これで正しい書き方なのか、たまたま動いてるのかがわからないです・・・・ 
有識者の意見をお聞かせください。
下記がPGです。
よろしくお願いします。

Function CountIf改(xRange, ParamArray xArgumentAry() As Variant) As Integer
Dim strA As Variant
Dim intCount As Integer

For Each strA In xArgumentAry
intCount = intCount + Application.WorksheetFunction.CountIf(xRange, strA)
Next
CountIf改 = intCount
End Function

A 回答 (4件)

#3です。

引数を配列にしてやってみました。
標準モジュールに
Function mcountX(ParamArray args()) As Integer
t = 0
For i = 0 To UBound(args) - 1
t = t + WorksheetFunction.CountIf(Range(args(i + 1)), args(0))
Next i
mcountX = t
Exit Function
End Function
シートのセルに
=mcountX("a","A1:A5","D1:D6","B11:C12")
のように入れる。COUNTIF関数と違い、COUNTIF関数の第2引数を最初に持ってきて、必須項目の位置が浮動するを防いだ(FIND関数などは探す文字数字を、第1引数・最初に持ってくる例あり)
#3と似た例でテスト
A1:A5
a
s
d
3
a
D1:D6
ー(空白)


3
a
s

B11:C12
2a
wa
結果
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
貴重な意見ありがとうございます。
まだ、コードを見ても理解できないので、デバッグで追いながら勉強します。

お礼日時:2009/06/21 22:40

EXCEL関数のセル範囲を指定する引数に飛び離れた複数範囲を指定することは、ほとんどカバーされてないのです。


やっとCOUNTIFSが増えて条件の数に目が向いたぐらいで、複数と言う県で積極的ではないようだ。
ーーーー
VBAで作ってしまおうと言う気持ちもわからなくは無い。
ーー
まず考え付くのが範囲名の応用が出来ないかだ。
飛び離れた複数範囲に1つのセル範囲の名前を定義は出来る。
しかし =COUNTIF(範囲1,"a") は#VALUEエラーになる。
ーー
Sub test01()
Dim rg As Range
For Each rg In Range("範囲1")
MsgBox rg
Next
End Sub
で指定した範囲のセルは捕まえられるのは良く知られている。
これを単位範囲(重複の無い矩形のセル範囲)づつを捉えられないかやってみた。
Sub test02()
t = 0
Dim rg As Range
For Each rg In Range("範囲1").Areas
MsgBox rg.Address
t = t + WorksheetFunction.CountIf(rg, "a")
Next
MsgBox t
End Sub
A1:A5
a
s
d
3
a
D3:D6に
3
a
s
B11:C12に
2a
w3
を入れて範囲1という名前をつけてテストした。
結果
4と表示された。
本番ではMSGBOXは省き、
これ全体をユーザー関数化すれば良いと思う。
ーー
COUNIFの引数では無く、ユーザー関数の引数で、A1:A5,B3:c5・・など表現できないか考えて見ますがとりあえず。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
まず、最初に謝らなくてはなりません。
言葉足らずで、imogasi様の時間を無駄にして申し訳ありません。
言葉足らずとは、「複数選択」ではなく、「複数条件」でした。
申し訳ありませんでした。
以後気をつけます。
貴重な意見を頂きありがとうございます。

コードを見ても、理解できないので後日デバッグで追いながら勉強します。
複数範囲、複数条件で、できないものかと考えましたが、無理でしたので最初に複数条件ができないものかと作成しました。
私のない頭で考えたのが、複数範囲は、提示していただいた方法でできそうな気がします。(コードが理解できないですが・・・)
複数条件は、設定シートを作成して、条件リストを作成し、その条件を読み込んで処理する。とできるかなと考えました。
まずは、VBAの基礎の勉強です。

お礼日時:2009/06/21 22:30

どういう関数を作りたいのか分からないのですが、示された関数は、個々の条件を満たす個数を単純合計しているだけです。


=CountIf改(A1:A5, "=10", "=20")
のような使いかたは問題ありませんが、
=CountIf改(A1:A5, ">=10", "<=20")
の場合は、思い通りの結果を返していますか?

たとえば、
5
8
12
15
24
という数値がセルにあった場合、上記の計算式は10以上の個数と20以下の個数の合計=7 を返します。
=CountIf(A1:A5, ">10")+CountIf(A1:A5, "<20")
と同じです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
まず、最初に謝らなくてはなりません。
言葉足らずで、nag0720様の時間を無駄にして申し訳ありません。
言葉足らずとは、「複数選択」ではなく、「複数条件」でした。
申し訳ありませんでした。
以後気をつけます。
貴重な意見を頂きありがとうございます。
引用-----
どういう関数を作りたいのか分からないのですが、示された関数は、個々の条件を満たす個数を単純合計しているだけです。
引用-----
まさにその通りです。
>=CountIf(A1:A5, ">10")+CountIf(A1:A5, "<20")
の結果を返したかったのです。条件はもうちょっと多いですが。
>=CountIf改(A1:A5, ">=10", "<=20")
検証してみます。

お礼日時:2009/06/21 22:11

ん? これでほんとに動いていますか?


エラーが返されると思うのですが。。。。

>Application.WorksheetFunction.CountIf(xRange, strA)

CountIFの引数は、(範囲、検索条件)の順序ですから
この、xRangeとstrAが逆では?

Application.WorksheetFunction.CountIf(strA, xRange)

●変数名●をちょと工夫する必要がありそうです。


また、
>Function CountIf改(xRange, ParamArray xArgumentAry() As Variant) As▲Integer▲

これだと関数の戻り値が整数になってますので
整数の範囲(32767)を超えるようなことがありそうなら、
(2,147,483,647)まで計算できる長整数型(Long)にしておきましょう。
その場合は言わずもがなのことですが、intCountもLongに。
ま、最初から、Longにしておけばいいことですが。

上記以外はOKだと思います。
以上、ここまで。
 
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
まず、最初に謝らなくてはなりません。
言葉足らずで、myRange様の時間を無駄にして申し訳ありません。
言葉足らずとは、「複数選択」ではなく、「複数条件」でした。
申し訳ありませんでした。
貴重な意見を頂きありがとうございます。
引用-----
これだと関数の戻り値が整数になってますので
整数の範囲(32767)を超えるようなことがありそうなら、
(2,147,483,647)まで計算できる長整数型(Long)にしておきましょう。
その場合は言わずもがなのことですが、intCountもLongに。
ま、最初から、Longにしておけばいいことですが
引用-----
気づきませんでした。
以後気をつけます。

お礼日時:2009/06/21 22:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!