• ベストアンサー

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

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

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

  • ベストアンサー
  • phj
  • ベストアンサー率52% (2344/4489)
回答No.3

変数というは、プログラムには絶対に必要なものです。 プログラムを書くことにより、いろいろできるようになりますが、変数が無いと自動的に判断したり、ひとつの構文を使い回ししたりすることができず、中途半端なプログラムしかかけなくなってしまうのです。 記録マクロは変数を使わないのは、人間が介在した結果、プログラム(マクロ)上に判断する内容を書く必要が無いからです。 たとえば、誕生日の記録一覧表があったとします。今日の日付を参照して、自動的に今日誕生日の人を教えてくれるマクロ作りたいときには貴方はどうしますか? パソコンとプログラムは常時起動しているとして、マクロの中身は、 1.今日のシステム日付を見て、誕生日の人を探す。 2.誕生日=今日の日付を見つけたら、その人を表示する。 になります。 しかしここで問題になるのは、誕生日の人は必ずしも1人では無いということです。 Yes・Noの判断でしたら、変数を使わなくてもできます。 しかし、 誕生日の人がいない=0 誕生日の人が1人 =1 誕生日の人が2人 =2 というふうに、人数が異なれば、リストから取得する動作も人数分、それを表示するスペースも人数分作らなければ、マクロはきちんと動作しないことになります。 このようなときに変数が活躍します。 プログラムの流れで言うと 1.リストを順番に今日=誕生日をチェックする。 2.誕生日の人が見つかったら、変数Aに1を入れる。 3.また見つかったら、変数Aに+1をする。(2になります) 4.また見つかったら、変数Aに+1をする(3~になる)をリスト全部に繰り返す。 5.変数に代入されている数を見て、必要な数だけ表示枠を作る。(5と入っていた場合、5人分ですね) 6.誕生日の人の名前を取得し、用意された枠の中に表示する。 こうすれば、何人でも大丈夫です。このようにして変数は使います。 (本当は変数を使うと、プログラムの順番はもっと簡単になりますが、説明用のため長いです) また、変数宣言の強制をしても、すでに作られたマクロに変数が無ければ影響されません。 日本語で名称等を利用していますが、特に不都合は無いです。ただし、長いマクロになると遅くなったりします。

superfighter823
質問者

お礼

 回答有難うございます。 phjさんの、『プログラムの流れで言うと~』解説は非常に過程が分かり易く、丁寧に解説していただいて流れが掴めるのですが、  1~6までの記述をVBAステートメント/日本語解説を並行、比較して解説している参考書テキストが少ないです。  一定のレベルの人を対象にしているのか、この辺の詳しい過程の日本語記述解説が欲しいのです。  『誕生日の人は必ずしも1人では無い』、ではどう記述するか?何故そうしないとエラーが出るか?回避法は?それらが分かる内容の参考書を探しているのですが‥‥  各出版社からのVBAテキストを本屋で立ち読みして内容を見ていますが、一番これが載っているテキストありませんかね。  詳しい解説を添えていただき、有難うございました。参考になりました。

superfighter823
質問者

補足

何度もすみませんが、『変数宣言を強制する』にチェックを入れて、新たに『マクロの記録』をした場合、何の影響もないのでしょうか?動かない?やったことがないのでお尋ねしました。

その他の回答 (3)

  • phj
  • ベストアンサー率52% (2344/4489)
回答No.4

#3です。答礼ありがとうございます。 補足の件ですが、『変数宣言を強制する』を宣言してもマクロの記録は、変数を作りませんので影響しないはずです。 さて、参考書ですがちょっと古くて恐縮ですが、ひとつだけ流れと「なぜこれが必要か」を説明してくれているものを知っています。 「Excel97スタンダードプログラミング」藤森 洋志 です。私もこれでマクロの流れを覚えました。 参考にしていただけると幸いです。

superfighter823
質問者

お礼

重ね重ねのご回答有難うございました。 今、エクセル2000、エクセル2003を使っているのですが、案内いただいた参考書を古本屋等を歩いて探したいと思います。  最新のテキスト本ももう一度、吟味して自分に合うものを見つけたいと思います。本当に有難うございました。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

『変数宣言を強制にチェック』ということはマクロの先頭に Option Explicit と記述することと一緒です。 これを記述すると sub a()  A = B + 1 exit というマクロはエラーとなります。それはaという変数が明示的に使用することを宣言していないからです。 「使用する変数は必ず宣言しなさい」がこのオプションの意味です。 sub a() Dim A , B As Integer  A = B + 1 exit のように A, B という変数を「整数」と定義すればエラーにはなりません。 このオプションを使うと「いちいち変数を定義するのが面倒」というデメリットはありますが、変数を Ab と書くところを Ad と間違って入力して「マクロが意図したとおりに動作しない」という不具合を防止する効果があります。 マクロが長くてかつ複雑な場合はこのオプションを使用した方がデバッグが早いです。 

superfighter823
質問者

お礼

 回答有難うございました。私は幼少の頃から算数、数学が大の苦手なもので、エクセルをやっているとその苦手な数学の式の展開、方程式、不等式とよく似た記述と出くわします。  変数ステートメント見ていると、似たようなこれらがちょくちょく出て来て『嫌だなー』と挫折してしまいます。でも努力しないとダメですよね。  有難うございました。

noname#22364
noname#22364
回答No.1

こんにちは。 参考URLのサイトは勉強になりますよ。

参考URL:
http://www.asahi-net.or.jp/~ef2o-inue/top01.html
superfighter823
質問者

お礼

早速のご回答有難うございます。ジックリHPを見て勉強したいと思います。  有難うございましたー!!

関連するQ&A