VBAプログラミングの基礎

セル操作、変数、繰り返し処理、条件分岐、乱数の5点を学ぶ。ごく基本的な内容だけを扱う。

セル操作

例A:セルへの入力
【書き方】Cells(行番号,列番号).Value = データ
セル番地は列行の順だったが、Cellsでは(行,列)の順である。 また、列番号はアルファベットではなく数値である。
Sub 例A_セルへの入力() Cells(1, 1).Value = "おはよう" 'セルA1に「おはよう」と入力する。 End Sub

セルへの入力
なお、上記のプログラム例中の緑字の部分は「コメント」と呼ばれるもので、 プログラムとしては無視される部分である。 プログラム中にアポストロフィー「'」を書くと、そこから右側の文末までがコメントとなる。 コメントは無視されるので、基本的には何を書いてもよい。 そのため、メモを書く機能としてよく使われる。
VBEではコメントが自動的に緑字になるが、この教材ではこれ以降は緑字にしないので「'」を見て判断すること。



例B:セル値の取得
【書き方】Cells(行番号,列番号).Value
取得した値は他の関数等で使うことができる。 (次の例では取得した値をメッセージボックスに表示している)。
Sub 例B_セル値の取得() MsgBox (Cells(1, 2).Value) 'セルB1の値を取得してメッセージボックスに表示する。 End Sub
セルB1に「はい!」と入力した後でマクロを実行した例:

セル値の取得



例C:セルの塗りつぶし
【書き方】Cells(行番号,列番号).Interior.Color=RGB(赤,緑,青)
色は三原色の明るさ(0〜255)で指定する。
Sub 例C_セルの塗りつぶし() Cells(1, 3).Interior.Color = RGB(255, 0, 0) 'セルC1を赤にする。 Cells(2, 3).Interior.Color = RGB( 0,255, 0) 'セルC2を緑にする。 Cells(3, 3).Interior.Color = RGB( 0, 0,255) 'セルC3を青にする。 Cells(4, 3).Interior.Color = RGB( 0, 0, 0) 'セルC4を黒にする。 Cells(5, 3).Interior.Color = RGB(255,255,255) 'セルC5を白にする。 Cells(6, 3).Interior.Color = RGB( 0,255,255) 'セルC6をシアンにする。 Cells(7, 3).Interior.Color = RGB(255, 0,255) 'セルC7をマゼンタにする。 Cells(8, 3).Interior.Color = RGB(255,255, 0) 'セルC8を黄にする。 End Sub

セルの塗りつぶし



変数

変数は値を1つだけ記憶できる。 変数に値を記憶させることを「代入」という。
【書き方】変数名=値
左辺に変数名を、右辺に値を書くと、値が変数に代入される。右辺と左辺を逆にすることはできない。
変数名はアルファベットで始まる英数字の名前にする。他で使われている名前(Sub等)はダメ。
変数を使う時は、値の代わりに変数名を書けばよい。

例D:変数に値を代入し、その値をセルに入力する
Sub 例D_変数の値をセルに入力() Moji = "いろは" '変数Mojiに「いろは」を代入する。 Kazu = 12+16-7 '変数Kazuに「12+16-7」の答を代入する。 Cells(1, 4).Value = Moji 'セルD1に変数Mojiの値を入力する。 Cells(2, 4).Value = Kazu 'セルD2に変数Kazuの値を入力する。 End Sub

変数1



例E:変数の値で三原色それぞれの明るさを指定し、それぞれの色と合成色でセルを塗りつぶす

Sub 例E_変数の値で色を指定() Aka = Cells(1, 5).Value 'セルE1の値を取得して変数Akaに代入する。 Midori = Cells(2, 5).Value 'セルE2の値を取得して変数Midoriに代入する。 Ao = Cells(3, 5).Value 'セルE3の値を取得して変数Aoに代入する。 Cells(4, 5).Interior.Color = RGB(Aka, 0, 0) 'セルE4を赤色で塗りつぶす Cells(5, 5).Interior.Color = RGB(0, Midori, 0) 'セルE5を緑色で塗りつぶす Cells(6, 5).Interior.Color = RGB(0, 0, Ao) 'セルE6を青色で塗りつぶす Cells(7, 5).Value="合成" 'セルE7に「合成」と入力 Cells(8, 5).Interior.Color = RGB(Aka, Midori, Ao) 'セルE8を合成色で塗りつぶす End Sub
事前に、セルE1,E3,E5にそれぞれ赤,緑,青の明るさの数値を入力してからマクロを実行する。
赤を0、緑を255、青を127とした例:

