[VBA実践]ゴールと道のりを明確にしよう![#1]

記事
IT・テクノロジー
前回までの記事で、VBAの「これだけは理解しておいてほしい」という内容の解説は終了しました。

今回から、[VBA実践]シリーズとして、実際にVBAを書き、マクロを作り上げていく流れを体験していただきます!

手順1.ゴールを決める

マクロを作ることで、様々なことが自動化出来ます。とはいえ、「何をするのか」が明確でなければ、何も作ることが出来ません。
というわけで、「何をするのか」というゴールをまず決めます。普段お仕事をされている方であれば、「どんな業務が面倒か」「どんな業務に手間がかかっているか」を考え、「それを自動化する」ことをゴールにすると良いです。

今回の例として、「売上をまとめているExcelの一覧から、担当者ごとの一覧を作成する業務の自動化」を考えてみます。

以下の画像を見て下さい。
売上一覧.png
どの担当者がどの商品をどのくらい売り上げたのか、というものが一つにまとまっていますね。これを「売上一覧」というシート名で作っておきます。

ちなみに、商品情報は別のシートに以下のように作っておき、金額を参照するようにすると、より実践的ですね。
商品情報.png

この商品情報が載っているシートを「商品情報」というシート名にしておきます。
これらのようなシートをまず準備してみてください。もちろん、数式などは適宜活用しましょう。(Noの欄や、売上一覧の単価、売上なんかは数式が活用出来ますね)

今回は「売上一覧から担当者ごとの情報を抽出する」のがゴールなので、売上一覧シートの右側に以下を以下のようにしましょう。
転記先.png
I1セルに抽出担当者名を入力し、「抽出」ボタンを押すと、全員の売上一覧から担当者分のみ、K~P列に転記される、というイメージですね。(実際にはP列の担当者欄は省いても良いですが、書いておく方が確認しやすいので残しておきます)

これを一旦、今回の「ゴール」とします。

手順2.道のりを少しずつ明確にし、VBAで書いてみる

さて、ゴールが決まったので、次は「どうやってそのゴールにたどり着くか」という道のりを決めていきます。

まず、マクロを実行するタイミングで、A~F列の情報は入力済です。また、I1セルに「抽出担当者」が入力されている状態ですね。
「抽出担当者」と同じ名前の情報を売上一覧から選ぶ必要があるので、この「抽出担当者」が今回の肝ですね。
また、担当者の列がF列に入っているので、まず以下の手順が必要なことが分かります。
1.抽出担当者の名前を使う
2.F列の値と抽出担当者が同じかどうか判断する

一旦ここまでの内容を、VBAで書いてみましょう!
ポイント:
1.活用する値は使い回しやすいように…
2.まずは売上一覧の1行分に対して書いてみる
3.「同じかどうか」=「もし同じなら」→VBAでの書き方は…

1行分のデータに対して、抽出担当者と同じかどうかを判断するところまで書いてみて下さい。
同じだった場合どうするかなどの処理はまだ書かなくて大丈夫ですが、正しく判定出来ているかどうか、何かしらの方法で確認出来るようにしておきたいですね。

…書けましたでしょうか。
大まかに、以下のように書けていたら大丈夫です。

Sub 担当者ごと抽出()
    Dim targetName As String
    targetName = Cells(1,9).Value

    If Cells(2,6).Value = targetName Then
        '一緒だった時の処理
        Debug.Print "担当者名が" & targetName & "と同じです!"
    Else
        'そうでない時の処理
        Debug.Print "担当者名が" & targetName & "ではありません!"
    End If

End Sub

まず、抽出担当者の名前を代入するための変数(targetName)を宣言し、値を代入します。
I1セルはCells(1,9)で表現していますが、Range("I1")でも大丈夫です。
変数を使わなくても今回の処理自体は出来ますが、変数を使う方がその後のコードが読みやすいので、今回の抽出担当者のような、条件として活用するような値は変数にしておく方ことをオススメします。

次に、F列の値が抽出担当者と同じか判断する部分ですね。ここが今回一番大事な部分です。
まず、「等しいかどうか」など「もし等しいなら」などの判断をする場合はIf文を使うんでしたね。

今回は1行分のデータで判定するので、「F列の2行目が抽出担当者と等しいなら」「そうでないなら」、という意味で
    If Cells(2,6).Value = targetName Then

    Else

    End If
と書きました。
これで、F2セルが抽出担当者と等しい場合、IfとElseの間の処理が実行されます。逆に等しくない場合はElseとEnd Ifの間の処理が実行されます。
今回は判定結果の処理を以下のように書きました。

Debug.Print "担当者名が" & targetName & "と同じです!"
Debug.Print "担当者名が" & targetName & "ではありません!"

Debug.Printを書いておくと、イミディエイトウィンドウにその内容が表示されます。
""で囲っている部分は文字列ですね。
targetNameは変数なので、文字列とくっつけるために&で繋げています。
(あえてtargetNameを使っているのは、「ちゃんと抽出担当者名が変数に代入出来ているか」を確認する意味も込めています。)

このようにDebug.Printを書いておくことで、まだマクロすべては完成していませんが、「判定が正しく機能しているか」を確認できますね。

というわけで、このマクロを実際に動かしてみます!
今F2セルには「山田」と入っている状態で、抽出担当者として「山田」と入力している状態です。
VBE上で、F5キーで実行!
デバッグ.png
VBEの右下のイミディエイトウィンドウに「担当者名が山田と同じです!」と表示されているので、正しく動いてそうですね!
念の為、抽出担当者を「田中」と書き換えて、もう一度実行してみましょうか。
名前が違うので、Else~End Ifの内容が実行されるはずですね。
デバッグ2.png
はい、正しく判定されていますね!

まだゴールまでは遠く感じるかもしれませんが、ここまでで全体の30%は出来ています。

今回のまとめ

マクロをつく作る際の手順として
1.ゴールを決める
2.道のりを少しずつ明確にし、VBAで書いてみる
ということを紹介しました。

慣れてくると、作り始める前に最初から最後までの流れをある程度具体的に決めておく方が良いですが、初心者がそれを真似して最初から最後までのコードを一気に書くと、絶対にどこかでミスが出て、
「どこでミスがあるか分からない」
「そもそも道のりが正しいか分からない」
「書いているうちに何をしているか分からなくなる」
という状態に陥ります。

そうなることを防ぐためにも
「ゴールへの処理を一つずつ書く」
「複数行に対して実行する処理を1行分に対してだけ書いてみる」
「書いた処理が正しく動くか確認する」
ということを必ず意識しましょう。

これを繰り返すうちに、徐々に一気に書ける量が増え、ミスも減っていきます。


次回予告

次の記事で、今回のマクロを一旦完成させます。
その前に、「このあとの処理をどうするか」を考える必要がありますね。
というわけで次回の記事に進む前に、ゴールへの残りの道のりを考えてみて下さい。
それでは今回もお疲れさまでした!

また、今回の内容でよく分からない、思うような結果にならなかったという人や、「こういう書き方でやったけど問題無い?」というような質問がある方は、以下の有料サポートをご利用下さい。
出来るだけ迅速に、丁寧に対応致します。
次の記事はこちら

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す