エラー内容
VBAコンパイル時に、「For Each に指定する変数はバリアント型変数またはオブジェクト型でなければなりません。」と表示される。
原因と解決方法
1つの原因と、その解決方法が考えられます。
原因1. 制御変数の型がコレクションに対応していない
解説
For Eachステートメントでは、Inの後で指定されているコレクションを1つずつ繰り返し処理していきます。
その時に処理対象となるコレクションを格納するのが制御変数(For Each の直後にある変数)です。
なので、制御変数がコレクションを格納できる型でないとエラーが発生します。
1 2 3 4 5 6 7 8 9 |
Sub ErrSample22_01() Dim wsTarget As String For Each wsTarget In Worksheets MsgBox wsTarget.Name Next End Sub |
サンプルソースでは、ワークシートのコレクションに対して、制御変数が文字型になっています。
解決方法
制御変数を、コレクションを格納できる型に変更します。
1 2 3 4 5 6 7 8 9 |
Sub ErrSample22_02() Dim wsTarget As Worksheet For Each wsTarget In Worksheets MsgBox wsTarget.Name Next End Sub |
サンプルソースではコレクションがワークシートの集まりなので、それを格納できるWorksheet型に修正しています。
コレクションは繰り返す対象の集まりなので、型の最後に複数を意味するsがついています。 (Worksheets)
逆に制御変数は1つずつ扱うので、型の最後にsがつきません。 (Worksheet)
まとめ
制御変数をObject型、Variant型にしてもエラーを回避できます。
ただそうすると、制御変数の後ろにピリオドを入力しても、入力候補が表示されません。
Object型、Variant型だと、何が格納されるかわからないので、VBAも入力候補を表示できないんです。
なので制御変数の型は、Object型、Variant型ではなく、Worksheet型など固有オブジェクト型を使いましょう。