【VBA】コンパイルエラー「ByRef 引数の型が一致しません」の原因と対処法

スポンサードリンク
VBA

この記事を読んでわかること

  • VBAコンパイルエラー「ByRef 引数の型が一致しません」の原因と対処法がわかる
  • エラーの原因を特定するコツを知れる
  • エラーを繰り返さない方法を学べる

※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。

-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
Excel使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします

スポンサードリンク

VBAコンパイルエラー「ByRef 引数の型が一致しません」の原因

コンパイルエラーByRef引数の型が一致しません
コンパイルエラー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」ボタンをクリックしましょう。

コンパイルエラーByRef引数の型が一致しません
コンパイルエラーByRef引数の型が一致しません

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

青くなった変数の型に問題があります。
今回であれば「num」です。
「num」の宣言を見に行くことで、型が確認できます。
あとは「num」を渡した受け取り側の型も確認し、前項を参考にして対処しましょう。

スポンサードリンク

エラーを繰り返さないために

プログラミングにエラーはつきものなので、1回2回の発生は許容範囲です。
しかしながら、何度も同じエラーを繰り返してしまうのは、成長できていない証で良くありません。

エラーを回避する方法を学習し、繰り返さないようにしましょう。
今回であれば「Variant型」や「ByVal」を使うことでエラーを回避できます。
また、「渡す側」と「受け取り側」の型をコメントとして記述しておくのも有効です。

プログラミングの知識が身についてくるようになれば、コンパイルエラーは減っていきます。
腐らずがんばりましょう。

スポンサードリンク

最後に

VBA(Excelマクロ)のコンパイルエラー「ByRef 引数の型が一致しません」について解説いたしました。

当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。

最後までお読みいただき、ありがとうございました。がんばってください!

タイトルとURLをコピーしました