VBAで開発していると、エラーメッセージを見ても原因がわからないことがあります。
今回は、実際にハマりやすい以下の2つについて、具体例つきで解説します。
- FORとNEXTの対応エラー(実は違う原因)
- 謎の「ByRef引数の型が一致しません」エラー
① FORとNEXTが合っているのにエラーになる原因
よくある状況
こんなエラーに遭遇したことはありませんか?
「Forに対応するNextがありません」
でも実際にコードを見ても…
For i = 1 To 10
Debug.Print i
Next i
どう見ても合っている。なのにエラー。
真の原因は「END単体」
実は、原因は全然別の場所にあることが多いです。
例えば👇
Sub Sample()
For i = 1 To 10
If i = 5 Then
End ' ← これが原因
End If
Next i
End Sub
なぜこれでおかしくなるのか?
End は、
👉 その場でプログラムを強制終了する命令
です。
つまり、
- 構文的にはOK
- でも処理の流れが途中で切れる
結果として、VBAは
👉 「構造が壊れている」と誤認識
して、関係ないエラーを出します。
解決方法
手順
Endを検索(Ctrl + F)- 以下をチェック
End IF End With End Sub End Function
👉 「End 単体」が無いか確認する
ポイント
- エラーメッセージは必ずしも正しくない
- 「構文エラーっぽい時ほど別の原因」を疑う
② 謎の「ByRef型不一致」エラーの正体
よくあるエラー
ByRef 引数の型が一致しません
でもコードは正しそう👇
Sub Test()
Dim a, b, c As String
a = "Hello"
Call Sample(a)
End Sub
Sub Sample(str As String)
Debug.Print str
End Sub
何が問題なのか?
この宣言👇
Dim a, b, c As String
実はこう解釈されます👇
Dim a As Variant Dim b As Variant Dim c As String
👉 最後の変数だけ型指定される
なぜエラーになるのか?
aは VariantSampleは String を期待
👉 型が違うので ByRef エラー発生
解決方法
正しい書き方
Dim a As String Dim b As String Dim c As String
比較
NG
Dim a, b, c As String
OK
Dim a As String Dim b As String Dim c As String
実務での対策
- 1行1変数で定義する
- Variantの混入を防ぐ
- バグ調査時間を削減できる
まとめ
FOR/NEXTエラー
- 原因はFORではないことが多い
End単体が潜んでいる可能性大
ByRefエラー
- 原因は変数宣言
- 「複数変数を1行で定義」が地雷
結論
VBAは
👉 エラーメッセージをそのまま信じるとハマる言語
です。
だからこそ、
- 構造を疑う
- 書き方を統一する
これだけで、トラブルの8割は防げます。
The following two tabs change content below.
ストレスフリー
うつ病の子育て中の金融系システムエンジニアです。
名もなき家事、目的のない仕事、見えない不自由、チリツモストレスを見つけ出して、設備投資、システム化、見える化により、解決します。
習い事で、ドラムをしていました。
最新記事 by ストレスフリー (全て見る)
- ある日、突然おかしくなった【朝の一歩目が激痛】かかとの骨にヒビが入ったと思って整形外科に行った話 - 2026-03-21
- Excelしか知らない人へ:VLOOKUP・XLOOKUPで頑張っているなら、DataFrameを使わないと正直もったいない - 2026-03-20
- PythonでOracle接続にハマった話(64bit問題とtnsnames.oraの落とし穴) - 2026-03-20
