• ベストアンサー

VBAの初歩中の初歩

すみません。VBAの勉強を始めたばかりで質問させてください。 今はすごく初歩の段階で式の意味を理解するのに精いっぱいです。 特にFor i = 1 to 10という式ですが、繰り返しの式になると思います。 このiというのはどこからでてきたのかがさっぱりわからないのですが。。。 他にもセルの範囲を指定するときに, cells(i, 3)とありなぜ cells(1, 3)ではだめなのかとそこで躓いてしまします。 さらに、iだけでなく、for j というのも出てきました。 これらはただ単に仮で付与しているものなのでしょうか? どなたか教えてください。

  • suns
  • お礼率22% (211/936)

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

  • ベストアンサー
回答No.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-本を読んでいるのですが、簡単に書かれすぎているのか、私が知りたいところが抜けている気がします。 よく知りませんが、あらゆる情報が載っている本というのは、あまりなさそうですね。内容の水準も様々でしょうし。 本も良いとは思うのですが、まずはヘルプをたくさん見てください。あとはインターネットでの検索でも、それなりに詳しいサイトはたくさんあります。 とりあえず私程度のスキルでも構わないという方の場合は、職業プログラマのように書籍で本格的に勉強するという必要はないかもしれません。ただどんな方法にせよ、様々な事例に対応できるようになるまでには、時間はかかると思っていたほうがよいでしょう。

suns
質問者

お礼

ありがとうございます。全部回答していただいて感謝です! まだまだわからないことが多くその際はネットなどで毎回検索して理解を深めようと思います。どうしても式の意味が分からないと自分の中で気持ちわるく、ただこの公式みたいなのを意味もわからず覚えられないということもあります。少しずつですね。 ありがとうございました。

その他の回答 (7)

回答No.7

長文で、つまらないと思うなら、無視して構いません。 少し、前回の質問から見ていましたが、質問者さんにとって、分かりにくいものもあるだろうなって思いましたが、まず、書籍を買って、順序良く、そこに出てくるコードを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では、違う部分も多いので読み替える必要があります。

回答No.6

まず必要となる基礎情報については、皆さんが回答されているとおりです。 長文になってしまいますが、加えて、質問者さんが幾つか投げかけている疑問に一問一答式で答える形で、補足します。主に、変数や代入という操作についての話です。 >特に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 がずっと相関している形になっていますね。 ちょっとでも考え方を分かっていただけたでしょうか?用語がいろいろ出てきて難しいかもしれませんが、逆にそれを覚えてしまうと、理解が進むかもしれませんね。

suns
質問者

補足

ご丁寧なご説明大変ありがとうございます。 初心者の私としてはすごく勉強になります。 ただ少し混乱気味なのでもう一度確認させてください。 たとえば、.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)
回答No.5

>For i = 1 to 10 でcells(i, 3)なら「i」の値が1から10に順番に代入されます、「=」は右側の値を左側の「i」に代入する演算子になりますがExcelでは定義が曖昧でイコールでも使われます、cells(1, 3) では固定されたセルの番地になります、1の代わりにiにすればcells(i, 3)で10個のセルを参照できます。 変数名は自分で適当に付けますが(予約語は不可)判りやすい(誰が見ても判断し易い習慣のようなものもあります)プログラムの中で経過とともに値が代入され変化するので混乱しないように区別して名前を付ける必要があります。 これから勉強していくと変数の定義、データ型など沢山学びます、変数には動的変数(一時的に値を入れて終わると消える)清的変数(変数の値が後まで残る)などいろいろあります。 i,jとは同じものでは区別しないと判らなくなるので別に付けているだけです、同じ変数名でもできますがあとで区別がつかなくなります(混乱して判別できなくなる恐れがある)。 プログラムを書くときは変数名だけでなく誰が見ても判りやすく書くことが必要です、これからも沢山勉強して良いプログラムを書いてください。

suns
質問者

お礼

回答ありがとうございます。大変助かりました。まだまだわからないことが多く諦めそうですが、頑張ります

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.4

その 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を宣言する習慣を付けることを薦めます

suns
質問者

お礼

ご回答ありがとうございます。添え字とは初めて聞きました。大変勉強になりました。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

変数は、プログラマが「自分の頭で考えて決めて」使うものです。 エクセル(オフィス)のマクロでは、プログラムを動かすという事だけで言えば、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/7940)
回答No.2

>これらはただ単に仮で付与しているものなのでしょうか? その通りです。 それらの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を記入する)を得られます。 でも、どっちのマクロが合理的かは、もちろん一目瞭然ですね。

suns
質問者

補足

丁寧な解説ありがとうございます。しかしなぜiの代わりにaなど違うものを入れると認識しないのでしょうか?VBA自体、行の変数はiで列の変数はjと認識されているのでしょうか?

  • denbee
  • ベストアンサー率28% (192/671)
回答No.1

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」とするだけで済みます。 他にも色々と利点があるのですが、この先勉強をしていけば自然とわかりますので、 ここでの回答はこれだけにしておきます。