変数2



繰り返し処理

同じ処理を何度も繰り返す。 同じ処理と言っても、変数の値は毎回変わる。

【書き方】
 For 変数名=初期値 To 終値
	繰り返したい処理
 Next 変数名

最初、変数に初期値が代入される。 Nextまで来ると変数の値が1だけ増え、Forに戻る。 それを変数の値が終値になるまで繰り返す。
従って、繰り返し回数は「終値-初期値+1」となる。

例F:メッセージボックスの表示を3回繰り返す
Sub 例F_メッセージボックス繰り返し() For i = 1 To 3 'i=1から始めて、変数iの値が3になるまで繰り返す。 MsgBox (i) '変数iの値をメッセージボックスに表示する。 Next i '変数iの値を1増やしてForに戻る。 End Sub

繰り返し処理1
   ↓
繰り返し処理2
   ↓
繰り返し処理3




例F改:1〜10までの整数の和を求める
例Fのプログラムに、次の緑字の変更を加える。
Sub 例F_メッセージボックス繰り返し() x=0 For i = 1 To 10 'i=1から始めて、変数iの値が10になるまで繰り返す。 x=x+i MsgBox (x) '変数xの値をメッセージボックスに表示する。 Next i '変数iの値を1増やしてForに戻る。 End Sub

繰り返し処理1
   ↓
繰り返し処理2
   ↓
   :
   ↓
繰り返し処理3

プログラム中の「x=x+i」は等式ではなく代入を表す書き方である。 右辺の値(x+iの答)を左辺の変数xに代入している。 例えば、最初にこれが実行される時には、xの値は0、iの値は1なので、右辺の値は1となり、これが左辺の変数xに代入される。 すでに値を持っている変数に別の値を代入すると上書きになる。
このプログラムの各段階において、変数xと変数iの値は次の表のようになる。
左辺のx右辺のxi
繰り返し処理に入る前0
繰り返し1回目101
繰り返し2回目312
繰り返し3回目633
繰り返し4回目1064
繰り返し5回目15105
繰り返し6回目21156
繰り返し7回目28217
繰り返し8回目36288
繰り返し9回目45369
繰り返し10回目554510



例G:ライプニッツ(Leibniz)級数
Leibniz級数
これは円周率に収束する級数である。 第i項(i=1,2,…,1000)までの和を計算して、円周率に近づいていく様子を表示してみよう。
Sub 例G_ライプニッツ級数() Pi = 4 '変数Piに初項(i=0)の値を代入する。 For i = 1 To 1000 'i=1から始めて、変数iの値が1000になるまで繰り返す。 Pi = Pi + 4 * (-1) ^ i / (2 * i + 1) '第i-1項までの和に第i項を加える。 Cells(i, 7).Value = Pi '第i項までの和をG列の第i行に入力する。 Next i '変数iの値を1増やしてForに戻る。 End Sub

ライプニッツ級数の初項付近

ライプニッツ級数の第1000項付近
第1000項まで計算しても小数第2位までしか合っていないことがわかる。ライプニッツ級数は収束が遅い。


条件分岐

条件分岐(1):2つの処理のうちのどちらを実行するかを条件によって決める。

【書き方】
 If 条件 Then
	真の場合の処理
 Else
	偽の場合の処理
 End If

条件は、等号・不等号を使った論理式で表す。

また、次の例では入力ボックスというものが出てくる。 入力ボックスとはデータを入力するウィンドウで、Application.InputBox で表示する。

【書き方】
 Application.InputBox("メッセージ", Type:=〇)

数値を入力する場合は「Type:=1」、文字を入力する場合は「Type:=2」とする。

