同じ処理の繰り返しを含むマクロの考え方と記法を学習します.まず,同一の計算を反復する累乗計算を題材に,マクロにおける「処理の繰り返し」の意味と記法を学習します.つぎに,複数のセルに対して同じような処理を繰り返し施す方法を考えます.さらに,条件分岐と繰り返しの組み合わせによってより複雑な構造を持つタスクの解決が可能であることを学習します. .
1. 繰り返しの考え方
2. 複数のセルへの処理の適用
3. 条件分岐と繰り返しの組み合わせ
「繰り返し」の考え方と書き方を学習します.
繰り返しとは,一定の回数のあいだ同じ命令を繰り返し実行する処理のことです.たくさんのセルの書式を一括して変更するなど,多くの場面で必要とされます.
ここでは2の累乗を求めるマクロの作成を通して繰り返しの考え方を学習することにします.2の累乗とは,いわゆる2のn乗の計算結果のことです(このときのnを指数と呼びます).2の累乗は次のようになります.
n | 2n | 計算式 |
---|---|---|
0 | 1 | 1 |
1 | 2 | 1×2 |
2 | 4 | 1×2×2 |
3 | 8 | 1×2×2×2 |
4 | 16 | 1×2×2×2×2 |
5 | 32 | 1×2×2×2×2×2 |
... | ... | 1×2×2×2×2×2×...×2 |
この計算を以下のように,特定のセルに指数を入力してマクロを実行すると,別のセルに計算結果が表示されるようにマクロ化します(practice03.xls, Sheet1).
上記のマクロを実現する処理の手順を考えましょう.
2の累乗を求める計算式から,次のことが分かります.
ここから,2の累乗は以下の式をn回繰り返す処理として記述できることが分かります.
累乗 = 累乗*2 *ただし累乗の初期値は1とする
上記のような「〜をn回繰り返す」といった処理を記述するために,VBAではForステートメントが用意されています.Forステートメントの書式は以下の通りです.
Sub 繰り返しの書式 Dim i As Integer '繰り返し回数のカウント用変数 ' カウント用変数iの値が10になるまで命令Aを繰り返す For i = 1 To 10 命令A Next i End Sub
Forステートメントは「For A To B・・・Next〜」という書き方をします.Aではカウント用変数の初期値(数え始めの数)を代入文で設定します.上記の例では変数iに1が代入されているため,繰り返し回数は1から数え始めます.Bにはカウント用変数の上限を書きます.上記の例では実数で10が書かれています.さらに,Forステートメントの末尾には,Nextの次にカウント用変数の変数名を書きます.上記の例ではNext iとなっています.このように書くことによって,1回の繰り返しが終わるたびにカウント用変数の値が1増加します.したがって,上記の例ではiが1から10の間,すなわち10回の繰り返しがおこなわれることになります.
上記の処理手順をフローチャートで表現すると以下のようになります.
以下は2の累乗を求めるマクロを,Forステートメントを使って記述した例です.
Sub 累乗計算() Dim 累乗 As Long Dim n As Integer Dim i As Integer '繰り返し回数のカウント用変数 ' 指数を取得する n = Range("B2").Value ' 2の累乗を算出する 累乗 = 1 '累乗の初期値を設定する For i = 1 To n '指数に応じて累乗を行う 累乗 = 累乗 * 2 Next i ' 算出された計算結果を出力する Range("B3").Value = 累乗 End Sub
2の累乗を求めるマクロを改作して,ユーザーが指定した任意の整数aの累乗を求めるマクロを作成しましょう.ただしユーザーによる整数aの指定は,以下のように特定のセルへの入力によって行うことにします.
繰り返しを用いて,複数のセルに同形の処理を施す方法を学びます.
Excelで用いられる色番号と実際の色との対応を視認できるカラーチャートを作成しましょう(practice03.xls, Sheet2).カラーチャートは以下の通り,ワークシート上の一列に色番号を示し,隣の列にその色番号に対応する実際の色を表示するようにつくります.
マクロを作成する際の前提として次の2点を確認します.
したがって,マクロで処理を行う部分は3行目から下の部分に限定されます.また,色は56色あるので,チャートの最終行は58行目となります.
上記のマクロを実現する処理の手順を考えましょう.
まずマクロで行う処理の内容を考えます.実行すべき仕事は「色番号を表示する」ことと「対応する色を表示すること」の2種類に大別されます.仮にカラーチャートで表示する色が色番号1の黒だけならば,処理手順は以下のように表現できます.
しかし実際のカラーチャートには56色の色があります.上記の<>で囲んだ部分は1行ごとに変化する必要があります.
ここで処理手順を「同形の処理の反復」として捉えることにより,繰り返し処理の適用が可能になります.処理手順を以下の2つの作業の反復として考えてみましょう.
上記の2つの処理はカラーチャート1行分の処理です.これらを1セットと考えます.この1セットをすべての色(56色)の分,すなわちカラーチャートの最終行までの分だけ繰り返します(ただし「色番号」は1から56まで順番に1づつ増加する必要があります.また「対応する色」も同様に,色番号に応ずる形で変化しなければなりません).
以下は上記の考え方に従って記述した「カラーチャート表示」マクロの一部です.「・・・」と表記された部分はソースコードが割愛されています.
Sub カラーチャート表示() Dim 色番号 As Integer Dim i As Integer 'カウント用変数 '各行に色番号と対応する色を表示する For i = 3 To 58 '色番号を算出する ・・・ '色番号を表示する Cells(i, 1).Value = ・・・ '色番号の隣の列に対応する色を表示する Cells(i, 2).Interior.ColorIndex = ・・・ Next i End Sub
変数「色番号」には色番号(1から56までの整数)が記憶されます.この値は左側の列(スクリーンショットではA列)に表示する色番号であると同時に,その隣の列に表示する色を指示するための数値でもあります.表示色はセルの背景色として指定します.
上記のソースコードではRangeプロパティではなく,Cellsプロパティを利用してセルの位置を指定(すなわちRangeオブジェクトを取得)しています.Cellsプロパティは,以下の書式によってセルの位置を指定することができます.
Cells(行番号, 列番号)
たとえば,セルA1を指定するならば「Cells(1, 1)」,セルB5ならば「Cells(5, 2)」と記述します(列番号はA,B,C,D...の順に1,2,3,4...となる).
上記のソースコードでは,Forステートメントの「カウント用変数i」の値をCellsプロパティの行番号の指定にも流用しています.すなわち,変数iをそのまま,Cellsプロパティの行番号を指示する場所に書き込んでいます.このことによって,「繰り返しが1回終わる→変数iの値が1増える→指定される行番号も1増える→結果的に次の行に処理が移行する」というサイクルが実現されます.
iの値は上記のソースコードでは3から59まで増加します.繰り返しの終了は,「To 58」の記述により,iが58を超えた時点です.したがって,上記のソースコードではワークシートの3行目から処理が始まり,58行目まで処理が進められて終了することになります.
上記のソースコードでは「色番号を算出する」というコメントに対応するソースコードが省略されています.色番号はどのように求めればいいのでしょうか?ヒントを少し出しておきます.
色番号は固定された値ではなく一定の規則性に従って変動する値です.すなわち,1回の繰り返しごとに「1→2→3...」と増えていく必要があります.そして上限は56です.
このプログラムには,色番号とは別に,ほぼ同様の規則性を持った変動値があります.省略された箇所には,その値との関係を手がかりに色番号を算出する数式と,数式によって算出された値を色番号として記憶させるための代入文が入ります.
ここまでの解説を手がかりにカラーチャートを表示するマクロを完成しましょう.
先週学習した条件分岐と繰り返しを組み合わせることによって,より実用的なマクロを作成することが出来ます.
実際にマクロを作成しながら条件分岐と繰り返しの組み合わせ方を理解しましょう.
ここでは前回作成した「テスト得点評価マクロ」の機能を拡張します.前回作成したマクロは,1人ひとりについての得点に応じた評価を判定します.しかし評価対象が増えた場合,いちいち手動で1人ひとりの判定を下すのは面倒です.そこで,名簿全員分の判定を自動的に下すように仕様を変更します(practice03.xls, Sheet3).
本題に入る前に先ほど学んだ繰り返しのおさらいをします.ここでは先に「背景色初期化マクロ」を作成します.背景色初期化とは,セルの背景色を「色なし」に戻す作業を指します.評価を行った後で背景色の付いた名簿のすべてのセルに対し,背景色を自動的に初期状態,すなわち「色なし」に戻すマクロを作成します.
名簿は1人につき「氏名」「得点」の組み合わせで構成されます.ですから,1人分の背景色を初期化するには,
という2つの処理を実行します.名簿全員分の背景色初期化を行うためには,上記の処理を名簿全員分繰り返し行います.
以下は上記の考え方に従って記述した「背景色初期化マクロ」のソースコードです.practice03.xlsのSheet3の名簿(26名分)を前提としています.
Sub 得点評価初期化() Dim i As Integer 'カウント用変数 ' 評価の結果を初期化する For i = 2 To 27 Cells(i, 1).Interior.ColorIndex = xlNone '氏名欄の背景色を色なしにする Cells(i, 2).Interior.ColorIndex = xlNone '得点欄の背景色を色なしにする Next i End Sub
上記のソースコードでも,Cellsプロパティを利用してセルの位置を指定しています.Forステートメントのカウント用変数iの値をCellsプロパティの行番号の指定に連動させるやり方に慣れましょう.
それでは本題に入ります.名簿全員分の得点評価を自動的に下すマクロを作成しましょう.
まず最初に,1人分の得点評価の仕方を決めておきます.ここでは前回作成したマクロに準じて,以下のようにします.
次にマクロ全体の処理の手順です.基本的には先程作成した「背景色初期化マクロ」と同様に,1人分の処理を名簿全員分繰り返せばいいはずです.ただし今回は,1人分の処理をする際には,得点に応じた処理の振り分けが必要となります.したがって,今回のマクロでは「繰り返し」の中に「条件分岐」が組み込まれることになります.
以下は処理手順のアウトラインです.
・名簿全員分,以下の処理を繰り返す ・1人分の得点評価を下す 成績優秀者ならば ・セルの背景色を水色にする 赤点ならば ・セルの背景色をピンク色にする それ以外ならば ・セルの背景色を色なしにする
実際にソースコードを記述する際には,上記のアウトラインをより詳細に検討する必要があります.このマクロを実現するためには,上記のアウトラインでは表現されていない処理も必要となってきます.
以下は上記の構想に基づいて記述した,「テスト得点評価マクロ」のソースコードの1部です.コメントを手がかりとしながら,自分でマクロを完成させてみましょう(ここでは仮に成績優秀者を80点以上,赤点を40点以下としましょう.またColorIndexの値はそれぞれ水色34,ピンク色22です).
Sub テスト得点評価() Dim 得点 As Integer Dim i As Integer 'カウント用変数 ' テストの得点に対する評価を表示する For i = 2 To 27 ' テストの得点を取得する 得点 = Cells(i, 2).Value ' 得点に対する評価を背景色で示す If '成績優秀者の場合,背景色を水色にする ElseIf '赤点の場合,背景色をピンク色にする Else 'それら以外の場合,背景色を色なしにする End If Next i End Sub
上記のマクロを拡張して,特定のセル上に入力した基準に従ってA, B, C, Dを色分けするマクロを作成してみましょう(ColorIndexの値は黄色36,灰色15です).