情報学入門(データ演習)

VBA 早見表

この教材で使う文法と関数、そして本物の Excel との違い

困ったときはここに戻ってください。 左の欄が書き方、右が意味です。 「対応」の欄は、このページの処理系で動くかを示します (△=本物とふるまいが違う、×=未対応)。

1. プログラムの形

書き方意味対応
Sub 名前()
  …
End Sub
手続き。実行の単位。マクロとして呼び出せるのはこれ
Function 名前(引数) As 型
  名前 = 結果
End Function
関数。値を返す。関数名に代入したものが戻り値になる
Call 名前(引数)名前 引数 手続きを呼ぶ。Call は省略できる
Exit SubExit Function途中で抜ける
' コメントRem コメント実行されない覚え書き
Option Explicit 宣言していない変数を使うとエラーにする。必ず書く習慣をつける(警告を出すが止めない)
行末の _次の行へ続く(長い行を折り返す)
a = 1: b = 2: で 1 行に複数の文を書く

2. 変数と型

書き方意味対応
Dim i As Integer整数(−32,768〜32,767)範囲外はエラー
Dim n As Long大きな整数(±約 21 億)
Dim x As Double小数(倍精度)。計算はふつうこれ
Dim x As Single小数(単精度)。桁が少ないDouble と同じ扱い
Dim s As String文字列
Dim b As BooleanTrue か False
Dim v As Variant何でも入る(型を決めない)
Dim a(5) As Integer配列。添字は 0〜5 の 6 個
Dim a(1 To 5) As Integer添字を 1〜5 にする
Dim m(3, 4) As Double2 次元配列(行列)
ReDim a(n)大きさをあとで決めるPreserve は無視
Const PI = 3.14159変えられない値

いちばん多い落とし穴。 Dim a, b As Integer と書くと、b だけが Integer で、a は Variant になります。 Dim a As Integer, b As Integer と 1 つずつ書いてください。 この教材の処理系は、この書き方をすると橙色の警告を出します。

3. セルを読み書きする

書き方意味対応
Cells(3, 2).Value = 100 3 行 2 列(=B3)に 100 を入れる。行が先
Cells(3, 2) = 100同じ意味(.Value は省略できる)
Range("B3").Value = 100同じセルを A1 形式で指す。列が先
x = Cells(1, 1).Valueセルから読む
Cells(1, 1).Formula = "=A2+A3" 数式を入れる計算されず文字列として入る
Cells(1,1).Interior.Color = RGB(255,0,0)背景色。RGB(赤,緑,青) は 0〜255
Cells(1,1).Font.Color = RGB(0,0,255)文字の色
Cells(1,1).Interior.ColorIndex = 3昔からある色番号(3=赤)主な 16 色だけ
Cells(1,1).Font.Bold = True太字
Range("A1:B3").Value = 0範囲にまとめて入れる
Range("A1:B3").ClearContents中身を消す
Worksheets("Sheet2").Cells(1,1)別のシートのセル同じ 1 枚を指す
Cells(1,1).Font.Size = 14文字の大きさ×無視される

4. 計算と比較

演算子意味
+ - * /足す・引く・掛ける・割る7 / 2 → 3.5
\整数の割り算(小数を切り捨て)7 \ 2 → 3
Mod余り7 Mod 2 → 1
^べき乗2 ^ 10 → 1024
&文字列をつなぐ"答え" & 42 → 答え42
= <> < <= > >=等しい・等しくない・大小x <> 0
And Or Notかつ・または・でないa > 0 And b > 0

=文の先頭にあれば代入、式の中にあれば比較です。 x = 5 は「x に 5 を入れる」、 If x = 5 Then は「x は 5 か?」。同じ記号で意味が違うので、慣れるまで注意します。

5. 場合に分ける

' 1 行で書く
If x > 0 Then Cells(1,1) = "正" Else Cells(1,1) = "0 以下"

' 何行も書く(ふつうはこちら)
If x >= 80 Then
    g = "A"
ElseIf x >= 70 Then
    g = "B"
Else
    g = "C"
End If

' 値で振り分ける
Select Case x
    Case 90 To 100
        g = "A"
    Case 80, 85            ' 複数の値
        g = "B"
    Case Is >= 60          ' 条件で
        g = "D"
    Case Else
        g = "F"
End Select

6. 繰り返す

' 回数が決まっているとき
For i = 1 To 10
    s = s + i
Next i

For i = 10 To 1 Step -2    ' 10, 8, 6, 4, 2
    …
Next i

' 条件で続けるとき
Do While i <= 5
    …
    i = i + 1
