A列とB列が両方とも条件満足する行数を数えるには?

Question 26.3 Previous Next
私はパソコンを初めて半年ほどなので何時も拝見させて頂いており、とても参考になります。ちょっと教えて頂きたい事があるのですが、
例えばA列には、はいorいいえが記入されており、B列には〇or×が記入されている表があり、その中で、A列がはいでB列は〇であるものを選びカウントするマクロを組むにはどうすればよいのでしょうか?(但し空白のセルは数えない事)。 是非お知恵をお借りしたいのでが・・・宜しくお願い致します。
Answer   Copyright (C) 2000.3.12 永井善王
パソコン半年ほどでマクロを使われているとのこと、ご熱心のようですね。
私はいつも、Excelは多機能で1つの目的を達成するのに、いろいろな方法が選べる場合が多い、その中から自分に合った 方法を選択すれば良いのですが、 できれば Excelらしい使い方をしましょうと語っています。できるだけループさせる方法(注1)は避けましょう。

マクロを考える前に、データの組み合わせを整理してみます。
組み合わせ
A列は 「はい、いいえ、空白」の3通り、
B列は 「○、×、空白」の3通りですから、組み合わせると左図の2~10行目のように、9つのパターンができます。
この中でカウントしたいデータは、2行目の、A列が「はい」でかつ B列が「○」のパターンのものです。
その他の列の状況は不明ですので、ここでは一応、C列以後は使われていないとして考えます。

ところで、IF関数をご存知ですか。IF関数はワークシートの任意のセルに入力できます。 例えば、A2セルの内容が「はい」ならば 「1」をセットし、そうでないなら「0」をセットしたい場合、 同じワークシートの A2以外のセルへなら、下記のように入力します。
    =IF(A2="はい",1,0)   …… ①
そして、この質問の場合は、A2セルの内容が「はい」で、かつ B2セルの内容が「○」であるかどうかを調べるのですから、A2およびB2セル以外のセルへ次のとおり入力します。

  =IF(AND(A2="はい",B2="○"),1,0)   …… ②

さっそく、あなたのワークシートの C2セルに、この関数を入力してみてください。 ...
C2セルに「1」と表示されたら、次へ進みましょう。

では次は、C2セルの内容をコピーして、C3~C10セルに貼り付けてみましょう。
その結果、「1」と表示されるのは相変わらず C2セルだけです。上図の 9つのパターンの中で、条件を満足するのは 1つだけですから、これで正解です。

カウントは、どうすれば良いでしょうか。
なんとなく分かってきましたか。そうです、IF関数でセットされた値を合計します。ちょうど好都合に、C1セルが空いていますから、次の関数を入力してみてください。

  =SUM(C2:C10)…… ③

C1セルに「1」と表示されましたね。「1」ばっかりで少々わかりにくいので、10行目のデータを「はい、○」に変えてみると、はっきり確認できます。
質問は「カウントするマクロを組むにはどうすればよいか」でした。
上記で整理できた内容を中心にして、早速、マクロの自動記録で組んでみましょう。自動記録の方法はご存知かとは思いますが、一応、書いておきます。
ただし、Excel97、98、2000での操作方法ですので、Excel95では一部異なります。

 (1) データが入ったワークシートを開いておく。
 (2) 自動記録を開始するため、メニューから[ツール]-[マクロ]-[新しいマクロの記録]とクリックする。
 (3) 「マクロ記録」のダイアログが表示されたら、マクロ名をメモしておいてから[OK]ボタンをクリックする。
マクロの記録
 (4) C2セルへ上記②の IF関数を入力する(関数ウイザードを利用してもよい)
 (5) C2セルの内容をコピーして、C3~C10セルに貼り付ける
 (6) C1セルへ上記③の SUM関数を入力する
 (7) マクロの自動記録を終了するため、[ツール]-[マクロ]-[記録終了]とクリックする。

とりあえず、自動記録したマクロを試しておきましょう。手順は、
 (1) ワークシートのC1~C10セルにセットしてある数式をクリアする。
 (2) メニューから[ツール]-[マクロ]-[マクロ]とクリックする。
 (3) マクロ名に、先ほどメモしたマクロの名が表示されていることを確認して、[実行]ボタンをクリックする。
マクロの実行が終って、C1セルに「1」と表示されたら成功です。
ワークシートのセルに直接、関数を入力するだけで済むのなら、なにもマクロを組むことはないヨ! と言わずに、続けて読んでください。この後が役立つはずです。
自動記録したマクロを見てみてください。次にようにできていますか。
Sub Macro1()

 Macro1 Macro
 マクロ記録日 : 2000/3/18  ユーザー名 : Yoshioh Nagai


    Range("C2").Select
    ActiveCell.FormulaR1C1 = "=IF(AND(RC[-2]=""はい"",RC[-1]=""○""),1,0)"
    Range("C2").Select
    Selection.Copy
    Range("C3:C10").Select
    ActiveSheet.Paste
    Range("C1").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "=SUM(R[1]C:R[9]C)"
    Range("C2").Select