例H:合否判定
Sub 例H_合否判定() a = Application.InputBox("試験は何点でしたか?", Type:=1) '入力ボックス If a >= 60 Then '条件分岐開始。もしaが60以上ならば、 MsgBox ("合格です!") 'これを実行する。 Else 'そうでなければ、 MsgBox ("不合格です…") 'これを実行する。 End If '条件分岐終了 End Sub

不合格点 → 不合格です…

合格点 → 合格です!



条件分岐(2):処理を実行するかしないかを条件によって決める。

【書き方】
 If 条件 Then
	真の場合の処理
 End If

偽の場合には何もしない。

例I:ライプニッツ級数
例Gのプログラムをコピーしてマクロ名を「例_ライプニッツ級数」とし、次の緑字の文を書き加える。
Sub 例_ライプニッツ級数() Pi = 4 '変数Piに初項(i=0)の値を代入する。 For i = 1 To 1000000 'i=1から始めて、変数iの値が1000000になるまで繰り返す。 Pi = Pi + 4 * (-1) ^ i / (2 * i + 1) '第i-1項までの和に第i項を加える。 If Int(i / 1000) * 1000 = i Then '条件分岐開始。もしiが1000の倍数ならば、 Cells(i / 1000, 9).Value = Pi '第i項までの和をJ列の第(i/1000)行に入力する。 End If '条件分岐終了 Next i '変数iの値を1増やしてForに戻る。 End Sub
Int関数は、小数点以下を切り捨てる関数である。従って、
	Int(i / 1000) * 1000
はiの百の位以下を切り捨てた値となる。 これがiに等しくなるのは、iが1000の倍数の時だけである。
これにより、結果が1000項ごとに表示されるようになった。 第1000行は第100万項までの和であり、小数第5位まで合っている。

1000項ごとに表示

第100万項付近


乱数

乱数とは、デタラメな数列のことである。
Rnd関数で乱数を作ることができる。 Rnd関数の答は数列ではなく数値なのだが、使うたびに異なる数値(0以上1未満)を答えるので、何度も使えば乱数となる。

【書き方】
 Rnd()
例J:乱数
メッセージボックスに毎回異なる数値を表示する。
Sub 例J_乱数() For i = 1 To 10 MsgBox (Rnd()) Next i End Sub

乱数1
   ↓
乱数2
   ↓

   :

   ↓
乱数3

実際には上図と異なる数値が表示されるだろう。 上図の最後の数値 1.401764E-02 は指数形式というもので、1.401764×10-2 すなわち 0.01401764 という意味である。数値が0.1未満の場合はこの形式で表示される。


例K:パスワード生成
乱数を使って、10人分のパスワード(12文字)を生成する。
下の例では、Rnd関数とInt関数を使って48〜122の数値を作り、Chr関数を使ってその数値を文字に変換している。
Chr関数は、ASCIIコードを引数とし、該当する文字を返す関数である。

【書き方】
 Chr(ASCIIコード)

ASCIIコードとは、128種類の文字に番号を付けたものである。 例えば、数字の0〜9には48番〜57番、アルファベットのA〜Zには65番〜90番、a〜zには97番〜122番の番号が付けられている。
次の例では、ASCIIコード48番〜122番の英数字と記号を使ってパスワードを生成している。
Sub 例K_パスワード生成() For i = 1 To 10 Ransuu = 62 + Int(Rnd() * 61) 'Rnd関数の答から62〜122の整数を生成 Password = Chr(Ransuu) '変数Ransuuの値を文字に変換し、変数Passwordに代入 For j = 2 To 12 Ransuu = 48 + Int(Rnd() * 75) 'Rnd関数の答から48〜122の整数を生成 Password = Password & Chr(Ransuu) '2〜12文字目を追加 Next j Cells(i, 11).Value = Password Next i End Sub
※Excelでは1文字目が「=」だと数式という意味になってしまうので、プログラム3行目は「=」(61番)を避けるため62〜122の範囲を生成している。 2文字目以降は「=」でも大丈夫なので、プログラム6行目では48〜122の範囲を生成している。

パスワード生成


以上