プログラムを作るには,コンピュータにどのような手順で命令を実行させるか,明確に整理しておくことが必要になる.コンピュータは,プログラムに書かれたことのみを正確に実行していく.問題を解く手順を具体的に示したものをアルゴリズムという.アルゴリズムをコンピュータに指示するものがプログラムであり,プログラミング言語(ここではVBA)ごとに文法が決まっている.コンピュータに指示するアルゴリズムの基本構造は,1.順次,2.繰り返し,3.選択の3つである.1.の順次構造は,単に1つ1つ上から順にプログラムを実行していくことを表している.では2.の繰り返し構造について,例題を使って説明しよう.
【例題1】「1×1」「1×2」…「12×12」まで順番にかけ算した結果を出力せよ.
エクセルを起動し,新しいシートを表示しておく.「表示」メニューから「マクロ」→「マクロの表示」でマクロ実行ウィンドウを表示し,マクロ名に「times」と入力して「作成」ボタンを押す.すると,先ほどのプログラムの下に線が引かれ,Sub times()~End Subという行が追加されている.

あることを繰り返して実行したい場合には,次のようなFor~Nextという命令を使う.
For カウンター変数の名前 = 最初の値 To 最後の値 Step 増減させる値
繰り返したい命令文
Next カウンター変数の名前
カウンター変数とは,繰り返しの回数を数えることに使う変数で,宣言方法や使い方は普通の変数と同じ.カウンター変数 n を 1~100まで1ずつ増やしていく場合は,For n = 1 To 100 Step 1 とするが,1ずつ増やすのであれば最後のStep 1は省略可能.これで100回同じことを繰り返すことができる.もし30から0まで2ずつ減らすのであれば,For n = 30 to 0 Step -2 とする.また,最後のNextという行では,カウンター変数の名前を省略することもできるが,どの変数の値を増やしていたのかわかりにくい場合があるので,はじめのうちは省略しない方がいいと思う.なお,カウンター変数には,一般に整数型変数を使う.実数型変数を使うと,計算誤差によって望み通りの回数繰り返されないことがある.
この例題では,n と k という名前の変数を定義して,繰り返し回数を数えさせることにする.かける数 n とかけられる数 k とを,それぞれ1~12まで変化させ,n×k を計算して出力する.次のようなプログラムをSub times()からEnd Subの間に入力しよう.全部小文字で入力して構わない.また,テキストをコピーして貼り付けてもいい.
| Dim n As Integer, k As Integer |
| For n = 1 To 12 |
| For k = 1 to 12 |
| Cells(n, k) = n * k |
| Next k |
| Next n |
1行目は前回のテキストと同じく変数の宣言文で,n と k を整数型変数として宣言している.2~6行目が変数 n に関する繰り返し部分である.n を1から12まで変化させながら,2行目と6行目に挟まれた3~5行目を繰り返す.3~5行目は変数 k に関する繰り返し部分で,k を1から12まで変化させながら,3行目と5行目に挟まれた4行目の命令を繰り返す.4行目がかけ算の出力部分で,右辺が n と k とのかけ算になっている.左辺はセル番号の指定で,Cells(n, k)というのは,n 行 k 列のセルを表す.例えば,n = 2, k = 4 の時は,上から2行目で左から4列目=D2セルを表す.もし[D2]や[E3]という書き方だと,繰り返しの指定ができない.この例題のように,Cellsを使って指定することで,繰り返し作業が可能になる.
また,このプログラムのように,行の最初に半角の空白を入れるとプログラムの構造がわかりやすい.これをインデントと言う.空白をいくつか入力してもいいし,タブキーを押してもいい.全角の空白は使えないので注意.例えば上のプログラムでは,For~Nextまでの間,どの命令を繰り返すのか,命令文をインデントしてあるのでわかりやすい.コンピュータにとっては,空白があってもなくても同じであるが,人が読みやすいプログラムを作っておくと,間違いに気づきやすく生産性が向上する.一年後に自分で書いたプログラムを読み返すと,詳しいことを覚えていないことが多い.一年後の自分は他人と同じだと考えて,なるべく他人にとっても読みやすいプログラムを書く習慣を付けておこう.
できたプログラムを実行させよう.編集画面左上のエクセルボタンを押してエクセルを表示させ,表示メニューからマクロ→マクロの表示ボタンを押す.今作った「times」を選んで「実行」ボタンを押す.プログラムに間違いがなければ,1×1から12×12のかけ算結果が表示される.

結果が正しく出力されなかった場合には,どこかにプログラムのミス(これをプログラムに入り込んだ虫という意味でバグbugという)がある.1行ずつ確認してバグを取り除く(虫を取り除くという意味でデバッグdebugという)ことになる.
デバッグの際,どこかの行が黄色く反転した文字で表されている時には,プログラムがまだ実行中である.実行中の間は,マウスカーソルを変数名に持っていくことで変数の値をチェックすることも可能なので,どこがおかしかったのか考えよう.次に,VBAツールバーから■マークの「リセット」ボタンを押してプログラムを停止すること.必ず停止してからプログラムを修正するように.いったん停止しないと,プログラムを再実行させることができない場合がある.もしプログラムが暴走して止まらない状態になってしまったら,キーボード左上のエスケープキー(ESC)を押すと止まる(ことが多い).

