VBAのFor Eachで「バリアント型またはオブジェクト型」と出るとき

VBAのFor Eachで「バリアント型またはオブジェクト型」と出るとき

記事
IT・テクノロジー
カテゴリ:VBA・マクロ

For Eachの行で「変数はバリアント型またはオブジェクト型でなければなりません」と出たら、For Eachの直後にある変数を確認します。

ここでは、Splitで文字列を分けて順に処理するコードを直します。エラーの出る箇所を確認できていて、VBAのコードを編集できる方向けです。

1.For Eachの直後の変数を探す


次の抜粋では、確認する変数はitemです。

Dim item As String
For Each item In Split("東京,大阪", ",")
Debug.Print item
Next item

Splitは文字列を区切り、配列を返します。配列をFor Eachで回すとき、その要素を受け取る変数にはVariant型が必要です。中身が文字列でも、itemをString型にはできません。
02_control_variable.png

2.その変数の宣言だけを直す


編集前のブックを別に残します。itemの宣言を確認し、同じ行のStringをVariantに置き換えます。新しいDimの行を追加する必要はありません。

Dim item As Variant
For Each item In Split("東京,大阪", ",")
Debug.Print item
Next item

変更したのは1行目だけです。変数名、Splitの文字列と区切り記号、ループ内の処理はそのままにします。
03_string_to_variant.png

Debug.Printはイミディエイトウィンドウへ値を表示する命令です。上の抜粋には、セルへの書き込みやファイル保存の処理はありません。

3.同じコンパイルエラーが消えたか確認する


VBAエディターの[デバッグ]メニューから、[プロジェクト名のコンパイル]を選びます。「プロジェクト名」の部分には、VBAProjectなどの名前が表示されます。

同じエラーが残るなら、次に示された変数にも同じ問題がないか確認します。別のエラーが出た場合は、そのメッセージと該当行を確認してください。

コンパイルが通っても、転記先や計算結果まで正しいとは限りません。元のマクロを実行する前に、処理対象と出力先を確認し、コピーで試す場合も原本へ書き込まないようにします。

今回直すのは、Splitの配列を回す箇所です。ほかの変数や、セル・シートを回す処理の型まで一括変更しないでください。

マクロの修正箇所が分からないときも、お気軽にご相談ください。

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す