マクロといえばループ処理
「データを1行ずつみていって、その行の内容によって処理内容を変えたい」
「データを1行ずつみていって、特定の行だけ別シートにコピーしたい」
「データを1行ずつみていって、特定の行だけ削除したい」
「番号を入力すればm名前や住所などの情報がでてくるようになっているシートをリスト番号すべて印刷したい」
こんなことやりたいんだけど、どうすればいいの?
ループってのがあるらしいんだけど、どうかくのか分からない。
本やwebを参考にコピペしてみたけどなにがどうなって、何故そうなるのかよくわからない。
そんなことで悩んでいないでしょうか。
私は悩んでましたし、Yahoo!知恵袋で質問したりしました。
その時はループは教えてもらえず、別の手段で解決してしまいましたが・・・汗
そんな方向けのページとしています。
※ 本やwebのループ文を参考に作ってみたけど/丸写ししたけど、動きがどうなっているのか分からない!という方は先述したステップイン機能を使ってみてください。
初めてのループ文
初めてループ文を書いてみるという方はここから説明です。
エクセルマクロのループには2種類ありますが、ここではfor ~ nextを使って説明します
(あくまで目的はループの動き、ループとはこういうものだということを知ってもらうためfor 〜 nextを使用します)。
書き方はとても簡単。
モジュールへ下記の文を記述してみてください。
dim myLoop
for myLoop = 1 to 10
msgbox “ループだよ”
next myLoop
end sub
意味としては「forとnextの間の処理を1から10までの10回行いますよ」というものになります。
※ 今回、forとnextの間の処理はメッセージボックスを表示するだけにしています。
ステップインで確認
このときの動きをステップイン機能を使って確認してみましょう。
ファンクションボタンF8を3回押すと黄色のマーカーがmsgboxのところにきたと思います。
マーカーは「これからここの処理をしますよ」という意味でしたね。
それではもう一度F8を押します。
すると、メッセージボックスが表示されます。
メッセージボックスのOKボタンを押してマクロ画面(VBE)へ戻るとnextの部分が黄色になってますね。
この時にmyLoop部分にカーソルをもっていき、マウスオーバー(クリックしないでちょっと待つ)すると「1」と出てきます。これが、「ループ1回目ですよ」というサインです。(ここでのmyLoopというワードは変数と呼ばれるものですが、いまは気にせず読み進んでください)
もう一度F8を押してマーカーがmsgboxのところにきた時に再度myLoopへマウスオーバーすると「2」になっていると思います。「ループ2回目」ということですね。
この例のループ処理は、もうおわかりかと思いますが、
「メッセージボックスの表示を10回繰り返す」
という記述となります。
※ この例文の使い道はないのであしからず・・
まずはループの動きについて理解頂けましたでしょうか?
ループ文を書く時にはfor 〜 nextの間にループで処理したい内容を書いていくことになります。
でも、この説明だけじゃ1行ずつデータを見ていけないじゃないと思いますよね?(するどい!)
1行ずつデータを見ていくことについては次のステップ「変数」の章にて説明していきます。
ここでは「ループってこんなものなんだ」「こんな動きするんだ」ということを覚えていただければと思います。
マクロの書き方の予備知識
■予備知識-その1■
今後の不要なエラーを起こさないために・・・
この章で記載したループ文や先述のif文を書くときの注意点です。
「for 〜 next」 や「if 〜 endif」 を使う時に、for(if)を書いてどんどん記述を重ねていくと、書いている内容がどんどん長くなり、for 〜 nextでループさせたいのに最終的にnext(endif)を書き忘れてしまってエラーが出るなどよくあります。
そんなことが起こらないように、for(if)を書いたらすぐにnext(endif)を書いて、その間に処理内容を書いていくクセをつけましょう。
■予備知識-その2■
飛び飛びのデータでループさせたい場合 ※ 規則性あることが条件
通常、for 〜 next を普通に書いたら1ずつ増えていきます。
↓の場合です。
for myLoop = 1 to 10
[ ここに処理内容 ]
next
2ずつ増やしたい場合は下記のように記載します。
for myLoop = 1 to 10 step 2
[ ここに処理内容 ]
next
これでmyLoopは1,3,5,7,9の順番でループしていくようになります。
覚えておくと後々役に立ちますので頭に入れておきましょう。