Excel VBAの引数を、初心者向けに説明
最初は「引数ってなんだろう?」って戸惑うもの。ここでは、実際に手を動かしながら「引数=処理に渡す材料」として捉えられるように、例題付きで丁寧に解説します。
引数の基本アイデア
- ざっくり定義: 引数は「Sub(処理のまとまり)に渡す入力」。
- なぜ必要: 同じ処理をいろいろな値に対して使い回すための仕組み。
- イメージ: レシピに材料を渡す感じ。材料が変われば出来上がりも変わる。
まずは「引数なし」の例
固定値しか扱えないバージョン
Sub WarikireruCheck_NoArg()
Dim num As Integer
num = 10
If num Mod 2 = 0 Then
MsgBox num & " は2で割り切れます。"
Else
MsgBox num & " は2で割り切れません。"
End If
End Sub
VB- 問題点: いつも10だけを判定してしまう。
- 結果: コードを使い回しにくい(毎回中身を書き換える必要がある)。
引数ありにすると一気に便利になる
値を渡して柔軟にする
Sub WarikireruCheck(ByVal num As Integer)
If num Mod 2 = 0 Then
MsgBox num & " は2で割り切れます。"
Else
MsgBox num & " は2で割り切れません。"
End If
End Sub
VB呼び出し例(いろいろな値で使える)
Sub Test_WarikireruCheck()
Call WarikireruCheck(10) ' → 2で割り切れる
Call WarikireruCheck(7) ' → 2で割り切れない
Call WarikireruCheck(0) ' → 2で割り切れる
End Sub
VB- ポイント: 引数
numが「材料」。呼び出すたびに材料を変えられる。 - 効果: 同じSubを何度でも使い回せる。
ByVal と ByRef(引数の渡し方の違い)
ByVal(値渡し)—初心者はまずこれでOK
- 意味: 渡された値の「コピー」を使う。
- メリット: 呼び出し元の変数は変更されない(安全)。
Sub DoubleValue_ByVal(ByVal n As Integer)
n = n * 2
MsgBox "Subの中のnは " & n
End Sub
Sub Test_ByVal()
Dim x As Integer
x = 5
Call DoubleValue_ByVal(x)
MsgBox "呼び出し元のxは " & x ' 5のまま
End Sub
VBByRef(参照渡し)—呼び出し元を変えたいときだけ使う
- 意味: 変数そのものを渡す(中で変えれば外も変わる)。
- 注意: 意図せず元の値が書き換わるので、使い所を見極める。
Sub DoubleValue_ByRef(ByRef n As Integer)
n = n * 2
End Sub
Sub Test_ByRef()
Dim x As Integer
x = 5
Call DoubleValue_ByRef(x)
MsgBox "呼び出し元のxは " & x ' 10に変わる
End Sub
VB- 結論: 迷ったらByVal。変更したい明確な目的があるときだけByRef。
いろんな型や複数の引数を渡してみる
文字列を渡す例(セルへ書き込み)
Sub WriteToCell(ByVal text As String, ByVal targetAddress As String)
Range(targetAddress).Value = text
End Sub
Sub Test_WriteToCell()
Call WriteToCell("こんにちは", "A1")
Call WriteToCell("合計", "B2")
End Sub
VB- 型の一致:
textには文字列、targetAddressにも文字列を渡す。
複数引数で計算する例
Sub AddAndShow(ByVal a As Long, ByVal b As Long)
MsgBox "合計は " & (a + b)
End Sub
Sub Test_AddAndShow()
Call AddAndShow(1000, 250)
End Sub
VB- 型の選び方: 大きい整数は
Long、小数はDouble。
オプション引数と既定値で「呼び出しやすさ」を上げる
省略可能な引数を使う
Sub Greet(ByVal name As String, Optional ByVal polite As Boolean = True)
If polite Then
MsgBox "こんにちは、" & name & " さん。"
Else
MsgBox "やあ、" & name & "!"
End If
End Sub
Sub Test_Greet()
Call Greet("佐藤") ' → 既定値 True
Call Greet("佐藤", False) ' → カジュアル挨拶
End Sub
VB- メリット: よく使うパターンを既定値にして、呼び出しを短くできる。
よくあるエラーと回避策
- 型不一致(Type mismatch): 渡す値の型と引数の型が合わない。
- 対策: 引数の宣言を明確に、渡す側も型を合わせる。
- 引数の数が違う: Subの宣言と呼び出しで、個数が違う。
- 対策: 宣言を確認。Optionalを活用。
- 範囲外の値: 例えば
Integerに大きすぎる値。- 対策: 安全側で
Long/Doubleを選ぶ。
- 対策: 安全側で
- 参照書き換えの事故(ByRef): 意図せず元の変数が変わる。
- 対策: 原則ByVal、必要なときだけByRef。
練習問題(手を動かして理解する)
練習1:偶奇判定をセルに書く
- 目標: A1の数字が偶数か奇数かを判定してB1に文字で書く。
Sub WriteEvenOdd(ByVal targetAddress As String)
Dim n As Long
n = Range(targetAddress).Value
If n Mod 2 = 0 Then
Range("B1").Value = "偶数"
Else
Range("B1").Value = "奇数"
End If
End Sub
Sub Test_WriteEvenOdd()
Call WriteEvenOdd("A1")
End Sub
VB練習2:書式付きメッセージ
- 目標: 名前と点数(整数)を渡して、「山田さんの点数は 85 点です」を表示。
Sub ShowScore(ByVal name As String, ByVal score As Long)
MsgBox name & "さんの点数は " & score & " 点です"
End Sub
Sub Test_ShowScore()
Call ShowScore("山田", 85)
End Sub
VB練習3:Optionalで既定動作
- 目標: シート名とセル、文字列を渡して、太字にするかをOptionalで切り替える。
Sub PutText(ByVal sheetName As String, ByVal addr As String, ByVal text As String, Optional ByVal bold As Boolean = False)
With Worksheets(sheetName).Range(addr)
.Value = text
.Font.Bold = bold
End With
End Sub
Sub Test_PutText()
Call PutText("Sheet1", "C3", "タイトル") ' 太字なし
Call PutText("Sheet1", "C3", "タイトル", True) ' 太字あり
End Sub
VB使いこなしのチェックリスト
- 目的は明確か: 何を渡すと、何が変わる?
- 型は適切か: 大きさ・小数の有無で
Integer/Long/Double/Stringを選ぶ。 - 渡し方は安全か: 原則
ByVal、必要な場所だけByRef。 - 呼び出しやすいか: よく使う設定は
Optionalと既定値で短く。 - 再利用できるか: 固定値を埋めず、引数で外から指定できる設計にする。
ひとこと
「引数」は、コードをあなたの意図にぴったり寄せてくれる“入り口”です。固定値をやめて、材料(引数)で動きを変える──その一歩が、初心者から脱出する近道。やってみて、動く感覚を体で覚えましょう。
