• ベストアンサー

変数を宣言する理由(エクセルVBA)

 タイトルどおりなのですが、何故変数を決める際に「Variant」や「Integer」等の定義をしないといけないのでしょうか?  自分でマクロを作成する時は、特に宣言をしていませんし、特に困ったことはありません。  しかし、マクロに詳しい人や、教えてGOO等で教えてもらうコードでは、必ずと言っていいほど、変数の定義をしています。  具体的な理由を知りたいのですが、初心者にもわかりやすいように説明いただけるとありがたいです。

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

  • ベストアンサー
  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.6

> 複雑なプログラム(コード)を作成しない場合には、 > 変数の定義をする必要は無いという理解でよいので > しょうか? 申し訳ないですが、私にはちょっと分類が分からなく なりました。 例えば、Lisp言語ではsetqなどのマクロで変数名を宣 言したり、letやletsでローカルな変数名を宣言が多用 されたプログラムは非常に稚拙に感じます。コンパイラ 言語風な発想と感じます。 複雑でもスマートさを感じるプログラムは、関数の引数 の名前が殆どの書き方ですね。 そもそもLispは型の宣言という発想がありませんし。 そんなLispでもコンパイラがあることはあります。真の 意味でのコンパイラと言えないかもしれませんが。 言語によって事情が違うのかもしれません。 BasicやVBAなど組んだことはありますが、どうしても好 きになれないところが、そんなところにあるのかも?

agl-bt
質問者

お礼

 2度の回答ありがとうございます。  回答内容は???って感じなので、このあとLISP言語についてネットで調べてみようと思います。

その他の回答 (6)

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

#5 の回答者です。 すでに、書きましたが、少し書き加えておきます。 現実的に、変数の宣言なしで通るとしても、VBAの基本は、変数のデータ型の宣言する、ということです。それが、VBA(など)の正しく学んでいくための最低条件です。 それで困らない、必要ないのではないか、と聞いている人に、変数を宣言しなさい、と言う必要はないと思います。VBAを一通り勉強すれば分かるでしょう、というだけです。具体的な例は必要もないと思います。初心者に分かるレベルには、ほとんど存在しませんからね。 > 複雑なプログラム(コード)を作成しない場合には、 > 変数の定義をする必要は無いという理解でよいので > しょうか? 同じような人がいます。それは、自己流ですから、他人に良いも悪いも求める必要もありません。ふつうなら、半年も経てば、ある程度のコードは書けるものですが、いつまでも上達は厳しいと思います。

agl-bt
質問者

お礼

 了解しました。今後は、できるだけ変数のデータ型を宣言しようと思います。  VBAは初心者も初心者なので、このまま勉強を続けていれば、いつかそういう意味だったのかとわかる時がくることを期待して、勉強したいと思います。  2回も回答ありがとうございました。

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

こんばんは。 何か、試験問題みたいな内容です。 >自分でマクロを作成する時は、特に宣言をしていませんし、特に困ったことはありません。 私が、掲示板で、変数を宣言しているのは、二つの理由です。 ひとつは、ユーザーの環境が、Option Explicit と、明示的に変数を宣言することを要求されている可能性があるので、質問者さんが、「エラーが出ました」という人がいるからです。もうひとつは、変数の宣言をしないで、コードを書ける範囲などは中級レベルまでしかありません。 例えば、Currency型と他の型で、違いが出てきます。Byte 型に取らないと、内容が取れないものもあります。動的配列変数が使えません。データ型の宣言をしていないと、サブルーチン・プロシージャや関数プロシージャや、それにまつわる値渡し、参照渡しが、ほとんど使いこなせないはずです。型の宣言をすると、コーディングの際に、見えてくるものが多いとは思います。 時々、このような質問がありますが、どんな理由さえも「だからなんなの?」と突っ込まれたら、VBAの場合は、最終的には、個人の問題というしかありません。困らなければ、必要にせまらなければ、人は覚えないものなのです。その必要性を説いたところで、それを入れなくては正しい答えが出ないケースは、初級では、あまり多くはありません。 以下は、Accessの内容ですが、Excel VBAにも通用する内容です。 「Visual Basic コードのパフォーマンスを向上させる」 http://office.microsoft.com/ja-jp/access/HP051868231041.aspx (かつて、MSDN--Office 97 Developer 版にあった文面と似ています) VBAは、本体、Applicationによって、制限されているメモリですから、それは考慮しなければなりません。 なお、変数の宣言の問題とは違いますから、おそらくは混同するだろうとは思いますから、ざっと読むだけにしてほしいものですが、グローバル(Global)の反対は、ローカル(Local)です。グローバルというのは、プロジェクト全体のことを意味します。プライベート(Private)というのは、他所から呼び出せないことを意味します。ローカルというのは、該当モジュールのみのことを意味します。ローカルモジュールというのは、標準モジュール以外のものを指します。 グローバルは、変数としては、また、パブリック(Public)というステートメントが一般的です。ローカルモジュール以外、つまり標準モジュールは、他所から呼び出せないために、Private ステートメントを使います。ローカルモジュールは、Private ステートメントは、不必要であり無駄です。 VBAの規模では、Private ステートメントなどは、ほとんど不要です。また、プロシージャ・スコープ(プロシージャの中でデータ型の宣言をすること)がほとんどです。モジュール全体の場合は、ローカルモジュール(Local Module)のステートメントも可能です。これは、変数のスコープの問題であって、宣言のデータ型の宣言とは、直接関係がありません。変数の意義が分からない人にとっては、ここらは、まったく不要な話です。 >複雑なコードでなければ、その変数がグローバル変数であったとしても問題無いのでしょうか? >例えば、変数が1つとか2つしか設定されていない場合等は、特に重複等の恐れはないと思うのですが、どうでしょうか? 変数の宣言を強制しない、Option Explicit をしていない前提では、何も意味がありません。逆に、宣言を強制している条件化では、ひとつでも欠けたら、エラーを返します。繰り返すようですが、VBAでは、その義務はないのですから、必要がないと思えば、使わなければよいと思います。変数の書かないならば、ずっと初心者の範囲は超えないだろうし、それで問題がなければよいと思います。 それから、VBAは、コンパイル型です。いくつかの選択モードがあって、順次コンパイルにするか、最初からコンパイルするとかします。そうしないとありえない現象が現れます。コンパイル後、中間言語としてキャッシュに入ります。

