次の方法で共有

エクセルVBA/COUNTIF関数の引数1に、配列は指定できますか

Anonymous
2019-12-16T06:23:57+00:00

お世話になります。よろしくお願いします。

エクセルVBA内で、COUNTIF関数を使い、指定された範囲に値が0以上のセルが何個あるかをカウントさせたいのですが、うまくできません。

調べたいセルは、ワークシート上に7行飛びに離れて存在するため、まずUNION関数を使いセルを結合させ、その結合した配列を、COUNTIF関数の引数1に指定して実行しましたが、『実行時エラー1004 COUNTIFプロパティを取得できません』、もしくは『実行時エラー13 型が一致しない』となります。

確認のため、結合した配列の内容をシートに貼り付けてみますと、格納された値は正常に展開されます。

また、その展開したセル範囲を引数1に指定してCOUNTIFを実行すると、正しい結果が得られました。

VBA内でCOUNTIF関数を使う場合、引数1に配列は指定できないのでしょうか。

 Dim MyRng As Range

 j = Cells(Rows.count, 1).End(xlUp).Row

 For i = 7 To j Step 7

    If MyRng Is Nothing Then

       Set MyRng = Cells(i, 6)

    Else

       Set MyRng = Application.Union(MyRng, Cells(i, 6))

    End If

 Next i

 cnt = WorksheetFunction.CountIf(MyRng, "> 0") ← エラーとなります

ご教授よろしくお願い致します。

開発者テクノロジ | Visual Basic for Applications

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

2 件の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2019-12-17T01:58:43+00:00

    > エクセルVBA内で、COUNTIF関数を使い、指定された範囲に

    > 値が0以上のセルが何個あるかをカウントさせたいのですが、うまくできません。

    > 調べたいセルは、ワークシート上に7行飛びに離れて存在するため、

    > まずUNION関数を使いセルを結合させ、その結合した配列を、

    > COUNTIF関数の引数1に指定して実行しましたが、

    > 『実行時エラー1004 COUNTIFプロパティを取得できません』、

    > もしくは『実行時エラー13 型が一致しない』となります。

    COUNTIF 関数の第 1 引数に 2 つ以上のセル領域を渡すことは出来ません。

    > j = Cells(Rows.count, 1).End(xlUp).Row

    >

    > For i = 7 To j Step 7

    >    If MyRng Is Nothing Then

    >       Set MyRng = Cells(i, 6)

    >    Else

    >       Set MyRng = Application.Union(MyRng, Cells(i, 6))

    >    End If

    > Next i

    そこまで出来ているのであれば、普通に If 文で

    「各セルの値が 0 を超えている(≠0以上)」か否かを判定し、

    True の場合は 変数 cnt に 1 ずつ足すようになされば充分なのでは。


    j = Cells(Rows.Count, 1).End(xlUp).Row

    cnt = 0

    For i = 7 To j Step 7

        Set MyRng = Cells(i, 6)

        Debug.Print MyRng.Address & vbTab & MyRng.Value

        If MyRng.Value > 0 Then

            cnt = cnt + 1

        End If

        Set MyRng = Nothing

    Next i


    この回答は役に立ちましたか?

    2 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  2. Anonymous
    2019-12-17T05:33:36+00:00

    sk.exeさま

    丁寧な返信、ありがとうございます。

    ご指摘の通り、CONTIF関数が使えないようであれば、最終的にはIF文でひとつひとつ判定していく方法しかないと考えておりました。

    仕組みの目的は、数十年分の気象データから、雨量が観測された日を降雨日としてカウントするもので、なにしろ扱うデータが大容量のため、IF文を多用すると処理時間が掛かり過ぎてしまうのではないかとの不安があり、できれば対象データを配列に吐き出し、最後にCOUNTIF関数で一発で処理できないものか…

    と思い、質問させていただいた次第です。

    ちなみに、上記の配列MyRngを、他の関数の引数に指定するとうまく結果が得られたため、

     最高雨量  … Application.Max(MyRng)  や

     最低雨量  … Application.Min(MyRng)  など

    COUNTIF関数にも使えるのではないか?自分のコードの記述に問題があるのではないか?

    と半信半疑でしたので、スッキリと解決することができて良かったです。

    本当にありがとうございました。

    またの機会がありましたら、どうぞよろしくお願い致します。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません