- ベストアンサー
VBAの初歩中の初歩
すみません。VBAの勉強を始めたばかりで質問させてください。 今はすごく初歩の段階で式の意味を理解するのに精いっぱいです。 特にFor i = 1 to 10という式ですが、繰り返しの式になると思います。 このiというのはどこからでてきたのかがさっぱりわからないのですが。。。 他にもセルの範囲を指定するときに, cells(i, 3)とありなぜ cells(1, 3)ではだめなのかとそこで躓いてしまします。 さらに、iだけでなく、for j というのも出てきました。 これらはただ単に仮で付与しているものなのでしょうか? どなたか教えてください。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
最初のうちは、あまり考え込むより、兎に角どんどん新しいものを作っていったほうがいいと思いますよ。どうせと言ったらナンですが、始めから全てを理解し尽くすことは、ムリと言ってもいいくらいです。ウェブページからコードをコピペして、それをいろいろ書き換えてみるのも勉強になるでしょう。 ループの仕組みというか、どんなふうに動いていくのか、また、各瞬間の変数の値が幾つになっているのかがよく分からないという場合は、次の 2 機能を同時に使うことをお勧めします。 ● VBE メニューバーのツールのステップイン(F8) F8 を押すたびに、1 行ずつ、コードを実行していきます。 ● VBE メニューバーの表示のローカルウィンドウ 表示されるウィンドウ内に各変数の現在値が表示され、上の F8 によって値が変遷していく様子が分かります。 変数名はプログラマが頭で考えたもの、と言ったら、何か言われるかもなという気も少しはしていましたが…。やはり反応がありましたね。私個人としては、なるべく自由な発想でお勉強に取り組んでいただければと思いますが、他のご意見にも耳を傾けてください。 >もし、for i = 1 to 10と設定されていたら1行目から10行目までの範囲で、1行目かもしれないし、10行目かもしれない。この認識であっていますでしょうか? そうですね、なにしろ変数ですから、おっしゃるとおり、定数ではないですね。 ただ、「かもしれない」とか不定とかいう言い方がベストかどうかは、よく分かりません。For はループなので、1、2、3、4、5、6、7、8、9、10 というふうに、この順番で、範囲内の全ての整数を i に代入していくということです。だから Cells(i, 3) というコードは、C1、C2、…、C10 セルを、この順で、表していくことになりますね。 >しかしなぜmsgbox bの項目が必要なのかわかりません。結果マクロをかけると、Bのメッセージボックスは表示されないにもかかわらず、この項目を作る意味は何でしょうか? ???? メッセージが 2 回、出るはずです。最初は b の値である 3、次に最新の a の値である -1 を表示するメッセージ 2 つが、順に出るはずです。お手元で、どのように操作されましたか? >……書くと、1000というボックスとなぜか3というボックスが表れてきます。997から999までの数字をiに代入するということだと思いますが、なぜ997から999は何も表示せず、1000なのでしょうか? For ブロックにより 3 回ループさせていますが、その間に i は、(0 →)997 → 998 → 999 → 1000 と変化します。また、同じ間に n は、(0 →)1 → 2 → 3(→ループ中断)と変化します。プロシージャが一行一行、実行されていく中で、Next i の 行に来たときに、i の値が 1 増加するとともに、For の行まで戻ります。 「MsgBox i」と「MsgBox n」の 2 行はどちらも、「For と Next i の間の位置」には書かれていませんね。外側です。つまりループの途中でメッセージは出現せず、ループの終了後に 1 回だけ出るのです。したがって 1000 と 3 のみが 1 回ずつ表示されます。 ご質問のコードでは、i の値を増加させてはいるけれど、ループ中にその i を使って何かの計算とかをしているということは、何もありません。単に増えただけで、i についてそれ以上の意味はなく、ループ中には何の用途にも使っていません。ループ後に、別に必須な手続というわけでは全くないけれども、説明用として、i の値を表示するメッセージを出したまでです。最終的にどうなるのかを見せるために。 一方、n には、ループ中に毎回、n = n + 1 の行に来たところで値が代入されているんですね。ループ前の n の値が 0 であった場合、ループ直後の n の値は、ループの回数に等しい整数になりますね。つまりカウンターです。 >N + 1がどこで処理されているのかいまいち理解できません。 「For と Next i の間の位置」に書かれているから、ループするごとに、その行まで処理が進んでくるたびに毎回、代入されているということです。つまり n は、0 → 1 → 2 → 3 となります。 >そして3が最も謎なんです。 ループを経ての、最終的な n の値です。No.6 の●に書いたとおり、最後に代入された値が変数に残っています。5 行目において表示させています。i の表示は 4 行目ですね。 >プロシージャーを最初に書くときDim sheet as Worksheetと結構書かれています。そのあとにset sheet = thisworkbook.worksheets("Sheet1")と続きます。私が思うにこのsetからの文だけでいいような気がしますがworksheetと最初に宣言する必要はあるのでしょうか?また宣言後、setと二つ書かなければいけないのでしょうか? プログラミングでは、変数を宣言するのが普通と思ってください。 VBE ではデフォルトの設定で、宣言を省いていても、よく分からない単語は自動的に変数として扱われ、省いただけではエラーにならない仕様になっています。ということは、コード中に誤記があっても、そういう定数をユーザーが決めただけで誤りではないんだ、と判断されてしまいます。長いコードになるほど、宣言なしでは、誤りに気付きにくくなります。 ユーザーに宣言を強制する設定(Option Explicit)は、VBE メニューバーの「ツール > オプション > 編集タブ > 変数の宣言を強制する」で行います。デフォルトでは、ここにチェックが付いていません。 しかし実際には、ここのチェックとは無関係に、Option Explicit を標準モジュールなどの冒頭に書くか、それとも削るかによって、強制の有無が切り替わります。オプションにチェックを入れておくと、新しいモジュールを挿入したときなどに、自動的に Option Explicit が記載されてくるというだけの機能です。 このオプションによって強制される行為は宣言までであって、型の指定(Dim の行の As 以下の部分)については、なお省くこともできます。「Dim sheet」とだけ書いても大丈夫ということです。型を指定しない場合は Variant 型が指定されている変数とみなされるだけなので、効率とかを気にしないケースでは、なくても問題になりません。 次に、変数を宣言しただけでは、まだ何も変数に代入されていません。 数値とか文字列であれば、単に a = 3 といった具合にイコールで結べば、代入できるのでしたね。「Dim sheet As Worksheet」と書くと、Worksheet というのはオブジェクトであるため、sheet はオブジェクト変数となります。オブジェクト変数には、数値などは代入せず、オブジェクト(への参照)を代入することになります。最初に代入されるまでの初期値は、Nothing(何のオブジェクトも参照していない状態)です。代入する際には、キーワード Set を代入の文の直前に付ける約束になっているのです。 つまりご質問の 2 行は、宣言と代入という別の処理を行っているため、Option Explicit であれば、両方の記述が必要です。 そもそも代入を行わないとしたら、同じ Worksheet 型であるとはいっても異なるオブジェクトである、Sheet1 と Sheet2 の区別も付かないですね。どこの何というオブジェクトに対して処理するのかを指定するために代入しないと、何もできないですね。ですから、たとえ宣言を省く場合でも、代入はしないといけませんね。もしくは変数を介さず、Worksheets("sheet1").Copy とか Worksheets(1).Range("a1") などのように、直接的に指定するかですね。 >最後に、もし超初心者でもVBAを理解しやすい本などお勧めありましたらお願いします。 申し訳ありませんが、知識がありません。インターネットとか本屋さんで探してください。もちろんこういった QA サイトで、今回とは別の質問として聞いてみるのも、一法ではあるかもしれませんね。 >Excel VBAのe-本を読んでいるのですが、簡単に書かれすぎているのか、私が知りたいところが抜けている気がします。 よく知りませんが、あらゆる情報が載っている本というのは、あまりなさそうですね。内容の水準も様々でしょうし。 本も良いとは思うのですが、まずはヘルプをたくさん見てください。あとはインターネットでの検索でも、それなりに詳しいサイトはたくさんあります。 とりあえず私程度のスキルでも構わないという方の場合は、職業プログラマのように書籍で本格的に勉強するという必要はないかもしれません。ただどんな方法にせよ、様々な事例に対応できるようになるまでには、時間はかかると思っていたほうがよいでしょう。
その他の回答 (7)
- WindFaller
- ベストアンサー率57% (465/803)
長文で、つまらないと思うなら、無視して構いません。 少し、前回の質問から見ていましたが、質問者さんにとって、分かりにくいものもあるだろうなって思いましたが、まず、書籍を買って、順序良く、そこに出てくるコードをVBEditorに書いてみることです。そして、「実行」してみてください。 習う段階で、余計な理屈で考えたら、ダメだということです。 >今はすごく初歩の段階で式の意味を理解するのに精いっぱいです。 そのプロセスは間違っています。 すべてを理解しようとしないことです。分からないから、すぐに質問するというのは、プログラミングを学ぶ上では、効率が悪いのです。とにかく、分からなくても真似る、そして先に進むというのが原則です。VBAの上級文法まで終えて、初めて入門が終わります。 それから、さかのぼって、もう一度試してみると分かりやすいし、それで分からなかったら、掲示板で質問しても良いです。できれば、敷居は高いのですが、VBAの専門サイトで聞いたほうがよいです。長期に教えてくれる人がいるということです。単発の回答だけという人は少ないからです。 最初の数ヶ月は、見よう見まねしかありません。私が教えた中で、勘のよい人は、1~2ヶ月でほぼVBAをマスターしてしまいましたが、それは特例です。何百人に1人です。標準的な人で、1年掛かります。遅い人は、3年も掛かるか、その前に途中で挫折するかどちらかです。 だいたい、コードは、500件を書いて、基礎段階が終わります。ただし、その都度、知らない物事に取り組むという気持ちがなければダメです。同じパターンを繰り返しているのでは、いつまでも上達しません。そうして、2,000件ぐらいを書いたら実務に耐えられるようになります。 プログラミングを知っているか知っていないかは別として、上達の早い人は、理路整然と、理にかなった文章や考え方をしています。 掲示板は玉石混交で、下手くそなコードもあれば、ベテランさんのコードもありますが、両方とも理解に苦しむはずです。片方は、基本を守らないし、片方は、そのテクニックの根拠が見えてこないからです。書籍でも、奇妙なコードや解説もあります。 例えば、みなさんには定評がある「Office TANAKA」の田中亨氏は、少なくとも、Microsoft のテキストは読んでいないということが分かります。テクニックに、はしり、疑問に感ずる所が多いです。また、井川はるき氏や武藤玄氏は、本が出ているか分かりませんが、マイクロソフト側の書法に従っているので、安心してコードを読めます。ただし、初心者にはさっぱり理解できない部分があります。また、この人たちのコードは、VBA独特ですから、どっぷりとハマるのは、良し悪しだと思います。理由は、他言語に移行しにくくなるからです。 以下の書籍でダメだったら、自分は向いていないと諦めても良いと思います。 『かんたんプログラミング Excel 20?? VBA 基礎編』(??バージョン) 大村あつし (著) http://www.amazon.co.jp/exec/obidos/ASIN/4774148695 なるべく、自分の持っているExcelバージョンと合わせたほうがよいです。このシリーズ3巻で、だいたい、3ヶ月で一回は終わらせてください。しかし、出来なくても恥ずかしいことではありません。 変数というものは、VBA/VBの書法としての決まりはあります。変数の"i"は、Visual Basic 言語を考えたある天才が、こんな風にしたらいいと、それをマイクロソフトが発表したことで、それを踏襲することが多いのです。現在のVBAのスタイルが固まったのは、Excel98時代です。マイクロソフトが出した『プログラマーズガイド』(非売品)が、参考書であり教科書です。(ネット内のMSDNは、そのダイジェストですが、Office 2000で、プロ用です。) ついでなのですが、今は、テクニック集はあっても、上級レベルの教科書的なものがないような気がします。本来は、VBAが終わったら、VB6用のテキストを一度読む必要がありますが、それはもう手に入れにくいのです。VB6のRuntimeの説明は、VBA上では出てこないようだからです。少なくとも私は、VB6以外では見たことがありません。今、マイクロソフトが過去の遺産(レジェンド)を払拭し始めています。ここの掲示板で、回答者の一部では、VBAのアルゴリズムと言ったら何かということさえも、わからなくなっているようです。 >iの代わりにaなど違うものを入れると認識しないのでしょうか? ご質問の変数が、"a" であろうが、 "i"であろうが、構いません。ただ、"i"が見やすいです。ご質問のような文章でなく、文章を論理建てて書く訓練が必要かもしれません。私は、練習にフローチャートを書きました。 ただし、私は、変数を決めるのは、頭の中からという言い方はしません。それは、慣習的にですが、C言語でもそうしているということです。 また、"i" は、添字ではありません。プログラミングでは、一般的に、添字というのは、配列変数という中のデータの順序の数字のことです。for i =初期値 to 終了値の「i」は「インクリメント(増加)」ですから、それで、"i" のイニシャルが使われるようになりました。もちろん、減っていく場合は、「デクリメント」ですが、その変数の特定の呼び名を、「カウンター変数」と呼びます。だからといって、"c" は使いません。VBAのインストラクターとしては常識ですが、一般の人には重要なことではありません。 「インクリメント」には、i, j, k を使うというのが、コーディング・ルールとしてあります。見栄えがよいし、また、小文字を使うというのが原則です。ただし、コードは、すべて小文字というのは、見栄えが悪いし、コーディング・ルールとしては反則です。VBAは、大文字・小文字が関係ないようですが、大小まぜて書くのが書法のひとつです。大文字・小文字の使い方の原則はあります。ただ、それは、VBAの範囲内だけなら、それほど大事ではありませんが、オートメーション・オブジェクトなど外部オブジェクトを使った場合のVBAコードでは、エラーを起こしたり、きちんと動かないことがあります。 ちなみに、"a" は、文字(string型)の変数に使われることが多いですが、"s" もあります。理由は、abc のa というのと、string の s からです。なぜ、文字がstring(=紐)なのかは知りません。プレフィックスといって、lng やstr を変数の前に付けて使う方法は、今は、廃れてしまいました。それは、VB.Net などの登場で、移行しにくくなるからです。 VBAやVBには、プログラミング上で「予約語」などと呼べるものは、ほとんどありません。常識的に、Optional や Sub, Declare など、プログラムの構造に関わるのものを「予約語」と言いますが、それらの「予約語」を使えば、VBの範囲なら、メッセージが出ます。初心者の場合は、気にする必要はありません。 むしろ、入門編には、変数の宣言すら必要ありません。Option Explicit で、変数を入れることを強要するのは、入門編では間違いだと思います。なぜ、それが必要かという意味は、簡単ではありません。習う場合には、段階というものがあります。なぜ、必要か、ヴァリアント型ではなぜいけないか、実例を持って言える人は少ないはずです。それを説明した所で、ありきたりの変数のメモリのセーブというのは、16bit から、32bitへ、そして64bitに変わるにつれ、怪しくなってきてしまいました。VBA用のメモリが一杯になるのは、別の理由がほとんどです。 なお変数に、漢字や2バイト文字は辞めておいたほうがよいというのは、数多くの中で、トラブルを起こすものがあるという理由だそうです。しかし、起こす割合は、何千分の1の確率です。私は、良く知りません。変数名やプロシージャ名は、英語を使うという決まりもありますが、それは入門者には問わないことにします。 例:× Sub Zaiko, ◯ Sub Inventory (正式の一般のコーディング・ルールとしては、ローマ字はダメだと言われます。) http://msdn.microsoft.com/ja-jp/library/h63fsef3.aspx http://msdn.microsoft.com/ja-jp/library/aa291593.aspx 『VB.NETルールブック --読みやすく効率的なコードの原則』技評社 http://www.amazon.co.jp/exec/obidos/ASIN/4774145009 エクスメディアの本は絶版 VB.Net と、VBAでは、違う部分も多いので読み替える必要があります。
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
まず必要となる基礎情報については、皆さんが回答されているとおりです。 長文になってしまいますが、加えて、質問者さんが幾つか投げかけている疑問に一問一答式で答える形で、補足します。主に、変数や代入という操作についての話です。 >特にFor i = 1 to 10という式ですが、繰り返しの式になると思います。 式というか、その文(ステートメント)は、おっしゃるとおり、変数の値を変化させながらの、繰り返しの処理を行います。コード中、For から Next の間を何度も行ったり来たりするので、ループとも言います。ただしループの構文は、For ... Next の他にも幾つか用意されています。 >このiというのはどこからでてきたのかがさっぱりわからないのですが。。。 既出の回答にもありますが、制約はありながらもその範疇においては、自由に変数を設置できます。2 文字以上の変数にすることもできます。 例えて言えば、数学で、方程式を立てて解くために何かの量を x と置こうが他の文字を使おうが、解く上では何でも構わない、何も変わらないのと同じことです。 つまり、「どこから」と問われれば、あえて言うならプログラマの頭の中、趣味から、となります。 ただ For 文において i という文字が使われることが多いのは、単にそういう慣習だということです。全体のコードが正しい文法で記述されている限り、他の文字(列)で書き換えても大丈夫です。 再び数学で、よく行列 A の i 行 j 列の成分が aij(i、j は下付き文字)と書かれることとの関連性にも注意するとよいでしょう。行列の成分が縦横に長方形の形で並んでいる姿は、ワークシート上のセル範囲とそっくりですね。 >なぜiの代わりにaなど違うものを入れると認識しないのでしょうか? 上の説明どおり i を選ぶかどうかは自由なのだから、a に書き換えても、マクロはちゃんと動きます。 i で動いていたのに a では動かなくなったのだとしたら、コード中のどこかに誤りがあるからです。例えば変数の宣言を強制する設定(Option Explicit)にしていて、i は宣言されているが、a はされていないとか。あるいは i や a がコード中の他の箇所にも登場しているのに、その部分も併せて修正しなかったため、全体としては矛盾が生じたとか。 質問者さんからコードが示されていない以上、原因についてズバリな指摘はできないので、こんなところです。 >……ときに, cells(i, 3)とありなぜ cells(1, 3)ではだめなのかと…… たぶん誰も、ダメとは言っていないと思いますよ。回答 No.1、No.2 のとおりです。 10 回くらい繰り返すのであれば For を使うが、2 回しか繰り返さないつもりなので、イチイチ変数を作ったりはせず、Cells(1, 3) などと具体的な値を使って 2 行に分けて書くというのも、何の問題もない判断だと思います。 >さらに、iだけでなく、for j というのも出てきました。これらはただ単に仮で付与しているものなのでしょうか? ●変数はその中に値を代入できますが、同じ変数に何回も代入する場合は、最後に代入した値が End Sub の実行時まで(*)保存されています。 ● i と j は異なる変数なので、基本的には、独立に振る舞います。 *キーワード Static により宣言した変数(静的変数)を除きます。 Cells(i, i) と書いたとすると、それは行番号と列番号が等しいセルを表します。行列番号の間にそういった関係はなく、どんなセルをも処理の対象としたいのであれば、Cells(i, j) というふうに、異なる変数を用いる必要があります。 つまり行番号ゆえに何の文字を、列番号ゆえに何の文字を書くべきだ、という意味ではありません。値が同じなのか、異なるのかという問題です。 変数を 2 種類にするのであれば、For も 2 つにして、コードの一部(For のブロック)を入れ子の構造にする必要が出てくることもあるでしょう。 ところで VBA の仕様では、Next i を単に Next というふうに、省略形で書くことも許されています。しかし複雑なコードではたくさん Next が出てきて、どれの Next だか分かりづらくなるので、省略しないことが望ましいと言われています。 また、a と b に異なる値が代入されているとすれば、Cells(a, 3) と Cells(b, 3) というセルを区別することができますね。たまたま a と b の値が等しい瞬間には、結果的に同じセルを表すことになりますが。 a = 3 b = a a = -1 MsgBox b MsgBox a こんなコードがあったとすると、メッセージボックスで、b と a に代入されている値が画面に表示されますね。このとき、表示される値は、幾つと幾つになるのでしょうか? 5 行のうち上から 3 行はいずれも、数学で出てくる等式ではありません。代入の文です。等号の右の値を左の変数に代入するという意味です。 だから途中で b = a と書いてあっても、2 変数がいつも同じ値であるという意味にはなりません。この行を実行した瞬間は代入の直後なので同じ値ですが、その後もずっと等しいままとは限りません。上の●のとおり、最後に代入した値が変数に残っているので、4 行目では 3 が、5 行目では -1 がそれぞれ表示されます。 変数 a に新しい値を代入すると前の値は失われてしまうから、その前に、b に移し入れて保存していることになります。 For i = 1 To 10 Next i MsgBox i このコードでは、i が 1、2、…、10 であるときに毎回 Next i の行が実行されることによって、最終的に i は 11 という値になります。メッセージボックスでも 11 が表示されます。 他にも、基本的で重要な代入の技があります。次のコードは、どうなっているでしょうか。 For i = 997 To 999 n = n + 1 Next i MsgBox i MsgBox n 前の説明と同様に、4 行目では 1000 が表示されます。 2 行目は、ある瞬間の n + 1 を n に代入しています。この 5 行の前に n は登場していなかったとすれば、5 行に差しかかる時点ではまだ n に何も代入していない状態であるわけですが、そのとき数値型の変数 n の初期値は、0 になっています。次に 2 行目の代入を実行すると、n に 0 + 1、つまり 1 を代入することになりますね。n が 1 のときなら、n に 2 を代入することになる。つまり 2 行目は、整数の連続データを得る操作であり、カウントという言い方をすることもあります。 本来 i と n は独立していますが、上のコードでは、i が 1 増えるたびに必ずカウントしているので、結果的に i と n がずっと相関している形になっていますね。 ちょっとでも考え方を分かっていただけたでしょうか?用語がいろいろ出てきて難しいかもしれませんが、逆にそれを覚えてしまうと、理解が進むかもしれませんね。
補足
ご丁寧なご説明大変ありがとうございます。 初心者の私としてはすごく勉強になります。 ただ少し混乱気味なのでもう一度確認させてください。 たとえば、.Cells(i,3)を例にとってみると、私はVBAの本でcells(行、列)と習いました。なので、Cells(i,3)の場合もCells(i = 行、3 = 列)と認識しています。 そしてもしこの場合の認識が正しければ、回答者さんが仰ったように、iの意味は特定の値ではない。つまり何行目という特定はされていない。もし、for i = 1 to 10と設定されていたら1行目から10行目までの範囲で、1行目かもしれないし、10行目かもしれない。この認識であっていますでしょうか? j = 列の場合も同じことです。 次に a = 3 b = a a = -1 MsgBox b MsgBox a について質問です。 代入の理解はわかりました。しかしなぜmsgbox bの項目が必要なのかわかりません。結果マクロをかけると、Bのメッセージボックスは表示されないにもかかわらず、この項目を作る意味は何でしょうか? そして、 For i = 997 To 999 n = n + 1 Next i MsgBox i MsgBox n についてですが、これをマクロで書くと、1000というボックスとなぜか3というボックスが表れてきます。997から999までの数字をiに代入するということだと思いますが、なぜ997から999は何も表示せず、1000なのでしょうか? N + 1がどこで処理されているのかいまいち理解できません。そして3が最も謎なんです。 次いでといったら大変失礼なのですが、これは質問事項にないので、お気を悪くしたら違う質問で質問しますので無視してください。 プロシージャーを最初に書くときDim sheet as Worksheetと結構書かれています。そのあとにset sheet = thisworkbook.worksheets("Sheet1")と続きます。私が思うにこのsetからの文だけでいいような気がしますがworksheetと最初に宣言する必要はあるのでしょうか?また宣言後、setと二つ書かなければいけないのでしょうか? 最後に、もし超初心者でもVBAを理解しやすい本などお勧めありましたらお願いします。Excel VBAのe-本を読んでいるのですが、簡単に書かれすぎているのか、私が知りたいところが抜けている気がします。 長くなってしまいましたが、ご回答のほう宜しくお願い致します。
- 374649
- ベストアンサー率38% (203/527)
>For i = 1 to 10 でcells(i, 3)なら「i」の値が1から10に順番に代入されます、「=」は右側の値を左側の「i」に代入する演算子になりますがExcelでは定義が曖昧でイコールでも使われます、cells(1, 3) では固定されたセルの番地になります、1の代わりにiにすればcells(i, 3)で10個のセルを参照できます。 変数名は自分で適当に付けますが(予約語は不可)判りやすい(誰が見ても判断し易い習慣のようなものもあります)プログラムの中で経過とともに値が代入され変化するので混乱しないように区別して名前を付ける必要があります。 これから勉強していくと変数の定義、データ型など沢山学びます、変数には動的変数(一時的に値を入れて終わると消える)清的変数(変数の値が後まで残る)などいろいろあります。 i,jとは同じものでは区別しないと判らなくなるので別に付けているだけです、同じ変数名でもできますがあとで区別がつかなくなります(混乱して判別できなくなる恐れがある)。 プログラムを書くときは変数名だけでなく誰が見ても判りやすく書くことが必要です、これからも沢山勉強して良いプログラムを書いてください。
お礼
回答ありがとうございます。大変助かりました。まだまだわからないことが多く諦めそうですが、頑張ります
- bin-chan
- ベストアンサー率33% (1403/4213)
その i は「添字(そえじ)」と言います。 iを用いるのが必須ということではありません。 その昔のFORTRAN言語等で、整数(Integer)のiを用いたから。 i、j、kと書くことが多いけど、「n添字」って書いてもOK。 For n添字 = 1 to 10 Range(”A1”).Offset(n添字.1) = ”添字は” & n添字 Next n添字 見たいな。 > cells(i, 3)とありなぜ cells(1, 3)ではだめなのか 必ずしもダメとは言えない。使い方です。 繰り返しを並べて見渡したら、「ここだけが変化する」ところを 変数に置きかえて、その値を変化させることで 何度も処理することを簡単にしていくのです。 各モジュールの先頭で、Option Explicitを宣言する習慣を付けることを薦めます
お礼
ご回答ありがとうございます。添え字とは初めて聞きました。大変勉強になりました。
- keithin
- ベストアンサー率66% (5278/7941)
変数は、プログラマが「自分の頭で考えて決めて」使うものです。 エクセル(オフィス)のマクロでは、プログラムを動かすという事だけで言えば、iだのjだのについてこーでなければいけないという決め事はありません。勿論iが縦でjが横だとか、そんな決まり事も一切ありません。 #ただしマクロにはマクロ側で「予約語」として決められている言葉があるので、それは変数としては利用してはいけません。 #また「上手な(高等な、と思ってる人もいるようです)プログラム」では、また違った観点からの縛りをかける場合もあります。 >しかしなぜiの代わりにaなど違うものを入れると認識しないのでしょうか? 回答したマクロにはaとか勿論使ってませんが。 回答済みマクロの再掲: sub macro1() dim i as long ’変数の宣言 ←これが重要 for i = 1 to 10 ’変数を利用して繰り返しの開始 cells(i, "A") = i ’セルに書き込み next i ’繰り返しここまで end sub iじゃなくaを使ってみる: sub macro1rev1() dim a as long ’変数の宣言 ←これが重要 for a = 1 to 10 ’変数を利用して繰り返しの開始 cells(a, "A") = a ’セルに書き込み next a ’繰り返しここまで end sub 2つのマクロを実際に(アタマで考えて判った気になるんじゃなくて)手を動かしてエクセルに組み込んで、しっかり動作を確認してみて下さい。 そのうえであなたが考えた(ナイショの=質問になってない)マクロでは、「認識しないa」とは「具体的にどんなマクロ」を書いたのか、それは回答したrev1マクロとどこが違ってて、どこが間違えているのか、もう一度よく見比べて今度はご自分で理解してください。
- keithin
- ベストアンサー率66% (5278/7941)
>これらはただ単に仮で付与しているものなのでしょうか? その通りです。 それらのiやjのように、プログラムの中で一時的に仮に(=プログラムが終わったら消えて無くなってしまう)置いたモノを「変数」と言います。 何を見て勉強しているのか知りませんが、上手なお手本は必ず次のように作成されています。 sub macro1() dim i as long ’変数の宣言 ←これが重要 for i = 1 to 10 ’変数を利用して繰り返しの開始 cells(i, "A") = i ’セルに書き込み next i ’繰り返しここまで end sub 変数を利用する事で、cells(1, "A")つまりA1セルから始まってcells(10, "A")つまりA10セルまで、合計10個の「異なるセル」に、1から10までの「異なる値」を、「繰り返しマクロで」記入させています。 これは sub macro2() cells(1, 1) = 1 cells(2, 1) = 2 cells(3, 1) = 3 : cells(10, 1) = 10 end sub と書いても、同じ結果(A1からA10に1から10を記入する)を得られます。 でも、どっちのマクロが合理的かは、もちろん一目瞭然ですね。
補足
丁寧な解説ありがとうございます。しかしなぜiの代わりにaなど違うものを入れると認識しないのでしょうか?VBA自体、行の変数はiで列の変数はjと認識されているのでしょうか?
- denbee
- ベストアンサー率28% (192/671)
iとは変数で、中身が変化する値を扱うときに使うものです。 変数名は自由に設定できますが、慣習的にiとかjとかkが使われます。 例えば、セルの1行目から5行目に順番に値を設定するとき、一番単純な方法は cells(1,a)="A" cells(2,a)="A" cells(3,a)="A" cells(4,a)="A" cells(5,a)="A" と書くことです。しかし、この方法は扱う行の数が増えた場合(例えば1000行)に設定する場合には 1000行も書かなくてはいけません。 そこで for i=1 to 5 cells(i,a)="A" next とすると、最初に書いたコードと同じことができます。 1000行書こうと思えば、「for i=1 to 5」を「for i=1 to 1000」とするだけで済みます。 他にも色々と利点があるのですが、この先勉強をしていけば自然とわかりますので、 ここでの回答はこれだけにしておきます。
お礼
ありがとうございます。全部回答していただいて感謝です! まだまだわからないことが多くその際はネットなどで毎回検索して理解を深めようと思います。どうしても式の意味が分からないと自分の中で気持ちわるく、ただこの公式みたいなのを意味もわからず覚えられないということもあります。少しずつですね。 ありがとうございました。