パソコンスキルの教科書

パソコンスキルの教科書

東京大学大学院卒。博士課程に進学を志すも、担当教授と折が合わず、無職になる。医者を目指すも結局断念。田舎で派遣社員として働く。「スキルがなければ、仕事ももらえない」と悟り、ビジネススキルを学ぶ。プログラミング、英語を学び、一部上場企業へ転職。年間100時間以上の業務効率化を行い、社内講師に抜擢。海外の案件を担当し、数億円のプロジェクトに携わる。個人の事業でも、月売上100万を達成。現在は、自分の価値を高めるためのスキル向上支援を行う

ExcelマクロVBAでCountIf関数を作成(件数をカウントする)

f:id:gene320:20210309224623p:plain

上記の画像のようなことをしたいとき、Excel関数で「=COUNTIF($B$2:$B$21,F2)」と入力します。

このようにExcelでCOUNTIF関数を使えば、件数のカウントを行うことができます。

しかしVBAを使う場合、どのようにプログラムを作ればいいのでしょうか。

本記事では、そのプログラム作成について詳しく紹介していきます。

・ExcelのCountIf関数をVBAプログラムで作成

それでは以下で詳しく紹介していきます。

VBA作成前の準備

ExcelでVBAを使うためにはいくつかの準備が必要です。

具体的には以下です。

1. Excelファイルを「.xlsm」として保存

2. 開発タブを追加

上記に関しては、以下の記事で解説をしています。

www.fastclassinfo.com

もしVBAを使うための準備段階に不安がある人は上記をご覧ください。

なお、以下の動画でも紹介しています。


入門エクセルマクロの使い方|マクロ作成から実行までを徹底解説

詳細を知りたい人は動画をご覧ください。

Excel VBAでCOUNTIF関数を作ってみる

今回は以下の作業をVBAで行います。

セルB2~B21の値の件数をカウント

セルG2~G11に件数を出力

f:id:gene320:20210309225150p:plain

以下でプログラムソースを紹介します。

VBAのプログラムソース解説

今回紹介するプログラムの概要は以下です。

'プログラム0|変数宣言の指定
Option Explicit

'プログラム1|プログラム開始
Sub Excel_Countif()

    'プログラム2|対象シートを設定
    Dim Ws As Worksheet
    Set Ws = Worksheets("Sheet3")
    
    'プログラム3|最終行の取得
    Dim Cmax As Long
    Cmax = Ws.Range("A65536").End(xlUp).Row
    
    'プログラム4|変数設定
    Dim Kokyaku As String, Torihiki As String
    Dim Kensu As Long, i As Long, j As Long
    
    'プログラム5|F列の値を確認
    For i = 2 To Cmax
        Kensu = 0
        Kokyaku = Ws.Range("F" & i).Value
        
        'プログラム6|変数Kokyakuが空欄かどうか確認
        If Not Kokyaku = "" Then
            
            'プログラム7|B列を取得
            For j = 2 To Cmax
                Torihiki = Ws.Range("B" & j).Value
                
                'プログラム8|B列(Torihiki)とF列(Kokyaku)をカウントアップ
                If Torihiki = Kokyaku Then
                    Kensu = Kensu + 1
                End If
                
            Next
            
            'プログラム9|G列に出力
            Ws.Range("G" & i).Value = Kensu
        End If
    Next

'プログラム10|プログラムの終了
End Sub

以下で詳しく説明しています。

プログラム0|変数宣言の指定

Option Explicit

「Option Explicit」とは、変数宣言を強制するためのものです。

これを入れておくと、変数を定義していない場合、エラーが出ます。

変数宣言とは、「Dim XXX」のように変数を定義すること

「Option Explicit」を入力しておくことで、たとえば「Dim Kensu」をあらかじめ入力しないと、「Kensu」という変数を使えません。

もし「Option Explicit」を入力しているのに、「Dim Kensu」を書かずに「Kensu = 0」と書くと、エラーメッセージが表示されます。

実は、この機能はあくまでオプションです。「Option Explicit」を入力しなくても、プログラムは動きます。

しかし、これを入れておくことで、変数の誤記によるエラーを防止することができます。

結果的に、プログラム作成速度が上がるので、「Option Explicit」を入力することを習慣化することをオススメします。

プログラム1|プログラム開始

Sub Excel_Countif()

「Sub Excel_Countif()」のプログラムを開始することを意味します。

VBAではプロシージャという単位でプログラムを呼び出します。

プロシージャの構文は下記となっています。

Sub プロシージャ名()

End Sub

「Sub」で始まり「End Sub」で終わります。

「Sub XXXX」の「XXXX」の部分がプロシージャ名です。

今回は「Excel_Countif」というプロシージャ名にしています。

このプロシージャ名はあらゆる文字(アルファベット、ひらがな、漢字、数字など)が使用可能です。

