アプリ版:「スタンプのみでお礼する」機能のリリースについて

すいません EXCEL VBAで教えていただきたいことがあります。
   A列  B列
1行:野菜  秋物
2行:果物  秋物
3行:穀物  夏物
4行:野菜  夏物
5行:野菜  春物
6行:穀物 秋物
7行:果物  夏物
8行:野菜  秋物
・・・以下300行まで続く

というデータがあるとして、A列が「野菜」、B列が「秋物」に合致する
行の合計個数をカウントするのはどうしたらよろしいんでしょうか。
関数だとデータベース関数を使えば何とかできそうな感じなのですが
VBAだと、どうもいいアイデアが浮かびません。よろしくお願いいたします。

A 回答 (3件)

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/03/01 10:06

この例題では関数で充分ですが、


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行まで続くとあるので、いくら何でもここまでデータは無いだろう・・・の適当な数字です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/03/01 10:11

追伸です。



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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!