Excel VBA | ByVal(値渡し)

VBA
スポンサーリンク

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
VB

ByRef(参照渡し)—呼び出し元を変えたいときだけ使う

  • 意味: 変数そのものを渡す(中で変えれば外も変わる)。
  • 注意: 意図せず元の値が書き換わるので、使い所を見極める。
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と既定値で短く。
  • 再利用できるか: 固定値を埋めず、引数で外から指定できる設計にする。

ひとこと

「引数」は、コードをあなたの意図にぴったり寄せてくれる“入り口”です。固定値をやめて、材料(引数)で動きを変える──その一歩が、初心者から脱出する近道。やってみて、動く感覚を体で覚えましょう。

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました