パソコンスキルの教科書

パソコンスキルの教科書

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

ExcelマクロVBAでSumproduct関数を作成(条件に合うデータを自動計算)

f:id:gene320:20210314161002p:plain

条件に合ったデータの計算をおこなうとき、SUMPRODUCT関数を使うと便利です。(実際にはIF関数とSUM関数を組み合わせても対応可能です)

たとえば、本記事でサンプルでは、「=SUMPRODUCT*1」で、Excel関数によって処理を行うことが可能です。

このようにExcelでSUMPRODUCT関数を使えば、条件に合うデータを算出できます。

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

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

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

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

VBA作成前の準備

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

具体的には以下です。

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

2. 開発タブを追加

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

www.fastclassinfo.com

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

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


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

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

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

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

1. セルH3の製品名とD列で一致するデータを取得

2. 一致したデータの数量と単価から金額を取得

3. 合計金額を算出して、セルI3に出力

f:id:gene320:20210314161825p:plain

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

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

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

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

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

    'プログラム2|対象シートを設定
    Dim Ws As Worksheet
    Set Ws = Worksheets("Sheet8")

    'プログラム3|最終行の取得
    Dim Cmax As Long
    Cmax = Ws.Range("A65536").End(xlUp).Row
    
    'プログラム4|変数設定
    Dim Goukei As Long, Kingaku As Long, i As Long
    
    'プログラム5|製品名を取得
    Dim Seihin As String
    Seihin = Ws.Range("H3").Value
    
    'プログラム6|D列の製品名を取得
    For i = 2 To Cmax
        If Seihin = Ws.Range("D" & i).Value Then
            
            'プログラム7|数量×単価を算出
            Kingaku = Ws.Range("E" & i).Value * Ws.Range("F" & i).Value
        
            'プログラム8|金額を加算
            Goukei = Goukei + Kingaku
        End If
    Next
    
    'プログラム9|セルI3に合計値を出力
    Ws.Range("I3").Value = Goukei
    
'プログラム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_SumProduct()

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

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

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

Sub プロシージャ名()

End Sub

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

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

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

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

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

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

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

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

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

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

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

f:id:gene320:20210314185549p:plain

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

1. Dim Ws As Worksheet

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

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

Dim 変数 as 型

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

2. Set Ws = Worksheets("Sheet8")

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

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

そのためシートを指定しないと、想定しないシートにデータを出力してしまうことがあります。

注意が必要です。

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

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

f:id:gene320:20210314185720p:plain

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

1. Dim Cmax As Long

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

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

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

Ws.:シート「Sheet8」の(プログラム2で設定)

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

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

Row:行番号

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

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

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

検証プログラム

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

検証結果

Cmax:21

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

プログラム4|変数設定

    Dim Goukei As Long, Kingaku As Long, i As Long

「Goukei」、「Kingaku」、「i」をLong(整数)型の変数として定義します。

「Goukei」は「金額合計」を算出するのに使います。(プログラム8)

「Kingaku」は各行の「数量×単価」を算出するのに使います。(プログラム7)

「i」はSheet8のD列、E列、F列を繰り返し処理する際の、ForNextのカウンターとして使います。(プログラム6)

プログラム5|製品名を取得

    Dim Seihin As String
    Seihin = Ws.Range("H3").Value

f:id:gene320:20210314182606p:plain

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

1. Dim Seihin As String

「Seihin」をString(文字列)型の変数として定義します。

「Seihin」はセルH3の値を取得するのに使います。(以下のプログラム)

2. Seihin = Ws.Range("H3").Value

セルH3の値を「Seihin」として取得します。

この事例では、「Seihin = キーボード」となります。

プログラム6|D列の製品名を取得

    For i = 2 To Cmax
        If Seihin = Ws.Range("D" & i).Value Then

f:id:gene320:20210314183545p:plain

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

1. 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

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

2. If Seihin = Ws.Range("D" & i).Value Then

Seihin(プログラム5で設定)の値とD列の値が一致するかどうかを検証します。

この事例では、「Seihin = キーボード」となっています。

そのため、D列で「キーボード」が入力されているセルがあれば、以下のプログラム7、8を実行します。

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

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

www.fastclassinfo.com

プログラム7|数量×単価を算出

            Kingaku = Ws.Range("E" & i).Value * Ws.Range("F" & i).Value

f:id:gene320:20210314183906p:plain

Kingakuは、E列(数量)とF列(単価)を掛け算した値です。

プログラム6でD列の条件が合致した行のみを計算します。(この事例では「キーボード」です)

ここでは、以下の行が対象となります。

2行目:数量4×単価3000 = 12000

7行目:数量6×単価3000 = 18000

各行でKingakuが算出されるので、そのKingakuをプログラム8で累算します。

プログラム8|金額を加算

            Goukei = Goukei + Kingaku
        End If
    Next

f:id:gene320:20210314184601p:plain

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

1. Goukei = Goukei + Kingaku

金額の累計値を算出するための変数「Goukei」に「Kingaku」(プログラム7)を加算していきます。

加算は、「Goukei = Goukei + Kingaku」と記載します。

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

つまり「右辺(Goukei+Kingaku)を先に計算して、左辺(Goukei)を更新」します。

この考え方は混乱してしまう人が多いです。悩んでも分からないうちは、そういうものだと覚えてしまうことをオススメします。

2. End If

この「End If」はプログラム6の2行目「If Seihin = Ws.Range("D" & i).Value Then」のIf文の終わりを意味します。

ForNext文やIf文が組み合わさると、どのIfとEnd Ifが対応しているのか分からなくなりがちです。

インデントをそろえるようにして、ミスが減るように工夫すると良いです。

VBAを作るコツについては以下で詳しく解説しています。

www.fastclassinfo.com

3.Next

この「Next」はプログラム6の1行目「For i = 2 To Cmax」のFor文の終わりを意味します。

プログラム9|セルI3に合計値を出力

    Ws.Range("I3").Value = Goukei

f:id:gene320:20210314185041p:plain

プログラム8で算出したGoukeiをセルI3に出力します。

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

End Sub

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

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

「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

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

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

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

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

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

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

*1:D2:D21=$H$3)*(E2:E21),(F2:F21