- ベストアンサー
条件にあてはまるデータの数をカウントするエクセルVBA
下記のようにA列に1~3のコードがありB~E列には測定値があります。 B列以降の測定値のカウント(+3の個数、+2の個数…)を列ごとにVBAでカウントしてます。 A列に関係なくカウントするコードは記述して実行できましたが A列の条件が1の時だけカウントするVBAが良くわかりません。 シート A B C ・・・E 1 -1 +1 ・・・ 1 +2 0 2 0 0 3 -3 0 1 -1 +3 101行目以降 +3 カウント数 … +2 〃 +1 〃 0 〃 -1 〃 -2 〃 -3 〃 A列に関係なくカウントするコード sub カウント() Dim 行 As Long Dim 列 As Long For 列 = 2 To 5 For 行 = 101 To 107 Cells(行, 列).Value = Application.WorksheetFunction.CountIf(Range(Cells(2, 列), Cells(100, 列)), Cells(行, 1)) Next 行 Next 列 End Sub
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
B101~E107に一気にSUMPRODUCTをセットし、 その結果をコピーして、同じ範囲に、値のみ貼り付けする。 '-------------------------------------------------- Sub カウント3() With Range("B101:E107") .Value = "=SUMPRODUCT(($A$2:$A$100=1)*(B$2:B$100=$A101))" .Value = .Value End With End Sub '-------------------------------------------------- .Value = .Value これが値のみ貼り付けです。 また、SUMPRODUCTの中のセル参照は、 絶対参照、相対参照が混ざった複合参照でなければいけません。 以上です。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
>A列の条件が1の時だけカウントするVBAが良くわかりません。 (1)こういうエクセル関数をVBAでつかうロジックでやっているときは、その延長線で関数を使い、列の値を制限するのは複雑。 Application.WorksheetFunction以下に条件を盛り込む式はどうなるか考えることになる。 2条件でカウウトは2003まではSUMPRODUCTが定石。 それをVBAコードの中で使うと(マニアックなコードと思うが) Sub tesat01() d = Range("A99").End(xlUp).Row MsgBox d For 列 = 2 To 4 c = Chr(列 + 64) MsgBox c Cells(99 + 列, "A").Value = Evaluate("SUMPRODUCT((Sheet1!A1:A99 <>1)*(" & "Sheet1!" & c & "1:" & c & "99=2))") Next 列 End Sub ーー 例データ 1-99の行で A-D列に下記データがあるとする。実際はA2:D9 2 2 0 1 2 3 3 3 1 2 2 0 3 2 2 2 1 3 3 2 1 3 3 2 2 2 2 1 3 2 2 2 A列が1でなく、B-D列でそれぞれ2のものの件数を B,C,D列に分けてカウントすると 101-103行に 4 <-B列で2のものの件数 3 <ーC列で2 ” 2 <-D列で2 ” が出る。 (2)101行以下に、関数式を埋め込む方法がある。 Worksheets("アイテムリスト").Range("D2").Formula = "=SUMPRODUCT((・・・ (4)VBAで上から最終行まで、各行を読んで(For Next) ・その行のA列が1でない ・その行のその列のセルの値が2 に該当する行をカウントする(該当の都度+1)方法がある。 列ごとに該当の途中件数を記録する変数を列数だけ設けて 該当は+1する。 >データ数が多くて動きが重たいので ならこれが案外早いかも。メモリにある行数分のデータを読み終われば(アクセスすれば)終了する。
お礼
VBAでやるには複雑なんですね。初心者の域を出ない自分には 難しそうです。色々と教えていただきありがとうございました。
- van111
- ベストアンサー率14% (1/7)
マクロを使わずとも関数でできますよ。 カウントを表示したい場所に下記関数をいれてみてください。 =SUMPRODUCT(($A$2:$A$100="1")*($B$2:$B$100=A101))
補足
説明が足りませんでした。すみません。データ数が多くて動きが 重たいのでVBAでやれればと考えましたが関数は参考にさせていただきます。
お礼
値のみにする方法は思いつきませんでした。 簡単に出来るのでこの方法でやってみます。 ありがとうございました。