ただし、プロシージャ名の先頭は数字を入れるとエラーとなります。

あとで見たときに、「何のプログラムだったのか?」とならないようにするためです。

なお、「()」の中には何も記入されていません。これは引数なしという意味です。

初心者の内は、引数ということが分からなくてもVBAプログラムを書くことは可能です。

興味があれば、「VBA 引数」で検索して調べてみてください。

プログラム2|対象シートを設定

    Dim Ws As Worksheet
    Set Ws = Worksheets("Sheet3")

f:id:gene320:20210309225600p:plain

以下で詳しく紹介します。

Dim Ws As Worksheet

「Ws」をWorksheet(ワークシート)型で定義します。

ワークシートとは、Excelの各シートを意味します。

Dim 変数 as 型

「変数」を「型」として設定という意味を指します。

Set Ws = Worksheets("Sheet3")

「Set Ws = Worksheets("Sheet3")」とすることで、「Sheet3」をWsとして扱うことができます。

要は、Sheet3を指定して処理を実行できるようになるのです。

なおシートを指定しない場合、今開いているExcelのシートに処理が実行されます。

プログラム3|最終行の取得

    Dim Cmax As Long
    Cmax = Ws.Range("A65536").End(xlUp).Row

f:id:gene320:20210309225928p:plain

以下で詳細を説明します。

Dim Cmax As Long

「Cmax」をLong(整数)型で定義します。

Cmax = Ws.Range("A65536").End(xlUp).Row

「Cmax = Ws.Range("A65536").End(xlUp).Row」とすることで、Excelの最終行を取得することができます。

Ws.:シート「Sheet3」の

Range("A65536").:セルA65536の

End(xlUp).:上のセルをチェックして最初に値が入っているセルの

Row:行番号

「Ws.Range("A65536").End(xlUp).Row」は、Ws(Sheet3)のセルA65536, A65535, A65534,・・・と上のセルをチェックしていき、値が入っている最初のセルを取得するという意味です。

セルA65536から数えて、セルA21が値が入っている最初のセルなので、「Cmax=21」となります。

これ以外にも、最終行を取得するプログラムはあります。

しかしたくさん覚えても意味はないので、このプログラムを使えるようになれば十分です。

なお、Cmaxの値は「Debug.Print(Cmax)」で検証できます。(以下のとおり)

    Dim Cmax As Long
    Cmax = Ws.Range("A65536").End(xlUp).Row
    Debug.Print("Cmax:" & Cmax)

上記のプログラムの検証結果は以下です。

Cmax:21

このCmaxの値は以降のプログラムで使用します。

プログラム4|変数設定

    Dim Kokyaku As String, Torihiki As String
    Dim Kensu As Long, i As Long, j As Long

以下で詳細を解説します。

Dim Kokyaku As String, Torihiki As String

変数「Kokyaku」をString(文字列)型、変数「Torihiki」をString(文字列)型で定義します。

「Kokyaku」はF列の値を取得するのに使います。(プログラム5)

「Torihiki」はB列の値を取得するのに使います。(プログラム7)

Dim Kensu As Long, i As Long, j As Long

変数「Kensu」をLong(整数)型、変数「i」をLong(整数)型、変数「j」をLong(整数)型で定義します。

「Kensu」は件数のカウントに使います。(プログラム5)

「i」はF2~F11の値を取得するときに、ForNext構文の数値カウンターとして使います。(プログラム5)

「j」はB2~B21の値を取得するときに、ForNext構文の数値カウンターとして使います。(プログラム7)

プログラム5|F列の値を確認

    For i = 2 To Cmax
        Kensu = 0
        Kokyaku = Ws.Range("F" & i).Value

f:id:gene320:20210309231715p:plain

以下で詳しく解説していきます。

For i = 2 To Cmax

「For i = 2 to Cmax」で「i =2,3,4,・・・, Cmax」のようにiに1ずつ加算しながら、ForとNextの間の処理を繰り返し実行させることができます。

まずはi=2で、Next(プログラム9)まで処理を行います。

プログラム6に戻って、i=3でNext(プログラム9)まで処理を行います。

そしてプログラム6に戻って、i=4でNext(プログラム9)まで処理を行い、i=Cmax(ここでは21)となるまで繰り返し処理を実行します。

For Next構文は使用頻度が高いので、使えるようになると威力を発揮します。

For Next文は以下で事例を交えながら解説しています。

www.fastclassinfo.com

さらに詳しく知りたい方は上記のリンクをご覧ください。

Kensu = 0

プログラム4で定義した変数「Kensu」を0(数字)として設定します。

この変数「Kensu」はB列で出てくる回数をカウントするためのものです。

よって、プログラム5でゼロリセットするようにしておきます。

i=2,3,4,・・・,Cmaxと値が変わる度に、件数をゼロに戻すことができるのです。

