スキップしてメイン コンテンツへ

 none
[Excel VBA] 特定の範囲内のセルで複数の特定条件が一致する数をカウント RRS feed

  • 質問

  • 説明が難しいのでわかりにくいと思いますが、特定の範囲内のセルで複数の特定条件が
    一致する数をカウントする方法はないでしょうか。

    例として以下のような表があったときに 1 行目が AAA かつ、その列の 3 行目から
    10 行目までがすべて 〇 になっている列の数を簡単に抽出したいのですが
    良い方法はないでしょうか。
    (もしくは 1 行目が AAA かつ、その列の 3 行目から10 行目までで 1 行でも
    〇 でない列の数)

    なお検索する値は必ずしも存在しているとは限りません。

      A B C D E F
    1 AAA AAA CCC AAA DDD AAA
    2 AAA BBB AAA BBB EEE AAA
    3 ×
    4 × ×
    5 ×
    6 ×
    7 × ×
    8
    9 ×
    10

    2019年9月12日 4:58

回答

  • 予め確認しておきたいのですが、探索したい文字は、
    ○(記号の丸印)Unicode: U+25CB、Shift_JIS: 0x819B ではなく、
    〇(漢数字の零)Unicode: U+3007、Shift_JIS: 0x815A で
    本当に正しいのでしょうか。

    とりあえず、集計用のセルを用意しても良いのなら、このような方法があります。

    Sheet1.Range("A12:F12").FormulaR1C1 = "=(R1C=""AAA"")*(8=COUNTIF(R3C:R10C,""〇""))"
    cnt = Application.WorksheetFunction.Sum(Sheet1.Range("A12:F12"))
    
    MsgBox cnt
    • 回答としてマーク infade 2019年9月12日 6:34
    2019年9月12日 5:20

すべての返信

  • 予め確認しておきたいのですが、探索したい文字は、
    ○(記号の丸印)Unicode: U+25CB、Shift_JIS: 0x819B ではなく、
    〇(漢数字の零)Unicode: U+3007、Shift_JIS: 0x815A で
    本当に正しいのでしょうか。

    とりあえず、集計用のセルを用意しても良いのなら、このような方法があります。

    Sheet1.Range("A12:F12").FormulaR1C1 = "=(R1C=""AAA"")*(8=COUNTIF(R3C:R10C,""〇""))"
    cnt = Application.WorksheetFunction.Sum(Sheet1.Range("A12:F12"))
    
    MsgBox cnt
    • 回答としてマーク infade 2019年9月12日 6:34
    2019年9月12日 5:20
  • 予め確認しておきたいのですが、探索したい文字は、
    ○(記号の丸印)Unicode: U+25CB、Shift_JIS: 0x819B ではなく、
    〇(漢数字の零)Unicode: U+3007、Shift_JIS: 0x815A で
    本当に正しいのでしょうか。

    とりあえず、集計用のセルを用意しても良いのなら、このような方法があります。

    Sheet1.Range("A12:F12").FormulaR1C1 = "=(R1C=""AAA"")*(8=COUNTIF(R3C:R10C,""〇""))"
    cnt = Application.WorksheetFunction.Sum(Sheet1.Range("A12:F12"))
    
    MsgBox cnt

    回答ありがとうございました。

    条件の文字に関しては誤字です。
    しっかりと確認せずに「まる」で変換しただけでしたので間違いに気が付いていませんでした。
    ご指摘ありがとうございます。
    ただ、今回のは質問用のサンプルとして適当にでっち上げたデータですので内容は実際には
    まったく別で何でもよかったので。

    できれば、ほかのセルなどを使わないでやりたいなと思って回答を参考にいろいろ試してみたら、
    やはり若干、ループを使う必要はあるものの以下のような感じで実現できそうです。
    (本当はできればループを使いたくなかったのですが一発で実現はできそうにないので)

        Dim Sum As Long
        Dim rng As Range
        For Each rng In Range("a1:f1")
            If rng.Value = "AAA" Then
                ' 以下でもいい
                ' Sum = Sum - CLng(Application.WorksheetFunction.CountIf(rng.Offset(2).Resize(8), "〇") = 8)
                ' 条件に一致しない場合をカウントするには " = 8" の部分を " <> 8" にする
                Sum = Sum + Abs(CLng(Application.WorksheetFunction.CountIf(rng.Offset(2).Resize(8), "〇") = 8))
            End If
        Next
        Debug.Print Sum

    あとは、実際のデータに合わせて調整してみます。


    • 編集済み infade 2019年9月12日 6:34 型の間違いなどを修正
    2019年9月12日 6:31