Loop

Do
    …
Loop Until r = 0           ' 1 回は必ず実行される

While i <= 5               ' 古い書き方
    i = i + 1
Wend

Exit For                   ' 繰り返しから抜ける
Exit Do

繰り返しが終わらなくなったら。 本物の Excel では Esc または CtrlBreak で止めます。 この教材では 200 万手で自動的に止まるので、安心して試せます。 たいていの原因はカウンタを増やす行を忘れたことです。

7. よく使う関数

関数意味
Int(x)小数点以下を切り捨て(負では小さい方へInt(-3.5) → −4
Fix(x)小数点以下を捨てる(0 に近い方へ)Fix(-3.5) → −3
Abs(x)絶対値Abs(-7) → 7
Sqr(x)平方根(√)Sqr(9) → 3
Round(x, n)四捨五入Round(3.456, 2) → 3.46
Rnd0 以上 1 未満の乱数Int(Rnd * 6) + 1 → サイコロ
Sin Cos Tan Atn三角関数(単位はラジアンSin(3.14159 / 2) → 1
Exp(x) Log(x)指数・自然対数Log(Exp(1)) → 1
Len(s)文字数Len("Hosei") → 5
Left(s,n) Right(s,n)左・右から n 文字Left("Hosei",3) → Hos
Mid(s,i,n)i 文字目から n 文字(1 から数えるMid("Hosei",2,3) → ose
InStr(s,t)t が何文字目にあるか(無ければ 0)InStr("Hosei","se") → 4
UCase(s) LCase(s)大文字・小文字にUCase("abc") → ABC
Val(s)文字列を数値にVal("12abc") → 12
CInt(x) CDbl(x) CStr(x)型を変換するCInt("7") → 7
Format(x, "###.##")表示の桁をそろえるFormat(3.14159,"#.##") → 3.14
IIf(条件, A, B)条件が真なら A、偽なら BIIf(x>0,"正","負")
UBound(a) LBound(a)配列の添字の上限・下限UBound(w)
MsgBox 文字列画面に出すこの教材では下の欄に出ます

8. 試してみる

Sub 試す()
    Dim x As Double
    Dim s As String

    x = 3.14159
    s = "Hosei University"

    Cells(1, 1) = "Int(-3.5)":    Cells(1, 2) = Int(-3.5)
    Cells(2, 1) = "Fix(-3.5)":    Cells(2, 2) = Fix(-3.5)
    Cells(3, 1) = "7 \ 2":        Cells(3, 2) = 7 \ 2
    Cells(4, 1) = "7 Mod 2":      Cells(4, 2) = 7 Mod 2
    Cells(5, 1) = "2 ^ 10":       Cells(5, 2) = 2 ^ 10
    Cells(6, 1) = "Sqr(2)":       Cells(6, 2) = Sqr(2)
    Cells(7, 1) = "Mid(s,7,4)":   Cells(7, 2) = Mid(s, 7, 4)
    Cells(8, 1) = "InStr(s,""Uni"")": Cells(8, 2) = InStr(s, "Uni")
    Cells(9, 1) = "つなぐ":        Cells(9, 2) = "円周率は" & x
    Cells(10, 1) = "Format":      Cells(10, 2) = Format(x, "#.##")

    Cells(1, 4) = "サイコロを 5 回"
    Dim i As Integer
    For i = 1 To 5
        Cells(i + 1, 4) = Int(Rnd * 6) + 1
    Next i
End Sub

9. エラーが出たときの読み方

メッセージよくある原因
「◯◯」が何なのか分かりません変数名の打ち間違い、または Dim を書き忘れた
「Then」があるはずですIf の行の最後に Then がない
添字が範囲外です配列の大きさを超えた。Dim a(5) なら 0〜5 まで
Integer 型に入らない値です32,767 を超えた。As Long にする
0 で割ろうとしました割る数が 0。If b <> 0 Then で守る
実行が長すぎます繰り返しが終わらない。カウンタを増やす行を忘れていないか
呼び出しが深すぎます再帰の終了条件がないIf n = 1 Then の分岐を確かめる
「◯◯」は数として扱えません文字列と数値を混ぜて計算した。セルが空のこともある

エラーが出ないのに結果が違うときが、いちばん厄介です。 そのときは1 行ずつ実行して変数の値を見るのが確実です (本物の Excel なら F8 で 1 行ずつ、変数の上にマウスを置くと値が出ます)。 この教材では、途中の値を Cells(…) に書き出すか MsgBox で出すと、同じことができます。