困ったときはここに戻ってください。 左の欄が書き方、右が意味です。 「対応」の欄は、このページの処理系で動くかを示します (△=本物とふるまいが違う、×=未対応)。
| 書き方 | 意味 | 対応 |
|---|---|---|
Sub 名前() |
手続き。実行の単位。マクロとして呼び出せるのはこれ | ○ |
Function 名前(引数) As 型 |
関数。値を返す。関数名に代入したものが戻り値になる | ○ |
Call 名前(引数) / 名前 引数 |
手続きを呼ぶ。Call は省略できる | ○ |
Exit Sub / Exit Function | 途中で抜ける | ○ |
' コメント / Rem コメント | 実行されない覚え書き | ○ |
Option Explicit |
宣言していない変数を使うとエラーにする。必ず書く習慣をつける | △(警告を出すが止めない) |
行末の _ | 次の行へ続く(長い行を折り返す) | ○ |
a = 1: b = 2 | : で 1 行に複数の文を書く | ○ |
| 書き方 | 意味 | 対応 |
|---|---|---|
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 Boolean | True か 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 Double | 2 次元配列(行列) | ○ |
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 つずつ書いてください。
この教材の処理系は、この書き方をすると橙色の警告を出します。
| 書き方 | 意味 | 対応 |
|---|---|---|
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 | 文字の大きさ | ×無視される |
| 演算子 | 意味 | 例 |
|---|---|---|
+ - * / | 足す・引く・掛ける・割る | 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 か?」。同じ記号で意味が違うので、慣れるまで注意します。
' 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
' 回数が決まっているとき 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 または Ctrl+Break で止めます。 この教材では 200 万手で自動的に止まるので、安心して試せます。 たいていの原因はカウンタを増やす行を忘れたことです。
| 関数 | 意味 | 例 |
|---|---|---|
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 |
Rnd | 0 以上 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、偽なら B | IIf(x>0,"正","負") |
UBound(a) LBound(a) | 配列の添字の上限・下限 | UBound(w) |
MsgBox 文字列 | 画面に出す | この教材では下の欄に出ます |
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
| メッセージ | よくある原因 |
|---|---|
| 「◯◯」が何なのか分かりません | 変数名の打ち間違い、または 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 で出すと、同じことができます。