そうすることで、正しい件数をカウントできます。

Kokyaku = Ws.Range("F" & i).Value

「i」の値に応じて、セルF2~F11のそれぞれの値を変数Kokyakuとして取得します。

「Ws.Range("F" & i).Value」は、「Ws(シート3)のセルFiの値」という意味です。

i=2,3,4,・・・,Cmax(21)」と数値が変わると、F2,F3,F4,・・・,F21と対象セルも変わります。

プログラム6|変数Kokyakuが空欄かどうか確認

        If Not Kokyaku = "" Then

f:id:gene320:20210309232746p:plain

i=2,3,4,・・・,Cmax(21)」と数値が変わると、F2,F3,F4,・・・,F21と対象セルも変わります。

しかしF12~F21は空欄であり、空欄は件数をカウントする必要がありません。

そこで、「If Not Kokyaku = "" Then」で空欄かどうかをチェックします。

「If Not Kokyaku = "" Then」は、「もし変数「Kokyaku」が""(空欄)でないならば」という意味です。

If文に「Not」,「""」を組み合わせています。少々ややこしく感じるかもしれませんが、覚えておくと非常に役立ちます。

If文は使用頻度が高いので、使えるようになると威力を発揮します。

If文は以下で事例を交えながら解説しています。

www.fastclassinfo.com

プログラム7|B列の値を取得

            For j = 2 To Cmax
                Torihiki = Ws.Range("B" & j).Value

f:id:gene320:20210311224947p:plain

以下で詳しく解説します。

For j = 2 To Cmax

「For j = 2 to Cmax」で「j =2,3,4,・・・, Cmax」のようにjに1ずつ加算しながら、ForとNextの間の処理を繰り返し実行させることができます。

プログラム5で使用した「i」と混同しないように気を付けます。

もしプログラム7でも「i」を使ってしまうと、正しく処理されません。

まずはi=2で、Next(プログラム9)まで処理を行います。

Torihiki = Ws.Range("B" & j).Value

「j」の値に応じて、セルB2~B21のそれぞれの値を変数Torihikiとして取得します。

「Ws.Range("B" & j).Value」は、「Ws(シート3)のセルBjの値」という意味です。

j=2,3,4,・・・,Cmax(21)」と数値が変わると、B2,B3,B4,・・・,B21と対象セルも変わります。

プログラム8|B列(Torihiki)とF列(Kokyaku)を突合しカウントアップ

                If Torihiki = Kokyaku Then
                    Kensu = Kensu + 1
                End If

f:id:gene320:20210311225406p:plain

以下で詳しく説明します。

If Torihiki = Kokyaku Then

変数「Torihiki」(B列)と変数「Kokyaku」(F列)が一致しているかどうか調べます。

もし一致していれば、以下のプログラムで1を加算します。

If文は使用頻度が高いので、使えるようになると威力を発揮します。

If文は以下で事例を交えながら解説しています。

www.fastclassinfo.com

ここのIf文が正しければ、すなわち「True」であれば、以下のプログラムを実行します。

Kensu = Kensu + 1

件数カウンターである「Kensu」に1を加算します。

1ずつ加算していく場合は、「Kensu = Kensu + 1」と記載します。

VBAに限らず、プログラミングでは「右辺を先に計算して、左辺を更新する」という考え方があります。

つまり「右辺(Kensu+1)を先に計算して、左辺(Kensu)を更新する」のです。

これでマッチングしていれば、変数「Kensu」を1ずつカウントアップできます。

この考え方は、使うことが多いので、覚えておくと役立ちます。

End If

この「End If」はプログラム8の1行目の「If Torihiki = Kokyaku Then」のIf文の終わりを意味します。

ForNext文やIf文が組み合わさると、記載を忘れてしまいがちなので、注意が必要です。

プログラム9|G列に出力

            Ws.Range("G" & i).Value = Kensu
        End If
    Next

f:id:gene320:20210311225741p:plain

以下で詳細を説明します。

Ws.Range("G" & i).Value = Kensu

プログラム8で加算したKensuをセルGiに出力します。

ここは「i」を使います。このプログラムではプログラム5とプログラム7でForNextを2つ使っています。

そのため、プログラム5のカウンター「i」とプログラム7のカウンター「j」を取り間違えてしまうことがあります。

「i」と「j」を間違えると結果が変わってしまうので、注意が必要です。

End If

この「End If」はプログラム6の「If Not Kokyaku = "" Then」のIf文の終わりを意味します。

If~End Ifは対応が分からなくなることがあります。

インデントをそろえて、迷子にならないようにするのがポイントです。

f:id:gene320:20210311230143p:plain

インデントを含めた、プログラムの記載のコツは以下の記事で紹介しています。

www.fastclassinfo.com

Next