End Sub
このマクロは、データ件数が増減すると具合よくありません。どこかと言うと、上から 11行目と 15行目です。 なぜかと言うと、11行目を見ると分かりやすいですが、"C3:C10" つまり、C3セルから C10セルまでと、範囲が固定されています。 15行目も同様で R[1]C:R[9] とあるのは、C2セルから C10セルまでを意味し、やはり固定されています。
データ件数が増減しても、うまく動くマクロにするには、どう直せばよいでしょうか?
マクロの11行目と15行目で 「C10」セルと自動記録されたところを、変数で指定する書き方に修正しましょう。
11行目は、次のとおり記録されています。
    Range("C3:C10").Select
ひとまず次のとおり、変数で書く方法に修正しておきます。(注2)
    Range("C3:C" & 最後の行).Select
また、15行目が、次のとおり記録されているので、
    ActiveCell.FormulaR1C1 = "=SUM(R[1]C:R[9]C)"
次のとおり 1行追加して、変数で書く方法に修正します。(注3)
    行 = 最後の行 - 1
    ActiveCell.FormulaR1C1 = "=SUM(R[1]C:R[" & 行 & "]C)"

もうひとつ別のマクロを、自動記録しましょう。「最後の行」が何行目かを調べるためです。

自動記録の手順
最後のせる (1) ワークシートを開く … 前述(1)参照
(2) 自動記録 … 前述(2)参照
(3) マクロ名をメモ … 前述(3)参照
(4) 最終セルを選択するため、[編集]-[ジャンプ]とクリックする
(5) 「ジャンプ」ダイアログが表示されたら、[セル選択]ボタンをクリックする
(6) 「選択オプション」ダイアログが表示されたら、右図のように「最後のセル」のオプションボタンをオンにして、[OK]ボタンをクリックする
(7) マクロの自動記録を終了させる … 前述(7)参照

画面にワークシートのB10セルが選択されていることを、確認しておきましょう。
最終セルを選択するための新しいマクロが、次のとおり記録されているはずです。
Sub Macro2()

 Macro2 Macro
 マクロ記録日 : 2000/3/22  ユーザー名 : Yoshioh Nagai

    Selection.SpecialCells(xlCellTypeLastCell).Select
End Sub
このマクロは「最終セル」を選択するだけで、そのセルが何行目かはわかりません。 行数を取得するためのマクロは自動記録できませんので、上から5~6行目の間に、次のとおり1行挿入してください。(注4)
Sub Macro2()

 Macro2 Macro
 マクロ記録日 : 2000/3/22  ユーザー名 : Yoshioh Nagai

    Selection.SpecialCells(xlCellTypeLastCell).Select
    最後の行 = ActiveCell.Row
End Sub
上のマクロの 6~7行目をコピーして、最初に記録した Macro1 の 7~8行目の間に貼り付けます。
次のとおりできていれば、完成です。
Sub Macro1()

 Macro1 Macro
 マクロ記録日 : 2000/3/18  ユーザー名 : Yoshioh Nagai


    Selection.SpecialCells(xlCellTypeLastCell).Select
    最後の行 = ActiveCell.Row
    Range("C2").Select
    ActiveCell.FormulaR1C1 = "=IF(AND(RC[-2]=""はい"",RC[-1]=""○""),1,0)"
    Range("C2").Select
    Selection.Copy
    Range("C3:C" & 最後の行).Select
    ActiveSheet.Paste
    Range("C1").Select
    Application.CutCopyMode = False
    行 = 最後の行 - 1
    ActiveCell.FormulaR1C1 = "=SUM(R[1]C:R[" & 行 & "]C)"
    Range("C2").Select
End Sub
上手にできましたか。頑張りましたね。この Macro1 は、データ数が増減しても、正しくカウントしてくれるはずです。
さっそくデータを追加入力して、Macro1を実行してみましょう。 ... 正しい答えが C1セルに表示されましたか?

(注1) データを 1つずつ順に処理し、データがなくなるまで反復処理する方法。 For~NextDo~Until、Do~While、Do~Loop などを 使ってマクロを組む伝統的な手法。通常、データ量に比例して処理時間がかかる。
(注2) セル範囲を選択するための 'Range'の書き方には、このページで使っている "C3:C10"のように記入する 「A1参照方式」と、'Cells(3, 3), Cells(最後の行, 3)'のように記入する「R1C1参照方式」があります。 変数名で範囲指定して選択する を参考にしてください。
(注3) セル範囲の指定が、この場合は、「R1C1参照方式」で書かれています。Rは行、Cは列を意味するので、 例えばR1C1参照方式の「R2C3」は、A1参照方式では「C2」となります。 また、自動記録された「R[1]C」あるいは「R[9]C」のように数字が[ ]で囲まれている場合は、基準セルからの 相対アドレスを示しています。従って、15行目の数式は C1セルにセットされたので、「R[1]C」とは C1セル より1行下のセル、つまり、C2セルを意味します。
(注4) アクティブセルを調べる を参考にしてください。

サンプルブックのダウンロードは ここをクリック (YNxv950_Count.xls.xls 80KB)
※ 一旦、ブックをハードディスクに保存し、開き直してから実行してください。
なお、このページの自動記録マクロをさらに整理したマクロが動きます。

 

Excel VBA Macro