自分自身のための備忘録ですが、きっと初心者ならだれもつまづくところだと思います。
VariantとObject
Variant
すべての変数。
Variant
すべての変数。
Integerなどの値のみを持つプリミティブなデータ型とオブジェクト型のどちらも代入可能。
配列もプリミティブなデータ型なのでVariantで宣言した変数にしか代入できない。
Object
データとプロパティー、メソッドがカプセル化されたもの。
オブジェクト型のみ代入可能。
これにプリミティブなデータを代入すると「オブジェクトが必要です」エラーとなる。
これにプリミティブなデータを代入すると「オブジェクトが必要です」エラーとなる。
Null, Nothing, Empty, vbNullString の違い
Null Variant型変数内に有効な値が入っていない状態
Nothing Objectとして空の状態
Empty Variant型として空の状態
vbNullString 値が0のString
代入時にSetが必要な場合、不要な場合
Setが必要な場合
Objectに代入する場合で、値だけでなくObjectのプロパティーの設定が行われる。
Setが不要な場合
Integerなどのデータ型に値のみ代入する場合。
Sub呼び出しでCallが必要な場合
引数を()でくくる場合。
コンパイルエラー:プロパティーの使い方が不正です
Setを付けずにObjectへ代入しようとした場合。
コンパイルエラー:型が一致しません
Objectで宣言した変数ににIntegerなどの値をSetしようとした場合。
Dim o as Object: Set o = 1
コンパイルエラー:オブジェクトが必要です
Variantで宣言した変数に値をSetしようした場合。
Dim v as Variant: Set v = 1
Stringで宣言した変数にSetで文字列を代入しようとした場合。
Dim s as String: Set s = "str"
コンパイルエラー:ユーザ定義型は定義されていません
Dimや引数の型宣言で規定のデータ型にもユーザ定義型にもない名前が使われている場合。
だいたいは書き間違え。
実行時エラー:オブジェクトが必要です
値がNothingのオブジェクトのプロパティーにアクセスした場合。
Objectで宣言した変数にプリミティブなデータを代入しようとした場合。
Objectで宣言した変数にプリミティブなデータを代入しようとした場合。
実行時エラー:オブジェクト変数またはWithブロック変数が設定されていません。
Objectで宣言した変数にSetをつけずにオブジェクト、または値を代入しようとした場合。
Dim o as Object: o = "a"
Dim o as Object: o = 1
実行時エラー 400