最後のシートまで処理を繰り返す為に変数を使いこなす
ブック内のシートをつかむ方法について私(EnjoyExcel)を含め3人が議論していますよ。話を聞いてみましょう。
ワークブック内のワークシートを周回する方法が知りたいです。
「For Each ~ Nextステートメント」を使うとブック内のシートを順につかむ事ができます。
一緒にローカルウインドウを見る事でより理解が進みますよ。
ローカルウインドウってなんですか?
私には「For Each ~ Nextステートメント」は難しいです。他の方法を教えて欲しいです。
他の方法ありますよ。今から紹介するコードの方が分かりやすいので安心してください。
ついでにFor Each ~ Nextステートメントについても解説しますね。
最後のシートまで処理を繰り返す時の定番は「For Each ~ Nextステートメント」です。
しかし初心者様からすると「難しい」様です。「何が起きているのですか?」という質問を多くいただきます。
ローカルウインドウを見ると理解できる方も居るのですがローカルウインドウ自体を知らない方も多いです。
ローカルウインドウは知っているが見ても分からないという話も聞きました。これは説明する必要がありそうです。
本記事ではFor Each ~ Nextステートメントを「使う」or「使わない」2通りの方法でシートを周回してみます。
- For Each ~ Nextステートメントを使わないコード ・・・ For~Nextステートメントを使います
- For Each ~ Nextステートメントを使うコード ・・・ 動画を使って分かりやすく説明します
2つの方法が理解できれば3人の議論で出てきた内容全てに回答する事になりますよね。早速説明に移りましょう。
関連記事
For Each ~ Nextステートメントを使っている記事のリンクです。
Like演算子と一緒に使う事でブック内のシートから特定文字を含むシートだけを選択するという作業をしています。
For Each ~ Nextを理解するマクロで特定文字を含むシートを選択|For Each ~ Next & Like
こちらの記事ではフォルダ内のファイル名を全て取得するという作業を自動化しました。
Excel以外の拡張子についてもファイル名を取得できる仕様です。
フォルダ内のファイルにアクセスマクロでフォルダ内のファイル名を取得|Excel以外の拡張子にも対応
関連書籍
VBAなどプログラミングの本は「字が多くて分かりにくい」というのが定番です。
しかしこの本は絵本の要素が含まれていて読みやすい仕様になっています。
分からない事があった時はこの本を読むと理解できた事が何回かありましたので紹介させていただいた次第です。
続いて電子書籍です。
まずは「繰り返し処理」と「変数」を理解する
本記事のキーになる要素は「繰り返し処理」と「変数」です。
繰り返し処理
まずは繰り返し処理について定義を確認しましょう。
Wikipediaでは「ループ」という表現で繰り返し処理を解説しています。
ループとは、特定の条件下において特定の処理を繰り返すこと、あるいはそのように作られた制御構造のこと。
特定の条件が成立している限り、特定の処理を繰り返し何度でも実行する。
逆に言えば、条件が成立しなくなったときに、処理を中止する。
Wikipedia:ループ (プログラミング) より抜粋
引用文には「特定の条件下・・・」と抽象的な書き方になっていますね。これは色々な条件が設定できる為です。
一般的に設定した条件が成立しているうちは処理を繰り返すというというのが「繰り返し処理」です。
変数
続いて変数です。
プログラミングにおける変数(へんすう、英: variable)とは、高水準言語のプログラムのソースコードにおいて、扱うデータを読み書きする記憶域 (storage) のことである。
Wikipedia:変数(プログラミング)より抜粋
数値や文字、オブジェクトなど色々な要素を格納する箱(記憶領域)を変数と呼んでいます。
事例紹介:最後のシートまで処理を繰り返す
最後のシートまで処理を繰り返すにあたり今回は特に「変数」に活躍してもらう必要があります。
変数に格納する値にバリエーションを持たせる事でブック内の全てのワークシートにアプローチできる様にします。
以降冒頭で説明した様にFor Each ~ Nextステートメントともう1つの方法(計2つの方法)を紹介します。
各方法では変数を使います。それぞれ格納される要素が違います。変数の使い方に注目し事例をご覧ください。
作業環境
ブック内にワークシートを5つ(5枚)用意しました。
このワークシート群をループする為に2つの変数を用意しています。
- 変数 idx : 数値を格納する(インデックス番号として使う)
- 変数 ws : ワークシートを格納する
2つの変数と2つの繰り返し処理を使って最後のシートまで処理を繰り返してみます。
変数に数値を格納_For~Nextステートメント
変数に数値を入れる事で最後のシートまで処理を繰り返します。
何の数値を格納するのかと言いますと「ワークシートのインデックス番号」です。
実はワークシートはインデックス番号を持ってます。画面左のシートから1、2、3・・・という並びです。
このインデックス番号を変数に格納しつつループを組めば全てのワークシートをつかむ事ができます。
しかしFor~Nextステートメントの仕様としてループを組む時に始点と終点を定義する必要があります。
この仕様からすると最初からワークシートの枚数が分かってないと使えないです。困りましたね・・・。
実はこれも解決させる事ができます。ループの終点でこのプロパティを使いましょう。コードをご覧ください。
コード
コードをご覧ください。ポイントはWorksheetオブジェクトのCountプロパティです。
Sub 最後のシートまで処理を繰り返す_1()
'ワークシートのインデックス番号を指示する為の変数
Dim idx As Long
For idx = 1 To Worksheets.Count '終点はシートの最大枚数と同じ
Worksheets(idx).Range("A1") = Chr(64 + idx)
Next
End Sub
解説
WorksheetsオブジェクトはCountプロパティを持っています。単純にワークシートの数が返ってきます。
このプロパティを使えばブック内のワークシートの数に依存せず全部のシートにアプローチする事ができます。
加えてこのコードの方がFor Each ~ Nextステートメントを使うよりやっている事をイメージしやすいです。
For Each ~ Nextステートメントが苦手な人はこちらのコードの方がおすすめです。是非お試しください。
参考ですが似たような事をやっているのはワークシートに入力された文字の最終行を取得するコードですね。
このコードでは行の最終値(1,048,576)を取得しています。
Cells(Rows.Count, 1).End(xlUp).Row
最後にChr関数です。ワークシート関数のCHAR関数と同じ使い方です。詳細はこちらの記事をご覧ください。
文字コードを理解するエクセルのCHAR&ROW関数でAからZのアルファベットを並べる
変数にワークシートを格納_For Each ~ Nextステートメント
次は変数にワークシート(オブジェクト)を格納する事で最後のシートまで処理を繰り返します。
そもそもFor Each ~ Nextステートメントがどんな構文なのか知りたい方はこちらの記事で確認ください。
動画:For Each ~ Nextステートメントを視覚で理解する
この後解説もしますがFor Each ~ Next ステートメントは絶対的に分かりにくいです。
よって動画を用意しました。この動画を見ていただければFor Each ~ Nextステートメントが分かる様になります。
コード
コードをご覧ください。動画内のコードと同じ仕様です。ポイントは変数wsとWorksheetsコレクションです。
Sub 最後のシートまで処理を繰り返す_2()
Dim idx As Long 'Chr関数で文字を1つ送る為の変数
Dim ws As Worksheet 'ワークシートオブジェクトを格納する
For Each ws In Worksheets
ws.Range("B2") = Chr(65 + idx)
idx = idx + 1
Next
End Sub
解説
2つ目のコードでも変数idxは数値を格納しています。今回はChr関数の引数を可変させる目的で使用しています。
Chr関数についてはこちらの記事をご覧ください。ワークシート関数のCHAR関数を説明している記事になります。
使い方や理屈はChr関数もCHAR関数も同じですのでご安心ください。
残りは動画内で解説しているので動画では言ってない事を補足する事にします。
実際にいただいた質問に回答するかたちで情報を用意してみました。
まとめ
For Each ~ Nextを使わなくてもブック内の最後のシートまで処理を繰り返すという処理を実践しました。
加えてFor Each ~ Nextを理解してもらいたいと思ったので動画を用意させていただきました。
今回紹介した2つのコードの様に1つの事象を解決させる為には複数の方法があります。
Aのロジックでは難しいなと思ったらBのロジック、Cのアルゴリズム・・・とやり方を変えてみてください。
そのアプローチ自体がスキルアップになります。思考した内容はいつかのアウトプットに役立つはずです。
他の繰り返し処理を使った記事(Do ~ Loop)を用意しておきます。参考にしてください。
Do ~ LoopステートメントVBA|Dir関数を使ってフォルダ内の複数ファイルを順番に処理する