では最後のコード「For Each~Next」です。
今回はコードを実行するにあたってどんな動きをしているか見ていただきたいのでコードの紹介に合わせてウォッチウインドウの使い方も紹介させていただきます。
前回は「Do~」の皆様について紹介させていただきました。
今回は1個だけですよ。安心してください。4つになりませんので。
余談ですが中国語って1文字で発音4つあるんですよ。大学で勉強したんですけどほとんど忘れました。「ただただ難しかった」という印象しかないです。
・・・話がそれましたね。本題に戻しましょう。
For Each~Nextはオブジェクト毎に先に範囲を決めてから範囲内をループさせるという使い方をします。
オブジェクトが分かりにくい方もいますので具体的に申し上げますと以下のような感じになります。
・フォルダの中にある複数のエクセルブック
・1つのエクセルブックの中にある複数のシート
・1つのシート内にある複数のセル
イメージでとらえていただきたいのですがコードを書く上で操作対象となるものをオブジェクトと呼びます。
実際はただのデータですので捜査対象のように物体、要素としてとらえるのは難しいのですがたくさんコードを書いているとイメージ出来るようになってくると思います。
上記のくくりの様にある時点で「中身は違うけど同じ要素」を最初に指定して(オブジェクト毎)その中をループして処理をしましょうというのが「For Each~Next」になります。
一見便利そうなんですけど変数の定義の知識、オブジェクトの知識がないと難しい処理となります。加えてループさせる順番の規則性はあるのですが指定は出来ないのでとにかく範囲内の物体に対して処理をしたい時には有効ですがそうじゃない時は処理も増えてしまうので気を付けて使ってください。
そんなわけで私はFor~Nextが一番使いやすいのですがFor Each~Nextで書いてあるコードを読むことがあるかもしれませんのである程度理解はしておく必要があります。
では説明していきます。
先にコードの内容をお伝えします。やろうとしている事は1つのエクセルブック内のシートをすべてループして各シートの「セルA1」にそれぞれのシート名を書くというコードを用意しました。
「sheet1」の「セルA1」は「sheet1」と記載されます。
sheet2~4も同様の処理がされます。
最後に「sheet5」の「セルA1」は「sheet5」と記載されます。
シートがあるだけループされて処理が進みます。シート名を変えておけばそのシート名が各シートの「セルA1」に展開されます。
以下コードを紹介します。
Each の後に変数を設けて In の後に用意したコレクション内のオブジェクトをループしながら順番に変数にセットするという処理をしています。
というわけで今回は変数「w」にはワークシートが順番にセットされます。よって変数「w」の定義はWorksheet(単数)で行います。
In の後のWorksheets はコレクションですので複数形です。ロジカルに考えるよりはイメージを持っていただきたいのですが沢山あるシートを1つずつ変数「w」にセットしていくよと思って下さい。だから母数となるものは複数形で1つずつ変数に収納するので収納先となる変数は単数形だよぐらいで考えてください。
続いて w.Range("A1") = w.Name は読み替えると Sheet1.Range("A1") = Sheet1.Name となります。シートは画面で表示されている左から変数にセットされるのでここではSheet1からSheet5に向かって順にセットされることになります。
上記のとおりシートは5枚ありますので変数「w」はループするたびに次のシートを掴みにいきます。よって以下の様にコードが変化していく事になります。
Sheet2.Range("A1") = Sheet2.Name
Sheet3.Range("A1") = Sheet3.Name
Sheet4.Range("A1") = Sheet4.Name
Sheet5.Range("A1") = Sheet5.Name
最後にNextまでいったら先頭に戻ります。ループするオブジェクトが無くなったらループを終えて次のコードに進みます。建付けと動きについてはざっとこんな感じとなります。
・・・ちょっと難しくないですか。私は最初「意味が分からない」って思いました。
当時何を思っていたのかを思い返してみると勉強初期はオブジェクトの事も分かってないからそもそもコードが書けないしVBEの使い方も慣れてなかったのでデバッグしても繰り返し処理の中で何が起こっているのか分からなかった事を思い出しました。
一言で言うと「ブラックボックス」でしたね。だから使いたくなかったです。
今はオブジェクトについても理解が進んだこととVBEの使い方も分かってきたので使いにくさは無くなりました。理解を深める為にVBEを使って実際にどうやってシートを掴んでいるか見てみましょう。
「F8」でコードを送っていくとローカルウインドウで変数「w」が出てきます。どんな動きをしているのか確認しようと思い変数「w」の横にある+をクリックするとOutlookが起動してしまいます。シートオブジェクトを見に行こうとすると決まって起きるのですがどうやらバグの様です。
これが出てきます。全部×ボタンで消してください。
この処理以外はローカルウインドウは正常に動きます。とても便利ですので「いつもお世話になっております」という感じなのですがこの件に限っては使いにくいです。
毎回Outlookを消せばローカルウインドウでもコードを追いかける事が出来るのですが都合が悪いので今回はウォッチウインドウを使いましょう。VBEにウォッチウインドウが居ない時はVBEの表示タブからセット出来ますので試してみてください。
ウォッチウインドウの枠内で右クリック。「ウォッチ式の追加」を選択。
式の枠内に今回は「w.name」と書いてください。対象とウォッチの種類は基本的にはそのままでOKです。
ウォッチウインドウにn.Nameが準備されます。nameのNが大文字に変化してますよね。
あとは実際のコードを「F8」キーで1つずつ進めてコードをループさせてみましょう。ウォッチウインドウの値の欄にシート名が表示されます。最終的にはSheet5まで変化します。これでどのタイミングでどのシートを掴んでいるのか分かりますよね。
今回は「For Each~Next」とウォッチウインドウの紹介をしました。
繰り返し処理についてはまだ種類があるのですがこれぐらいで十分だと思います。まずは使ってみてください。コードを書くだけではなく実際に動かして何が起こっているのか把握する事が重要です。
そうしないと不具合が起きた時にデバッグ処理に苦労します。処理を追いかける事が出来なくなり自分で書いたコードが直せないという事が起こるかもしれません。
便利ですが内容把握してないと後でツケが回ってきやすいコードです。でも使えると世界が広がりますので是非頑張って勉強してみてください。