この記事を読んでわかること
- VBAコンパイルエラー「ByRef 引数の型が一致しません」の原因と対処法がわかる
- エラーの原因を特定するコツを知れる
- エラーを繰り返さない方法を学べる
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
Excel使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします
VBAコンパイルエラー「ByRef 引数の型が一致しません」の原因

このコンパイルエラー(ByRef 引数の型が一致しません)は、
サブプロシージャに引数を渡す際に、呼び出し元の変数の型と、受け取る側の引数の型が一致していない場合に発生します。
下記のVBAコードを見てください。
Sub test()
Dim num As String ' String型の変数「num」を宣言
num = "100"
Call sample(num) '「num(String型)」を引数としてサブプロシージャに渡す
End Sub
Sub sample(ByRef num As Integer) ' Integer型の値を受け取る=エラー
num = num + 1
End Sub
前提知識{マクロの基礎・作り方から実行まで}
前提知識{変数の宣言や使い方}
前提知識{Callとは?使い方・書き方}
2行目でString型として宣言した変数を4行目でサブプロシージャに引数として渡しています。
7行目でその値を受け取っていますが、Integer型として受け取っています。
この型不一致がエラーの原因です。
主な対処法としては、以下の3つです。
- 変数の型を一致させる
- Variant型を使う
- ByRefをByValに変更する
次項で解説いたします。
VBAコンパイルエラー「ByRef 引数の型が一致しません」の対処法
変数の型を一致させる
変数の型を「渡す側」と「受け取り側」で一致させれば、エラーを回避できます。
下記VBAコードは前項の例を修正したものです。
Sub test()
Dim num As Integer ' Integer型の変数「num」を作成
num = "100"
Call sample(num) '「num(Integer型)」を引数としてサブプロシージャに渡す
End Sub
Sub sample(ByRef num As Integer) ' Integer型の値を受け取る
num = num + 1
End Sub
2行目の変数「num」を「Integer型」に修正したことで、「渡す側」と「受け取り側」の型が一致し、エラーが解消されました。
Variant型を使う
余計なことを考えたくない場合は、Variant型を使うのも1つの手です。
「渡す側」と「受け取り側」の双方をVariant型に変更してみましょう。
Sub test()
Dim num As Variant ' Variant型の変数「num」を作成
num = "100"
Call sample(num) '「num(Variant型)」を引数としてサブプロシージャに渡す
End Sub
Sub sample(ByRef num As Variant) ' Variant型の値を受け取る
num = num + 1
End Sub
これでエラーが解消されます。
しかしながら、Variant型を使う際には注意すべき点もありますので、下記記事をご参考ください。
ByRefをByValに変更する
「ByRef」を「ByVal」に変更することでもエラーが解消されます。
「ByRef」と「ByVal」の違い
- ByVal:変数内の値だけ受け渡し(元の変数は影響しない)
- ByRef:変数ごと受け渡し(変数内の値を変更すると、元の変数の値も変わる)
ByValは変数の値(中身)だけを受け渡すため、型の影響を受けません。
下記記事で詳しく解説しておりますので、ご参考ください。
下記のVBAコードは、「ByRef」を「ByVal」に変えただけですが、エラーが解消されました。
Sub test()
Dim num As String
num = "100"
Call sample(num)
End Sub
Sub sample(ByVal num As Integer) ' ByValで値だけを受け取る
num = num + 1
End Sub
原因を特定するコツ
コンパイルエラーは原因が特定しづらいエラーの1つですが、コツをお教えします。
まず、エラーが発生したら、エラー画面の「OK」ボタンをクリックしましょう。

すると、該当するプロシージャが黄色くマーキングされ、原因と思われる箇所が青くなります。

青くなった変数の型に問題があります。
今回であれば「num」です。
「num」の宣言を見に行くことで、型が確認できます。
あとは「num」を渡した受け取り側の型も確認し、前項を参考にして対処しましょう。
エラーを繰り返さないために
プログラミングにエラーはつきものなので、1回2回の発生は許容範囲です。
しかしながら、何度も同じエラーを繰り返してしまうのは、成長できていない証で良くありません。
エラーを回避する方法を学習し、繰り返さないようにしましょう。
今回であれば「Variant型」や「ByVal」を使うことでエラーを回避できます。
また、「渡す側」と「受け取り側」の型をコメントとして記述しておくのも有効です。
プログラミングの知識が身についてくるようになれば、コンパイルエラーは減っていきます。
腐らずがんばりましょう。
最後に
VBA(Excelマクロ)のコンパイルエラー「ByRef 引数の型が一致しません」について解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!