• ベストアンサー

「 VBA の 宣言 」 がない場合の問題点は ?

下記例で、 「 宣言 」 なしでも、現在のところ、問題は発生してませんが、 今後、「 宣言 」 がなかった場合の 「 問題点の例 」 を教えて下さいませ。 ------------------------------- Sub ブックA*の全シートをコピー() Dim Wb As Workbook '宣言 For Each Wb In Workbooks If Wb.Name Like "ブックA*.xls" Then With Workbooks("ブックB.xls") Wb.Worksheets _ .Copy after:=.Sheets(.Sheets.Count) End With End If Next Worksheets(Worksheets.Count).Activate MsgBox ActiveSheet.Index Worksheets("Sheet1").Select End Sub

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 VBA というよりは、VBからそうなのですが、概ね、"なし"でも作れるので、初心者用と言われるわけです。 練習段階でも、「宣言」なしで作っていくと、途中で、作ったコードが読み切れていないことが往々にしてあります。ひとつの代入値が、その場、その場で、いろんな型の変化をしていくことがあります。それを、きちんと把握しているか、ということが、VBAの学習にもよいです。 私の場合は、#1 さんのご指摘のように、主な目的は、省メモリです。 Variant 型は、何でも入るということで、入れ物としては一番大きくなります。確か、22 byte + α (文字列を入れた場合)だったと思います。 一番良い例が、メモリの大量消費される Variant型 配列変数にした時に、かなり早く一杯になってしまいます。String型(10+α)やInteger 型(2), Long 型(4)とかします。 また、初期段階でも必要性が出てくるのは、時間や日付のDate 型(8)ですね。 もちろん、最初は、Variant 型やString型で、その代入値を受け取っておいて、それが正しい日付や時間として扱えるか判定して、Date 型の変数に入れます。そうしないと、入り口でエラーを起こしてしまいます。しかし、そのまま最後まで、Variant 値で通してしまって、うまく通るとは限りません。 「コードは通ればよい式」では、エラーなんて、起きてからデバッグということになるのですが、もともと、データ型の意識がないと、どこで本当のエラーが発生しているのか良く分からないのです。もともと、VBAは、他人にコードの修正を頼むということはあまりありませんが、半年でも経つと、自分でも分からなくなります。 また、たとえば、浮動小数点を多く扱うようになった時に、まったく分からない現象がおきたりします。 '例 Sub TESTMACRO()   Dim dbl_A As Double   Dim sng_B As Single   Dim cur_C As Currency   Dim var_D As Variant     '計算結果はどれも 0 となるはずですが、しかし・・・   dbl_A = 0.5 - 0.4 - 0.1   sng_B = 0.5 - 0.4 - 0.1   cur_C = 0.5 - 0.4 - 0.1   var_D = 0.5 - 0.4 - 0.1   Debug.Print "Double: "; dbl_A, "Single: "; sng_B, "Currency: "; cur_C, "Variant :"; var_D    End Sub また、データ型に厳しいのは、Win32 API関数があります。それから、サブルーチンの引数も、Variant 型では、ちょっとまずいと感じます。 それと、逆に、故意に、Variant 型を使う場合もあります。Variant 型は、null値, Empty値 の非代入値が二種類ありますので、これを利用できるのです。また、エラー値を入れられるのも Variant 型です。こういうことは、良く型の違いの特徴を分かっていないと出来ませんね。だから、ほとんどの一般のワークシート関数の戻り値は、Variant 型になっています。 とはいえ、私自身も、データ型を意識したのは、だいぶ後からです。意識して作らないと、うまくいかないことが出てくるのです。

oshietecho-dai
質問者

お礼

ご詳細、誠に有難うございます。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

例であげてあるVBAでは、このほかに宣言すべき変数はなさそうに見えますが。(見落としであればすみません) どういうつもりでこの例を上げたのか。 Option Explicitは出てませんが。

oshietecho-dai
質問者

お礼

ご回答、誠に有難うございます。

oshietecho-dai
質問者

補足

Dim Wb As Workbook '宣言 の部分のつもりでした。 すみません、説明不足で。

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.1

VBAの場合、宣言(定義)されていない場合、Variant型として自動で定義されます。 Variant型は何でも入るので別にそれで問題はないですが、きちんと定義する場合に比較して無駄が多いため、若干のロス(メモリ上、処理時間上)が生じます。 また後でコードを見返したり、デバッグしたり、全くの第三者がそれを見たときなどに何が何やら分からなくなるということもよくあります。その変数にはどんな値が入るものとして想定されているものか、コードを一々全部見直す必要があるわけで、保守性が低いと言われます。 またVBの場合、きちんと定義していれば入力の際にプロパティ等が自動で補完されますので、単純な入力ミスが減ります。 まあ何ていうか部屋の整理整頓や引越しをする時にその辺の箱に何もかも適当に詰め込むのと、ちゃんと箱にラベリングして後で取り出しやすい探しやすいように工夫するというのの違いという感じです。前者の方法でも結果的にそれでも部屋の片付けは出来ますし、引越しそのものは完了するでしょうが、そういうところで手を抜いて時間や手間を節約した気分になったとしても、長い目で見たら結局はより手のかかる方法を選んでいるということになっているわけで。 長いコードになればなるほど、メモリを多数消費するコードになればなるほどその差は顕著になりますが、例で示しているような程度のものでしたら、適当にしっちゃかめっちゃかに作っても丁寧に作っても然程の差はでないでしょう。 ただ今後もプロとしてやっていくつもりはなく、日曜大工程度のことしかやるつもりはなくても、その程度のことでも丁寧に作っておいた方が無難だとは思います。

oshietecho-dai
質問者

お礼

ご回答、誠に有難うございます。 「箱」 とても解りやすかったです。

関連するQ&A

専門家に質問してみよう