agl-bt
質問者

お礼

 VBAはコンパイル型なんですね。ネットでコンパイルとインタプリタを調べた時はインタプリタだと思っておりました。  回答ありがとうございました。

  • ASIMOV
  • ベストアンサー率41% (982/2351)
回答No.4

変数名の間違い防止と習いました 例えば l と 1 0 と O 変数名としてこれらを間違って記載しすると、発見が困難ですよね 他にも test を tset なんてのも見つけづらいです 宣言をしていれば、これらの間違いに警告を出してくれます VBAでも、オプションで「変数の宣言を強制する」にチェックを入れると、この警告を出してくれます

agl-bt
質問者

お礼

 間違い防止というのにも納得しました。ということは、多くの変数を使わない場合(例えば、XとYしか変数を使わない場合)等は特に問題は無いということですね。  回答ありがとうございました。

  • s-uzen
  • ベストアンサー率65% (2051/3118)
回答No.3

変数の型を明示的に宣言したほうが、いろいろメリットがあるからです。 VBやVBAでは、型の宣言をしない場合はVariant型として扱われます。 小さなプログラムでは、多分殆ど差は認められないと思います。 Asで型宣言なしやVariant型の場合、 ・必要以上にメモリが使われる ・実行速度が遅くなる ・型宣言があることで、扱うデータの型が明示的にはっきりできるので、バグを防ぐことにつながる。 ということになるからです。 ついでに、StringとString*10のように長さのない場合と有る場合にも、似たような状況になります。 長さ指定なしの場合は、格納文字列長さ+10バイト余計にメモリを消費します。 固定長データなのか可変長を扱うのかの判断もしやすくなります。 といったところでしょうか。  

agl-bt
質問者

お礼

 メモリの消費が抑えられるというのには納得しました。今後はなるべく変数に定義しようと思います。  回答ありがとうございました。

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.2

変数を定義しないものはインタプリタ(コンパイルし ない言語)に多用されています。しかし、コンパイル 言語は変数の定義は必須です。 インタプリタでも変数の定義は可能なのが一般です。 これらを鑑みて、変数の定義を行い、属性をはっき りさせるのはドキュメント効果ではないかと思います。 つまり人間の目にはっきりと分かり易い、ということ ですね。 私がインタプリタをやっていた時は、寿命の短い変数 は定義しないで、寿命が長い変数は定義する、という 切り分けをしていました。

agl-bt
質問者

お礼

 コンパイラ、インタプリタと言った言葉は聞いたことはあったのですが、ネットで調べてなんとなく理解ができました。  回答ありがとうございました。

agl-bt
質問者

補足

 複雑なプログラム(コード)を作成しない場合には、変数の定義をする必要は無いという理解でよいのでしょうか?  インタプリタとコンパイラの意味を考えると、そう理解したのですが、どうでしょうか?

  • Seravy
  • ベストアンサー率47% (118/249)
回答No.1

VBAはあまり触らないのですが、他言語でプログラミングしてる者なので、的を得てるか分かりませんが、、 おそらく、変数のスコープを気にしているのだと思います。 多くの場合、変数にはその有効範囲が決まっていて、無宣言だとどこでも使える変数(グローバル変数)、宣言ありだとそのブロック({}でかこった範囲)のみで使える変数(プライベート変数)、というようになっています。 特殊な場合が無い限り、普通はプライベート変数を使います。なぜかというと、他のブロックで同名の変数を使っていても変数名がかぶっておかしな動作になるということがなくなるからです。特におおきなプログラムになると、コードは合ってるのになぜか上手く行かない・・必死でデバックしてると宣言を忘れてグローバルになってた、とかたまにあります。 加えて、VBAもおそらくメモリ管理はおまかせ何だと思いますが、プライベート宣言をするとブロックの終了時にメモリ解放が行われるなど、資源を節約できます。 以上の理由から宣言をして、ブロック内のプライベート変数になってるのではと思います。

agl-bt
質問者

お礼

 プライベート変数等はじめて聞く言葉も多く大変でした。まだまだ初心者ということですね。  回答ありがとうございました。

agl-bt
質問者

補足

 複雑なコードでなければ、その変数がグローバル変数であったとしても問題無いのでしょうか?  例えば、変数が1つとか2つしか設定されていない場合等は、特に重複等の恐れはないと思うのですが、どうでしょうか?