• ベストアンサー

全ての変数をバリアント型で宣言した場合

VBAでプログラムを作る時に 全ての変数をバリアント型で宣言した場合 どういう問題が発生しますか? 今のパソコンならメモリを気にしなくても問題ないから 全てバリアント型でもいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#228894
noname#228894
回答No.3

全部バリアントでも、宣言しているだけまだましだとは言えますけど、できるだけ早くその域から脱して、中身に適した型宣言を行えるようになるべきですね。 と言うのは、すでに指摘されている「後でわかりにくくなる」のはもちろん、追跡が面倒なバグを抱え込む心配があるからです。単純な例を示します。 For i = hoge To 10 ・・・・ループ内処理・・・ Next という単純な処理で、ループの初期値を与える変数hogeに数値じゃない値が入っていたら、これは当然エラーになりますよね?それはいいでしょう。問題はなぜそうなったかを追跡する時です。 変数hogeが数値型なら、hogeに数値以外の値を代入しようとした時点でエラーになるので、すぐにやらかした場所がわかります。しかしバリアント型だと何でも入れられちゃうので入れた時点ではわからず、このForループに来るまでエラーにならない。ってことは、どこでおかしな値を入れちゃったのかは片っ端から検索して回らないとわからないことになります。ここでさらにめんどくさい可能性があります。 'これならすぐわかるが、 hoge = "a123" 'こうなってたらどう判断しますか? hoge = kari 全てきちんと型宣言をしてあれば、後者の場合でもその場でエラーになるからすぐにわかります。ぶっちゃけ、規模の小さいコードだったら別に変数宣言もしなくて大丈夫だったりもするんですが、それなりに規模があるコードや登場する変数が多いコードでは、使う変数の型を検討し、相応な型宣言をしておく方が自分の身を守ることにつながるのです。

jikuwdado
質問者

お礼

ありがとうございました。

その他の回答 (2)

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.2

私は、普段「VBScript」でプログラムを組んでいますが、すべて短いプログラムで、せいぜい数百行です。 「VBScript」は型宣言が出来ないので、結果、すべて「Variant」型になってしまいます。 短いプログラムで、使う変数が少ない場合は、問題を感じませんが、やはり、少し長くなると、頭の中がややこしくなります。 「VBA」でプログラミングされているなら、「型」宣言に慣れ親しんでおかれる方が絶対にいいと思います。 型宣言を習慣づけておかれた方がいいです。

jikuwdado
質問者

お礼

ありがとうございました。

回答No.1

Q、全ての変数をバリアント型で宣言した場合。 A、訳の判らない変数宣言になります。 ですから、誰も読む気はしないでしょう。 Dim ExitNow As Boolean Dim N As Integer Dim I As Integer Dim S As Integer Dim T As Integer Dim strINList(1) As String Dim strSQL As String Dim strDatas As String Dim strFamily As String Dim strFamilies As String Dim strName As String Dim strNames As String    ↓ Dim ExitNow As Variant Dim N As Variant Dim I As Variant Dim S As Variant Dim T As Variant Dim varINList(1) As Variant Dim varSQL As Variant Dim varDatas As Variant Dim varFamily As Variant Dim varFamilies As Variant Dim varName As Variant Dim varNames As Variant もう、変数タイプが不明ですので、用途も類推できません。また、変数の有効性をチェックする要領も定かではありません。IF-THEN 文を書く際も、冒頭の宣言を≪タイプ控え≫として残しておいて一々参照する羽目になります。変数の宣言と変数の命名規則は対のもの。そして、それはプログラミングをスムーズにするキモです。それを軽視・無視したプログラムは、誰も読む気はしないでしょう。   IF Len(strdatas & "") Then   IF I > 0 Then   IF ExitNow Then

jikuwdado
質問者

お礼

ありがとうございました。