• ベストアンサー

EXCEL VBAで行う複数の検索条件に合致する行の個数のカウント方法について

すいません EXCEL VBAで教えていただきたいことがあります。    A列  B列 1行:野菜  秋物 2行:果物  秋物 3行:穀物  夏物 4行:野菜  夏物 5行:野菜  春物 6行:穀物 秋物 7行:果物  夏物 8行:野菜  秋物 ・・・以下300行まで続く というデータがあるとして、A列が「野菜」、B列が「秋物」に合致する 行の合計個数をカウントするのはどうしたらよろしいんでしょうか。 関数だとデータベース関数を使えば何とかできそうな感じなのですが VBAだと、どうもいいアイデアが浮かびません。よろしくお願いいたします。

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

  • ベストアンサー
  • lark_0925
  • ベストアンサー率63% (37/58)
回答No.1

300行程度だとどれでもそんなに大きい差(処理時間)はありませんでした。 '========================================================= Sub 例1()   Dim c1 As String   Dim c2 As String   Dim ans As Long   c1 = "野菜": c2 = "秋物"   With Range("a1", Cells(Rows.Count, "a").End(xlUp)).Resize(, 2)    ans = Evaluate("sumproduct((" & .Columns(1).Address & "=""" & c1 & _             """)*(" & .Columns(2).Address & "=""" & c2 & """))")    MsgBox c1 & "で" & c2 & "の数は " & ans    End With '私は、この手のことは、大抵これです End Sub '========================================================= Sub 例2()   Dim c1 As String   Dim c2 As String   Dim ans As Long   ans = 0   c1 = "野菜": c2 = "秋物"   With Range("a1", Cells(Rows.Count, "a").End(xlUp)).Resize(, 2)    With .Columns(3)      .Formula = "=if(and(rc[-2]=""" & c1 & _              """,rc[-1]=""" & c2 & """),1,"""")"      If .Rows.Count = 1 And .Cells(1).Value = 1 Then       ans = 1      Else       On Error Resume Next       ans = .SpecialCells(xlCellTypeFormulas, xlNumbers).Count       End If      MsgBox c1 & "で" & c2 & "の数は " & ans      .ClearContents      End With    End With End Sub '============================================================ Sub 例3()   Dim c1 As String   Dim c2 As String   Dim crng As Range   Dim ans As Long   ans = 0   c1 = "野菜": c2 = "秋物"   For Each crng In Range("a1", Cells(Rows.Count, "a").End(xlUp))    With crng      If .Value = c1 And .Offset(0, 1).Value = c2 Then ans = ans + 1      End With    Next   MsgBox c1 & "で" & c2 & "の数は " & ans End Sub

takohasisa
質問者

お礼

おおっ!できました!ありがとうございます! こういうやり方があったのですか。 例1の ans = Evaluate("sumproduct((" & .Columns(1).Address & "=""" & c1 & _      """)*(" & .Columns(2).Address & "=""" & c2 & """))") のコードが自分ではどうしても作れませんでした。 作っていただいたコードは理解しないといつまで経っても実力が付かないので、とりあえず記載していただいた3つとも全部研究させていただきます。 またわからないことがありましたらよろしくお願いします。

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

この例題では関数で充分ですが、 VBA初心者で勉強中の方であると想定して敢えてVBAで。 VBAに慣れるまで簡単な命令を使いましょう。 Option Explicit Private Sub hogehoge()  Dim ANS As Integer  Dim I As Integer  ANS = 0  For I = 1 To 500   If Range("A" & I) = "" Then Exit For   If Range("A" & I) = "野菜" And Range("B" & I) = "秋物" Then     ANS = ANS + 1   End If  Next I  MsgBox "答えは " & ANS End Sub '----------------------------------- ここまで For I = 1 To 500 の500は、300行まで続くとあるので、いくら何でもここまでデータは無いだろう・・・の適当な数字です。

takohasisa
質問者

お礼

出来ました!ありがとうございます。 If Range("A" & I) = "野菜" And Range("B" & I) = "秋物" Then     ANS = ANS + 1 で出来るということを始めて知りました。 端からCountを使わないと出来ないだろうと決め付けた挙句に 結局暗礁に乗り上げてしまいました。 VBAは始めたばかりでわからないことだらけです。 またよろしくお願いいたします。

すると、全ての回答が全文表示されます。
  • lark_0925
  • ベストアンサー率63% (37/58)
回答No.2

追伸です。 例2 は、コード内でC列を作業列として使用しています。

すると、全ての回答が全文表示されます。

関連するQ&A