【簡単Excelマクロ・VBA】Do…While ループ|繰り返し処理 #002
いつもありがとうございます。
ノンプログラマー向け「Excelマクロ・VBA解説シリーズ」へようこそ。
VBAで行いたい処理の代表格に「繰り返し処理」があります。
本稿では、「繰り返し処理」の方法のひとつである「Do...While ループ」を、とても簡単な例を用いて解説いたします。
「Do...While ループ」は、指定した条件が真(True)である間、指定した処理を繰り返すステートメントです。
ことばの意味
- ノンプログラマー
プログラミングを主な仕事にしていない人たちのことです。 - マクロ
VBAを使って作成される「機能」のことです。 - VBA
Visusal Basic for Application の略で、プログラミング言語のことです。 - ステートメント
VBAの中で何らかの固有の働きをするものを定義したものの呼称です。VBAには、Ifステートメント、For...Next ステートメント、Withステートメント、Sub ステートメントなど、様々なステートメントがあります。例えば、Subステートメントは、コードの始まりを定義するステートメントです。
関連記事
VBAにおける繰り返し処理の全体像
VBAにおける「繰り返し処理」には、大きく分けて4つの方法があります。「繰り返し処理の」の全体像は以下の記事で解説しております。
本稿では「繰り返し処理の」一部である「Do...While ループ」を解説いたします。
VBAで「Do...While ループ」を行う方法
Do...While ループの基本構文を以下に示します。
Do While 条件
'実行するコード
Loop
この構文では、Do While
の後に指定した"条件"が真(True)である限り、"実行するコード"が実行されます。"条件"が 偽(False)になったときにループは終了します。
具体的に簡単なコードを実装してみます。
例として、"A列を走査しセルが空白でなければ、B列に行番号を書き込む"コードを以下に示します。
Sub sample()
' 変数の宣言
Dim wb As Workbook
Dim ws As Worksheet
Dim row_idx As Long ' 行番号変数
' ワークブックとワークシートをオブジェクト変数として取得
Set wb = ThisWorkbook
Set ws = wb.Worksheets("Sheet1")
' 行番号変数に初期値を設定
row_idx = 1
' Do...While ループで繰り返し処理を実行
Do While ws.Cells(row_idx, 1) <> "" ' 条件(A列のセルが空白ではない)が True であれば
' B列に行番号を書き込む
ws.Cells(row_idx, 2) = row_idx
' row_idx (行番号変数)に1を加算
row_idx = row_idx + 1
Loop
End Sub
解説します。
変数の宣言
' 変数宣言
Dim wb As Workbook
Dim ws As Worksheet
Dim row_idx As Long ' 行番号変数
冒頭の部分は変数を宣言しています。
Dim 変数 As データ型 の構文で宣言します。
これによって各変数は As 以降で指定したデータ型のデータを格納することができるようになります。
尚、"Workbook"はワークブック、"Worksheet"はワークシート、"Long"は整数を格納するためのデータ型を意味しています。
ことばの意味
- 変数
「値」や「オブジェクト」を入れておく箱のようなものです。変数はその名の通りコード内での指示によって値やオブジェクトを変えることができます。 - オブジェクト
VBAで操作する対象のことです。 - Long
-2,147,483,648から2,147,483,647までの範囲の整数値を格納することができる。尚、整数を扱うデータ型には Integer もあるが、これは-32,768から32,767までと、Long よりも扱える数が小さい。
ワークブックとワークシートをオブジェクト変数として取得
' ワークブックとワークシートをオブジェクト変数として取得
Set wb = ThisWorkbook
Set ws = wb.Worksheets(1)
次に、ワークブックとワークシートを、オブジェクト変数として格納しています。
wb.Worksheets(1)のカッコ内の数値1は、ワークブック内の1番目のワークシート、つまり左端のワークシートを意味しています。
ことばの意味
- オブジェクト変数
「オブジェクト」を入れておく箱のようなものです。通常の変数が数値や文字列などを格納するのに対して、オブジェクト変数はオブジェクトを格納します。
Do...Whileループを用いた繰り返し処理の実装
' 行番号変数に初期値を設定
row_idx = 1
' Do...While ループで繰り返し処理を実行
Do While ws.Cells(row_idx, 1) <> "" ' 条件(A列のセルが空白ではない)が True であれば
' B列に行番号を書き込む
ws.Cells(row_idx, 2) = row_idx
' row_idx (行番号変数)に1を加算
row_idx = row_idx + 1
Loop
次に、繰り返し処理を実行しています。
まず、row_idx = 1
で、行番号変数 row_idx に初期値を設定します。
次に、ループを開始するコード Do While ws.Cells(row_idx, 1) <> ""
を記述します。これは、条件=A列のセルが空白でない、が真(True)である間中ずっと処理を繰り返しなさい、という命令です。
これで、Do... と Loop の間にある行の処理が繰り返し実行されます。この例では、B列に行番号を書き込み、その後、行番号変数 row_idx にプラス1をし、次の行に進める処理をしています。
この row_idx = row_idx + 1 がないと行番号が進まず無限ループ(欠陥コード)となります。このように、Do...While 構文では、処理を次のステップに進める指示が必要になりますので、注意してください。
以上が、Do...Whileループの基本的な使い方です。
マクロ実行結果に関する補足
マクロ実行結果を見ると、繰り返し処理が、最終行ではなく4行目で終わっています。これは、5行目が空白であるため、条件 Do While ws.Cells(row_idx, 1) <> "" が偽(False)になったためです。
このようにシートに条件に合致しないデータ(この場合は空白)があると、処理がとまります。これが意図したものであれば良いですが、そうでない場合は、このようなデータ側のばらつきに対応したコードを書く必要があります。
これは応用的な内容であるため、別の記事で紹介していきます。
おわりに
ご覧いただきありがとうございました。
今回の記事では、「繰り返し処理」の中の「Do…While ループ」を解説いたしました。
お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。
皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。
なお、当サイトでは様々な情報を発信しております。もしよろしければ、トップページもご覧いただけると幸いでございます。
筆者の記事関連経験
- VBA使用経験約20年
実務に使用するマクロを多数作成してきました。 - Python 3 エンジニア認定基礎試験
経済産業省が定めたガイドライン「ITスキル標準(ITSS)」に掲載されている民間資格です。
VBAプログラミングスキルアップのための参考情報
ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。
VBAプログラミングのスキルアップ
学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。
入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。
甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
\チェックしてみよう/
\チェックしてみよう/
\チェックしてみよう/
VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
こちらの記事でも紹介しております。もしよろしければご覧ください。