• ベストアンサー

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

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

  • agl-bt
  • お礼率85% (371/435)

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

  • ベストアンサー
  • 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つしか設定されていない場合等は、特に重複等の恐れはないと思うのですが、どうでしょうか?

関連するQ&A

  • VBでグローバル変数を宣言するには

    VB初心者ですが。クイズゲームのようなものを作成したいと考えてます。 Private Sub ~ End Sub の中で宣言した変数って他のところに呼び出したり(戻り値として渡す)出来るのでしょうか? どこでも、いつでも呼び足せるグローバル変数の宣言とはどのようにやるのか、具体的に教えていただけないでしょうか?

  • 変数の宣言について。(マクロ、VBなど)

    こんにちは。 マクロの本を買って今勉強しているのですが、「変数の宣言」がどーしたらよいかわかりません。何のことか説明を読んだだけではまったくさっぱりわかりません。とっても重要なような気がするのですが、その点についてあまり詳しく載っていないのです。今は本のとおり書いているだけです。 f1押しても 戻すとか 取得するとか難しくて(馬鹿でごめんなさい。)なんのことやらわかりません。家族は「気にしなくていい(怒)」といいますが、そういう問題でもなさそうなのでぜひ解り易く教えて下さい。 ちなみにIntegerというのとLongというのはどう使い方が変わるのですか? 質問が漠然としててごめんなさい。(;;

  • エクセル VBA 変数を一括で宣言したい

    こんにちは。VBAプログラム初心者です。 変数を宣言する際、 dim オーダ番号 as long, オーダ番号2 as long, …オーダ番号100 as long という内容を一括で宣言することは可能でしょうか? イメージ的には下のような感じなのですが。。。 dim i as integer for i = 1 to 100 dim オーダ番号i as long dim 単価i as long next マクロで便利にするつもりが余計面倒になっていて困っております。 解決策を教えていただけましたら幸いです。 何卒よろしくお願いいたします。

  • ExcelのVBA。public変数の値が消える

    VBAについて。Excelの2003や2007を使っています。標準モジュールで public 変数を定義しました。 ユーザーformを使い、パブリック変数に値を入れたり変更し、標準モジュールに戻ったとき、そのpabulic変数が resetされてしまっている事があります。全く同じマクロで、この現象が起こることと、起こらないことがあります。excelの2003でも2007でも、同じ現象が起こります。簡単なマクロで再現性のある具体的なものを示したいと思い、試しましたが、できませんでした。簡単なマクロでは、きちんとパブリック変数は保持されています。問題のあるマクロはかなり長いものなので、とても示せません。問題がどこにあるのかわかりません。このマクロで不都合があるという具体的なマクロを示すことができない状態での質問で、申し訳ありません。 また、このようなプログラミングをしていて思ったのですが、ユーザーフォームに対してユーザーが任意の引数を渡す方法あるいは、ユーザーフォームから引数を受け取る方法はあるのですか?今は、pubulic変数を用いたり、具体的なセルに値を代入したりしていますが、どう考えてもそれはエレガントではないし、汎用性もないと思います。引数で引き渡すのが一番綺麗でいいとは思うのですが、それが可能かどうかわかりません。

  • VB6変数の宣言dim j,k,p,m,n as Integerは良くない?

    お世話になります。 VB暦1年です。 汎用の変数宣言でタイトルのように dim j,k,p,m,n as Integer dim ssa,ssb as String など、カンマ区切りで変数宣言を使っていたのですが 最近、知人にasの手前の変数は型どおり宣言されるが その手前の変数はVariant型で宣言されてしまうと指摘されました。 指摘されるまで気にはしていませんでしたが ウォッチで確認すると変数に代入されるまでは 型がVariant/Emptyとなってます。 以後、気をつければいいのですが 過去にコーディングしたプログラムにも多少、使用していて客先に納品してしまっているものもあります。 後々、問題になるのかな?

  • ExcelVBAマクロでの変数の宣言エラーについて

    初歩的な質問になりますが、ExcelVBAマクロで変数の宣言「Dim wdObj As New Word.Application」のエラーについて確認させてください。 変数の宣言「Dim wdObj As New Word.Application」がExcel2007以前では使えないようで、『ユーザ定義型は定義されてません。』というエラーがExcel2007以前で起きます。 Excel2010では問題なく動作しています。 Excel2007以前でも動作する方法をご教授いただけますでしょうか。 お手数おかけしますが、よろしくお願いいたします。

  • クラスの外で宣言した変数について

    初心者的な質問ですみません。 クラスの外で宣言した変数をそのままクラス内で使うことはできないのでしょうか? publicのメンバーにポインタの変数を作ってそこにアドレス指定するか、setするメソッドを作るしかないのでしょうか? もしクラスの外で宣言した変数をそのままクラス内で使えないのは、スコープ的にどういう理由で使えないのか教えて下さい。 クラス内クラスだと子クラスは親クラスの変数を参照できますが、それとは違うのでしょうか? どうぞよろしくお願い致します。

  • エクセルマクロ(VBA)の変数について教えてください。

     仕事でエクセルを利用してファイルを作ることが多いのですが、関数とマクロに課題のある者です。  マクロはそんなに高度で複雑なものが現状、必要でないので記録マクロで事足りていますが、私のやり方は  1.手順を記録  2.マクロの実行  3.ステップイン機能でステートメントの動作を見る  4.無駄な構文を削除  5.エラー(デバッグ警告表示)修正  6.日々替わる取り扱いファイル、シート名をそこだけ置き換えて汎用性を持たせている。  7.さらに動作を加えたい時は新しいマクロ記録で構文を記録し、ベースマクロに構文を追加している  8.日々更新変動されるファイルは情報量の余裕をみて、ファイルが想定を超えないように作っている。  9.記述式マクロ(VBA)が十分出来るスキルが乏しい  と言うのが私のレベルですが、参考書、テキストを読んでいると必ず、『変数』Dimスペルというものが出てきます。この意味がもう一つよく分からないので、ツール→オプションのダイヤログボックス編集で『変数の宣言を強制をする』を外しています。  変数は実行の都度変わる値を扱ったり、代入すると言うことは何となく分かるのですが、完全に理解できてないので、(記述が分かりにくい)そこから前に進めません。  サンプル例はありますが、詳しく解説しているものが少ないです。『何故、こうなるか?』というのが抽象的な説明です。  『変数宣言を強制』にチェックを入れた場合、今まで、チェック無しで作ったマクロファイルは動作しませんか?  たまに自動メンバー表示機能から構文を挿入しますが、個々のプロパティやメソッド、コレクションなど記述構文は英語ですが、これを日本語に置き換えて理解できるようにしたいのですが、皆さんはどのようにされたのですか?  

  • 変数について

    お世話になります。 VBAにてプログラムを作成しています。 本コードで得た変数をCALLのサブルーチン先 でもその変数を生かしたいのですが、empty空 になってしまいます。 変数宣言はPublicにしているのですが。 そう言うものなのでしょうか。 お教え頂きたく宜しくお願い申し上げます。

  • 【Java】参照型で宣言された変数名の抽出

    現在、Javaを学習中の大学生です。 Javaのソースコードを解析し、その中で宣言されている変数名を抽出して、 変数表のようなものを作成するJavaプログラムを書いているのですが、 参照型(クラス型)で宣言されている変数名を抽出する方法が思いつきません。 よろしければ、何かアイディアをいただけないでしょうか。 プリミティブ型の変数については、StreamTokenizerクラスを利用しています。 コードをトークンに分解して、型名の次に来るワードトークンを変数名として抽出 するという、単純な方法を使っています。こちらも、改良すべき点などあれば、 アドバイスいただけるとありがたいです。 デバッガを使えば出来ないことはないようですが、 出来ればデバッガは使わない方法でお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう