• ベストアンサー

条件にあてはまるデータの数をカウントするエクセル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

質問者が選んだベストアンサー

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.2

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の中のセル参照は、 絶対参照、相対参照が混ざった複合参照でなければいけません。 以上です。  

otk-ks
質問者

お礼

値のみにする方法は思いつきませんでした。 簡単に出来るのでこの方法でやってみます。 ありがとうございました。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

>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する。 >データ数が多くて動きが重たいので ならこれが案外早いかも。メモリにある行数分のデータを読み終われば(アクセスすれば)終了する。

otk-ks
質問者

お礼

VBAでやるには複雑なんですね。初心者の域を出ない自分には 難しそうです。色々と教えていただきありがとうございました。

  • van111
  • ベストアンサー率14% (1/7)
回答No.1

マクロを使わずとも関数でできますよ。 カウントを表示したい場所に下記関数をいれてみてください。 =SUMPRODUCT(($A$2:$A$100="1")*($B$2:$B$100=A101))

otk-ks
質問者

補足

説明が足りませんでした。すみません。データ数が多くて動きが 重たいのでVBAでやれればと考えましたが関数は参考にさせていただきます。

関連するQ&A