アルゴリズムの3つめの基本構造である選択構造について説明する.プログラムを実行中に,何らかの判断をさせたい場合がある.たとえば,入力された数が60以上だったら合格と出力し,60未満だったら不合格と出力する等.判断にはIf文を使う.一般的な表現を以下に示す.
If 条件1 Then
条件1が満たされる時に実行する文を並べる
ElseIf 条件2 Then
条件2が満たされる時に実行する文を並べる
Else
条件がすべて満たされないときに実行する文を並べる
End If
ElseIf文は,何回でも必要なだけ使うことができる.また,ElseIf文やElse文はなくても構わない.
【例題2】例題1で作った表(1×1から12×12までのかけ算表)で,50以上の値を持つセルの値を消すプログラムを作れ.
例題1で作ったシートを表示させておく.次に「表示」メニューの「マクロ」→「マクロの表示」を選ぶ.マクロ名に over50 と入れて「作成」ボタンを押す.今回は次のようなプログラムにする.
| Dim n As Integer, k As Integer |
| For n = 1 To 12 |
| For k = 1 to 12 |
| If Cells(n, k) >= 50 Then |
| Cells(n, k).Clear |
| End If |
| Next k |
| Next n |
1行目のDim,2行目と3行目のFor,最後の2行のNextなどは例題1と同じである.4行目のIfから6行目のEnd Ifまでが条件判断をさせる部分で,ここでは n 行 k 列のセルCells(n, k)の値が50以上なら,そのセルの内容を消している.5行目の「.Clear」が,セル内容を消す命令で,セル番号の後にドット(.)に続けてClearと入力する.値が50以上という条件が満たされなければEnd Ifの次の命令を実行するので,Forループの実行を継続する.
エクセルに戻って実行してみよう.「表示」メニューの「マクロ」→「マクロの表示」を選ぶ.マクロ名から over50 を選んで「実行」ボタンを押すと,50以上の値を持つセルの値が消えることが確認できる.

以上で,アルゴリズムの基本構造について学んだ.これだけ知っていれば,基本的なプログラムは作成することができる.
何かの数を数える際,プログラム特有の書き方があるので学んでおこう.
【例題3】A1セルに入力した数の約数を2行目に表示するプログラムを作れ.
まず,新しいシートを作る.見出しが書かれている箇所の右にある⊕という表示を押すと,新しいシートが追加される.

「表示」メニューの「マクロ」→「マクロの表示」を選ぶ.マクロ名に 約数 と入れて「作成」ボタンを押す.今回は次のようなプログラムにする.
| Dim number As Integer, k As Integer, m As Integer |
| [2:2].Clear |
| number = [A1] |
| m = 0 |
| For k = 1 To number |
| If (number Mod k) = 0 Then |
| m = m + 1 |
| Cells(2, m) = k |
| End If |
| Next k |
これまでの例題と同じような命令が多いと思う.違う箇所だけ説明する.まず,何度も繰り返してこのプログラムを実行するとき,約数の数が毎回違うので,前回の値を消す必要がある.2行目がその命令で,[2:2]という書き方で2行目全部という意味になる.2行目から4行目なら[2:4]になる.例題2でも使った「.Clear」が対象のセルを消すという命令である.
4行目で m という約数の数を数える変数の値を0に初期化している.6行目の条件判断は,number を k で割った余りが0かどうかを判断している.number Mod k という式で,number を k で割った余りを求める剰余計算ができる.余りが0なら(= 0 Then),その数 k が約数になるので,7行目で約数の数 m を1つ増やしている.次の8行目で,2行目 m 番目の列に,k の値を出力している.
A1セルにいろんな数字を入れて,表示メニューからマクロを表示して実行し,約数が正しく表示されるかどうか確認しよう.例えば18を入力してプログラムを実行すれば,2行目に1, 2, 3, 6, 9, 18と表示されるはず.表示されなければプログラムに間違いがあるので見直そう.
![]() |
![]() |
応用として,A1セルに入力した数が素数かどうか判定することもできる.素数とは,1とその数字以外に約数がない数なので,m が2であれば素数と判定できる.
このプログラムの,Forループの前に m = 0 として,Forループの中で m = m + 1 としていく方法が,何かを数える場合の常套手段なので覚えておこう.変数=変数+1というのは,今まで変数が覚えていた数に1を加えた数字を,改めて変数に覚えさせるという命令である.この方法は,数の合計を計算すること等にも応用できる.
変数のイメージ:変数というものが何なのかわかりにくいという人は,コインロッカーをイメージしてほしい.35番のコインロッカーというようにコインロッカーには番号が付いていて他と区別できる.変数には番号ではなく名前を付けて他と区別しているが,実際には変数はコンピュータのメモリ(記憶装置)の何番地という番地が割り当てられていてよく似ている.大きな荷物は大きなコインロッカーに預けなければならないように,記憶領域がたくさん必要な複素数とか,あまり記憶領域がいらない整数とか,覚えさせる内容によって変数の型(種類)を最初に宣言して利用する.このプログラムで使った m = m + 1 という命令は,mというコインロッカーの中身をいったん出してきて1を加え(右辺の命令),それをmというコインロッカーに預け直す(=という記号を使った代入)というイメージである.
最後に,このファイルを保存しておこう.ファイルの種類を「Excelマクロ有効ブック(*.xlsm)」にして,ファイル名を program2.xlsm にしておくこと.