関連するQ&A

  • VBA For~Next 

    「wsData」の値を「wsInv」の指定セル(=●●●=16)から4つおきに処理したい。 01:Cells(16 + i * 4, 1) とすると「i」が大きいときに   「""」があると16からスタートしない 02:「For k = 0 To 50」を作成したが、何処に入れても上手く処理出来ない。 For i = 0 To 50 '行 For j = 6 To 28 '列 If wsData.Cells(10 + i, 3).Value = "" Then wsInv.Cells(●●●, 1).Value = wsData.Cells(10 + i, 1).Value wsInv.Cells(●●●, j - 2).Value = wsData.Cells(10 + i, 23 + j).Value End If Next j Next i お力添えをお願いいたします。

  • VBAで実行時エラー'13': がでます

    初歩の初歩ですいません。 VBAで Dim A As Integer Dim B As Integer Dim C As Integer Dim gokei As Integer For i = 8 To 70 A = Cells(i, 4).Value B = Cells(i, 5).Value C = Cells(i, 6).Value goukei = A + B + C Cells(i, 7) = goukei Next i としていますが A = Cells(i, 4).Value のところで今使っているシートだと止まってしまいます。 新規でワークシートを使って仮に数字を代入すると普通に動きます。 今使っているシートもセル内には =100 と入力して 100 と表示され セルの書式設定も数値になってるんですがどうしてでしょうか?

  • VBAでランダムな並び替えをするには

    エクセルのシート1行目に1~40の数字を連番で記入し、3行目に左のセルから順番にランダムに並べるマクロを以下のように書きましたが、動きません。どこが違っているのでしょうか、ご指導いただけますか。 1  2  3   4  5 ・・・・40 ↓  ↓  ↓  ↓  ↓ 21 35 33 14 20 ・・・・ 以下マクロ '1から40までの数を一列に並べる。 for i=1 to 40 cells(1,i)=i:cells(3,i)="" next i for i=1 To 40 msgbox(40-i+1&"枚から1枚選びます") '1から40までの数をランダムに1つ発生させる。    x=int(rnd()*40)) +1 cells(3,1)=cells(1,x) for j=x+1 to 40 cells(1,j-1)=cells(1,j) next j cells(1-j,x)="" msgbox("確認して下さい") cells(3,1)=cells(6,4) cells(6,4)="" x=int(rnd()*39) +1    cells(3,2)=cells(1,x)     next i  

  • エクセルVBA:ある有名な方のサイトで・・・

    VBA初心者です。よろしくお願いします。 いま、VBAを勉強しています。 有名なT氏のエクセルVBAに関するサイト(オフィスT・・)の、「高速化テクニック」のところで、下記、★ ★ ★以下のような例がありました。 「Cells(j, 1).Font.FontStyle = "太字"」 が目的の作業であるならば、 「Dim i As Integer」「For i = 1 To 100」を何のために宣言し、記述しているのでしょうか?「j」の変数の宣言は「Cells(j, 1).・・・」で理解できますが、「i」の宣言また、「For i = 1 To 100」は不要のように思われるのです。 最初は何かの間違いかと思っていましたが、同氏の他の解説にも同様の記述がありましたので、きっと、意味があるのですね。教えてください。 ★ ★ ★ Sub Test2() Dim i As Integer, j As Integer For i = 1 To 100 For j = 1 To 10 Cells(j, 1).Font.FontStyle = "太字" Next j Next i End Sub

  • Exel VBAで1つずつ代入するには?

    VBA初心者です。 日報を入力する作業を、Exel VBAを使って省力化したいと考えています。 1日が1シート、1か月分で1ブックになっています。 いったん別シートにべた打ちしたデータを、VBAで1つずつ各日のシートに貼り付けたいのです。 1枚目のシートのB列のセルB2~B32(1日~31日分に相当)に数値が入っているとして、 これを格納し、 シート「1日」セルF2、シート「2日」セルF2...シート「31日」セルF2 という具合に各シートの同じセル番地のセルに1つずつ貼り付けていくイメージです。 こんなふうに書いてみました。 ---------------------------------------- Sub test() Dim myNum(30) As Integer Dim i As Integer Dim j As Integer For i = 1 To 30 myNum(i) = Worksheets(1).Cells(i + 1, 2) For j = 1 To 30 Worksheets(i + 1).Cells(2, 6) = myNum(i) Next j Next i End Sub ---------------------------------------- でも、これでは1か月の日数の違いに対応できません。 これ以上はお手上げなので、お知恵を貸してください。 よろしくお願いします。

  • エクセルVBAの配列について

    エクセルVBAの配列について VBAをはじめたばかりの初心者です。 現在、下記のようにデータを配列の中に入れ、 別シートに書き出そうとしております。 (配列へ読み込むところのみ) Dim 配列(1 To 件数, 1 To 9) As Variant For j =1 To 件数 For i = 2 To L If Cells(i, 2).Value = Tx_month Then For k = 3 To 11 配列(j, k - 2) = Cells(i, k).Value Next k End If Next j,i 現状では、データの最終行のみを「件数」分書き出してしまいます。 jとiのForが重なっているからだと思うのですが、どう書き直したら良いか分かりません。 質問をさせていただくのも初めてなので、分かりづらく恐縮ですが お力添え頂けますと幸いです。 どうぞ宜しくお願い致します。

  • VBAのプログラムでうまく動かなくて困っています。

    VBA初心者です。 エクセルのVBAのプログラムでうまく動かなくて困っています。教えていただける方がいらしたら、ぜひ教えて下さい!よろしくお願いします。エクセルの内容は以下のとおりです。 (内容) セル    E H J L N P R・・・ 8行目100 200 50 40 30 80 9行目130 350 10 50 60 120 110 ・ ・ (1)列Hの値が列Eの値より大きい場合その下に行を追加します。 (2)セルJ+セルL+セルN+・・をしてセルEの値を超えたセル以降の値を追加した行のセルJ列から順にコピペする処理です。 上のセルの1行目の内容でいいますと、 (1)列Hの値「200」が列Eの値「100」より大きいのでその下に行追加 (2)セルJ、L、N「50」+「40」+「30」でセルEの値「100」より大きいので、追加した行のセルJ列にセルN、Pの値をコピペするです。 以下が私が書いたプログラムです。 Sub test() Dim x As Integer Dim s As Integer Dim t As Integer x = Range("B8").End(xlDown).Row r = Range("J8").End(xlToRight).Column '8行目から最終行までループ For i = x To 9 Step -1 If Cells(i, 5) < Cells(i, 8) Then ☆【For r = y To 11 Step -2 Cells(s, t).Value = Cells(i, r) + Cells(i, r + 2) If Cells(i, 5).Value < Cells(s, t).Value            Then Exit For Next】 Rows(i + 1).Insert Shift:=xlDown '超えたセルをコピーして、1行下の"J列以降"に代入 ★ x = x + 1 End If Next i End Sub 上記プログラムで★の部分がうまく書けません。☆の部分も間違っているような気がします。よろしくお願いします。

  • EXCEL VBA2010 MsgBox

    Sub 重複() Dim i As Long, j As Long For i = 6 To 500 For j = 3 To 3 If WorksheetFunction.CountIf(Range("C6:C500"), Cells(i, j)) > 1 Then Cells(i, j).Interior.ColorIndex = 6 End If Next j Next i End Sub このVBAに重複が何件ありますよというメッセージを出したいです。 MsgBoxの入れ方を教えてください。

  • VBAで

    VBAで Sub test() '日付から曜日を取得 WEEKDAY(A2) Dim i As Integer For i = 3 To 20 Cells(i, 2) = Weekday(Cells(i, 1)) Next End Sub 横のセルを参照する場合は、上記のようになると思いますが、上のセルを参照するにはどのようにすればいいでしょうか? 例えばA1~T1セルを参照して、A2~T2に反映させると言った具合です。よろしくお願いします。

  • EXCEL VBAのFor...Nextについて

    VBA初心者です。よく理解していませんので、質問も的を得ていないかもしれませんが、ご指導宜しくお願いいたします。  現在、For...Nextを使った表計算をしています。 A列に「す」という文字が含まれていたら、B列の「す」の行に「あ」と「い」と「え」「か」のセルの合計をだす。C列、D列・・・最終列まで計算する。 上記VBAを作成する方法を教えて下さい。 A  B  C  D  E   F  G  H  I  J  K  L 1 2    3    4   5    6    7    8    9    10    11 12 あ  1 2 3 4   5 6 7 8 9 10 11 い 10 20 30 40  50 60 70 80 90 100 110 う 20 30 40 50   60 70 80 90 100 110 120 え 40 50   60  70 80 90  10 20 120 130 30 お 50 60   70  80 90 10  20 30 130 140 40 か 60 70   80  90 10 20  30 40 140 150 50 す 私は表に1~12まで数字をインプットし下記のようなコードを考えました。 Sub 列合計() Dim i, k, l, m, n As Long j = 2 For i = 6 To 120 For k = 6 To 120 For l = 6 To 120 For m = 6 To 120 For n = 6 To 120 If Cells(i, 1) = "す" And Cells(k, 1) = "あ" And Cells(l, 1) = "い" And Cells(m, 1) = "え" And Cells(n, 1) = "か" Then Do While j <= Range("A2").End(xlToRight) Cells(i, j) = Cells(k, j) + Cells(l, j) + Cells(m, j) + Cells(n, j) j = j + 1 Loop Else: End If Next n Next m Next l Next k Next i End Sub この内容だとエラーが出てしまいます。 補足ですが、あいうえおかの順番はかわったり、間に他の行が入ったりします。 また今回はL列の間としましたが、もっと列が増え、最終列まで計算する方法を知りたいのですが、どうぞ宜しくお願い致します。 ※ofice2013です。

専門家に質問してみよう