VBA|最後のシートまで処理を繰り返す|変数をうまく使いこなそう

「最後のシートまで処理を繰り返す」のタイトル画像

お知らせ記事には広告が含まれておりますがExcelのスキルUPに繋がる様コンテンツ自体は手を抜かずに作成しております

最後のシートまで処理を繰り返す為に変数を使いこなす

ブック内のシートをつかむ方法について私(EnjoyExcel)を含め3人が議論していますよ。話を聞いてみましょう。

Aさん
Aさん

ワークブック内のワークシートを周回する方法が知りたいです。

EnjoyExcel
EnjoyExcel

「For Each ~ Nextステートメント」を使うとブック内のシートを順につかむ事ができます。

一緒にローカルウインドウを見る事でより理解が進みますよ。

Bさん
Bさん

ローカルウインドウってなんですか?

私には「For Each ~ Nextステートメント」は難しいです。他の方法を教えて欲しいです。

EnjoyExcel
EnjoyExcel

他の方法ありますよ。今から紹介するコードの方が分かりやすいので安心してください。

ついでにFor Each ~ Nextステートメントについても解説しますね。

最後のシートまで処理を繰り返す時の定番は「For Each ~ Nextステートメント」です。

しかし初心者様からすると「難しい」様です。「何が起きているのですか?」という質問を多くいただきます。

ローカルウインドウを見ると理解できる方も居るのですがローカルウインドウ自体を知らない方も多いです。

ローカルウインドウは知っているが見ても分からないという話も聞きました。これは説明する必要がありそうです。

本記事ではFor Each ~ Nextステートメントを「使う」or「使わない」2通りの方法でシートを周回してみます。

  • For Each ~ Nextステートメントを使わないコード ・・・ For~Nextステートメントを使います
  • For Each ~ 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枚)用意しました。

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関数も同じですのでご安心ください。

残りは動画内で解説しているので動画では言ってない事を補足する事にします。

実際にいただいた質問に回答するかたちで情報を用意してみました。

Q
ワークシートが変数wsに入る順番に決まりはあるのか?
A

画面左にあるワークシートから変数wsに格納されていきます

Q
なぜコレクションに格納されたオブジェクトが1回ずつ変数wsに格納されるのか?
A

これは分かりません。

理由はコレクション内のオブジェクトが1回ずつ変数に入る理屈は見る事ができないからです。

コレクションの中までは見る事ができるのですがあとはVBAの仕様だと思って割り切ってください。

まとめ

For Each ~ Nextを使わなくてもブック内の最後のシートまで処理を繰り返すという処理を実践しました。

加えてFor Each ~ Nextを理解してもらいたいと思ったので動画を用意させていただきました。

今回紹介した2つのコードの様に1つの事象を解決させる為には複数の方法があります。

Aのロジックでは難しいなと思ったらBのロジック、Cのアルゴリズム・・・とやり方を変えてみてください。

そのアプローチ自体がスキルアップになります。思考した内容はいつかのアウトプットに役立つはずです。

他の繰り返し処理を使った記事(Do ~ Loop)を用意しておきます。参考にしてください。

EnjoyExcel

タイトルとURLをコピーしました