こんにちは。

今回から、実際にマクロを作成していきましょう。

晴れ課題1:
都道府県別にある調査を実施しました。
調査を実施した日付が記録された一覧表「チェック済み一覧」(以降、一覧表Aとします。)があります。
これを決められた並びの一覧表B「都道府県一覧」(以降、一覧表Bとします。)の調査日欄に移しかえなければなりません。
これをボタンを押すことで、一気に移しかえるマクロを作成しましょう。
※通常ならVlookupなどの関数で簡単にできますが、あえてマクロで処理します。

課題画面

1処理の流れを考える

マクロを作成する際には、まず設計図を作ります。

と言いても何らかの図面を作るとかではなく、どのような流れで処理をしていくかを考えるということです。

これは非常に大事です!

とにかく思いつくことから作成していくと、プログラムの修正が多くなっりかえって時間がかかってしまいます。


今回は複雑な処理はありませんので、以下のような流れで処理していきましょう。

⑴一覧表Aの都道府県を一覧表Bから探し出す。
⑵都道府県名が一致した行の調査日欄に、一覧表Aの調査日を入力する。
⑶⑴、⑵の処理を一覧表Aのデータ個数分繰り返し処理する。
⑷一覧表Aの都道府県名が一致しないものがあれば、エラーコメントを表示する。

2具体的にどのような処理になるかを考える。

設計図通りに作成するには必要な処理を考えなければなりません。

⑴・・・・
一覧表Aの最初の都道府県である「群馬県」が一覧表Bのどこにあるかを上から順に検索していかなければなりません。ということは”上から順に処理する”方法が必要となります。

⑵・・・・
一致していたら調査日を入力するので、”一致したら処理する”方法が必要となります。

⑶・・・・
一覧表Aのデータの数だけ繰り返して処理するので”データの数だけ繰り返し処理する”方法が必要となります。

⑷・・・・
一致しないデータがあったかを判断しなければなりません。
ここは、ちょっと頭をひねる必要がありますね・・・。
「調査日を入力した数と一覧表Aのデータの数が一致」していれば、すべて一覧表Bに該当するデータがあったと考えてよさそうですね。
一致してなかったときにエラーコメントを表示することで解決しそうです。


ロボットやらなければならない処理が分かったところで、プログラムを考えていきましょう。

これまで、まったくプログラムの構文について説明していませんので、想像がつかないと思います。
これから出てくる構文をしっかりと覚えれば大丈夫です!
頻繁に使用する構文となりますので一つ一つ理解しながら覚えていってください。

■上から順に処理する方法。

順番に処理する(指定の範囲を処理する)代表的な構文は

【 For [変数] = [開始] to [終了] ~ Next 】です。

 ※単語と単語の間には必ずスペースが必要です。

これは、[開始]から[終了]まで[変数]に”プラス1”しながら” ~ ”部分の処理を実行するものです。
[開始][終了]は数値となります。(0からでもOK)
※[変数]は任意の数をプラスすることも可能です。

以下の例を見てください。

For i = 1 to 10
 kasan = kasan + i
Next

これを実行すると変数「kasan」の値は「55」になります。

変数「i」に1を代入して処理を開始します。 
「kasan」は数値型にしていますので、初期値は「0」になります。
その初期値「0」の「kasan」に変数「i」の値をプラスします。
よって「kasan」は0+1で「1」となります。

これを10回繰り返すことになりますので「kasan」の値は

 1、3、6、10、15、21、28、36、45、55

となるわけです。

はてなマークこの構文を使って上から順に処理していくためにはどうすれば良いでしょうか

そうです!
「1」プラスされていくということは、この変数を使用して行を順番に指定していくことができるのです。
[開始]は見出し行は関係ないので「2」を指定しましょう!

[終了]が問題になります。

一覧表Bを見て最終行である「17」を指定するれば良いと思われるかもしれません。
この一覧表Bが今後追加されることが無いことが保証されていればそれでかまいません。
その保証が無い場合は、行が増えても良いように対応できなければなりません。

そこで、必要となるのが最終行を取得する構文です!

Cells(Rows.Count,[対象の列]).End(xlUp).Row

 ※「.」はドットです。

これも頻繁に使用しますので必ず覚えてください。

解説します。

「Cells」については、その名のとおり「セル」の場所を指定する際に使用します。
Cells(行,列)という形で場所を指定します。

最後の「.End(xlUp).Row」は、下から検索してデータがあった行番号を取得するという意味になります。
(xlUp)については検索していく方向を示します。”下から上”なので”Up”となります。
※「xl」については何も考えず、くっ付けると思ってください。
では、どこから上に検索していくのかという問題が残ります。

そこで出てくるのが「Rows.Count」です。Rows=行という意味ですので、利用できる行をカウントするという意味になります。
そうです!一番最後の行からということになります。
エクセルの利用できる行数はバージョンによりことなりますが、これを使用すればバージョンを気にする必要はありません。

これで最終行を取得する構文が分かりましたので、一覧表Bの最終行を取得するには

「変数」= Cells(Rows.Count,1).End(xlUp).Row

で良いことが分かります。「変数」は「LastRow01」とでもしましょうか。

For文にもどって、For文を完成させましょう。プラスしていく変数は「i」とします。

For i= 2 to LastRow01 ~ Next となります。


■上から順に処理するプログラム

LastRow01 = Cells(Rows.Count,1).End(xlUp).Row

For i = 2 to LastRow01


< 流れの⑵~⑶の処理 >
 ※「i」の値を行位置として使用。


Next




ここまで理解できましたか。

【 For [変数] = [開始] to [終了] ~ Next 】

Cells(Rows.Count,[対象の列]).End(xlUp).Row

この2つを理解できれば、プログラムの半分はできたことにります。


次回は、⑵以降のプログラムについて説明したいと思います。