Nextは、「プログラム6のFor文」の終わりを意味する記載です。

プログラム10|プログラムの終了

End Sub

プログラム0の「Sub Excel_CountIf()」と対になるプログラムです。

プログラム終了させる記載です。

「End Sub」を読み込むと、プログラムが終了します。

プログラムの解説はここまでです。

VBAについて詳しく理解したいなら

VBAを活用すると、仕事を効率化できる幅を広げることができます。

たとえば私が実際にVBAを活用して効率化してきた作業は以下の記事で紹介しています。

興味がある人は以下の記事もご覧ください。

www.fastclassinfo.com

動画でも解説しています。


エクセルマクロVBAで出来ることを15の事例で紹介|日常業務をラクにするヒントを見つけよう!

(音声が小さいので、ボリュームを上げてご覧いただければと思います)

VBAの勉強方法

私はプログラミング初心者からVBAを勉強を始めて少しずつレベルアップしていきました。

成長の過程は以下で紹介しています。

www.fastclassinfo.com

学習の過程では、意識すべきポイントがあります。

特に独学の場合だと、勉強を優先してしまい、肝心な実践を疎かにしがちです。

私の経験では、実践から逆算した勉強が必要だと考えています。

目指すべきは会社でお金をもらいながら勉強することです。

要はVBAを仕事の一つとして上司に認めてもらうのです。

そうすればわざわざ高いお金を払って勉強をする必要がなくなります。

しかも作業を自動化して、会社やチームに貢献しつつ、自らのスキルアップできます。

そのために必要な考え方を以下で紹介しています。

www.fastclassinfo.com

とはいえ、プログラミング初心者でVBAについて知識ゼロの人もいるはずです。

いきなり会社でVBAで使うことさえ、とてつもなくハードルが高く見えてしまうものです。

その場合は、VBAの基本について学ぶ必要があります。

たとえば車の運転も慣れてしまえば、たいしたことではありません。

しかし教習所で運転の基本を学び、免許を取得することで、公道で運転できるようになります。

VBAも同じです。VBAに免許はありませんが、まずは基本を学ばないことには会社で使えるレベルにはなりません。

実際に私もプログラミング初心者のときは、動画を見たり書籍を読んだりして勉強しました。

今はオンラインの教材で無料で学習できるものも多いです。

www.fastclassinfo.com

上記のリンクでは、私の経験から勉強にオススメの教材を紹介しています。

興味がある人はご覧ください。

VBAを自分で書けるようになる

さて、本記事で紹介したマクロを利用すれば、作業の自動化が可能になります。

しかしデメリットもあります。それはカスタムできないことです。

なぜなら、色々な要望が増えるからです。

この動画を見たとき、「もっと○○ができるのでは?」や「ここはなんとかならないのか」と感じる人は少なくないはずです。

例えば、「他の条件を付け加えたい」や「日付毎に条件を変えたい」といった要望が出るかもしれません。

このような要望を満たすには、マクロを勉強して自力でマクロを編集できるようになる必要があります

もし、自力でマクロを編集できるようになれば、今より仕事の効率はグッと上がります。

実際、私も自力でマクロを書けるようになってからは、仕事の生産性が一気に上がりました。

他の人が30分~1時間かけて行う仕事が、ボタン一つで終わらせることができるようになったのです。

その結果、周囲からの信頼も増し、仕事で高い評価を得られるようになりました。

ただ、要望に応えるようになるためには、マクロを学ぶ必要があります。

まずは無料でマクロを勉強してみる

ウェブや書籍で勉強すれば、マクロを習得できると考えている人は少なくありません。

しかし、仕事で使えるマクロを習得したいなら、仕事で使える部分に特化した教材で学ぶことをお勧めします。

なぜなら、ウェブや書籍には仕事に関係しない部分まで提供していることが多いからです。

例えば、マクロ初心者なのに配列を学ぼうとする人がいます。実は配列なしでも仕事で使えるマクロを書くことは可能です。

しかし、マクロ初心者ほど「全ての知識が必要だ」と考えて、無駄な学習に時間を使ってしまうのです。詳しくは、こちらの記事で紹介しています。

www.fastclassinfo.com

www.fastclassinfo.com

そこで、私がお勧めするのは仕事に直結するマクロ教材です。とくにお勧めするのは、こちらの無料オンライン動画です。

なぜなら、仕事に直結する部分に絞って、エクセルマクロを学ぶことができるからです。

マクロの作り方・考え方から解説しているので、教材をしっかり学べばここで紹介したマクロをゼロから書けるようになります。

マクロ初心者が、仕事に直結したいマクロを学ぶなら、まずはこちらの無料オンライン動画を試すのがいいです。

興味がある人は、まずは無料でエクセルマクロの勉強を始めてみてください。

もっと学びたいと感じたら、さらに深く勉強をしてみることをお勧めします。