質問: excel マクロ・vba 自動で連番を振る excelのマクロ・vbaについて質問です。 例えば、b列にデータを入力すると、入力した行まで自動的にa列に連番が入力されるようにしたいのですが、どういった方法があるでしょうか。 マクロやvbaについてはこれから勉強をしようと思っている素人ですので、コードとその解説をいただけると助かります。
回答: 次に、for each~in~nextに関して説明します。 for each~in~nextも繰り返し処理を行うという点ではfor~to~nextと共通していますが、for~to~nextがforの次の所で指定されている変数の値を一定の刻み幅で増減して行き、toの次の所で指定している値を最大値とする事で繰り返しの回数を定めているのに対し、for each~in~nextの場合は変数の値によるのではなく、inの次の所で指定している「オブジェクトのコレクション」や「配列」の中に含まれている全ての要素に対して順番に同様の処理を繰り返すというものです。(for eachの次の所で変数こそ使用されてはいるものの、その使用されている変数が、値を格納するための変数ではなく、オブジェクトを格納するための変数である事に注意) 尤も、こんな説明の仕方ではおそらく解らないのではないかと思います。 色々なパターンがあるので説明がし難いのですが、「オブジェクトのコレクション」とは「一纏めのグループにした、同種のオブジェクト (要素)の集まり」といったところでしょうか。 【参考url】 vbaシステム開発 > 1. vbaの世界 > 第2章 > 2.2 コレクション  https://sites.google.com/site/compositiosystemae/home/vbaworld/primitive/collection インストラクターのネタ帳 > エクセルマクロ・excel vbaの使い方 > vbaのコレクションとは http://www.relief.jp/itnote/archives/excel-vba-what-is-collection.php ますます解らなくなったのではないかと思いますので具体例を挙げますと、ワークシートはその1枚1枚がワークシートオブジェクトという同種のオブジェクトなのですから、1つのworkbook内に存在している全てのワークシートを1つにまとめたものは「ワークシートオブジェクトという要素からなる1つのコレクション(集まり)」と見做す事が出来ます。 例えば、book1というワークブックにsheet1、sheet2、sheet3という3枚のシートがあり、そのbook1内に次の様なvbaのマクロを設定しますと、「シート名をそのシートのa1セルに書き込む」という同じ処理をsheet1、sheet2、sheet3の各シートに対して順番に行うというマクロになります。 sub macro() dim mysheet as worksheet for each mysheet in worksheets mysheet.range("a1").value = mysheet.name next mysheet end sub 又、オートシェイプ図形はその1つ1つがshapesオブジェクトという同種のオブジェクトなのですから、1枚のワークシート上に存在している全てのオートシェイプ図形を1つにまとめたものは「shapesオブジェクトという要素からなる1つのコレクション(集まり)」と見做す事が出来ます。 例えば、sheet1というワークシート上に複数のオートシェイプ図形がある場合、次の様なvbaのマクロを設定しますと、「sheet1上に存在する全てのオートシェイプ図形」に対して、図形を1つずつ順番に削除して行き、sheet1上に図形が無くなるまで同じ処理を繰り返すというマクロになります。 sub macro() dim myshape as shape for each myshapes in sheets("sheet1").shapes myshapes.delete next myshapes end sub 又、ある任意のセル範囲の中に含まれているセルの1つ1つは、1個のセルそのものがrangeオブジェクトという同種のオブジェクトと見做す事が出来ますから、1つのセル範囲は「rangeオブジェクトであるセルという要素からなる1つのコレクション(集まり)」と見做す事が出来ます。 例えば次の様なvbaのマクロを設定しますと、「b2:b8というセル範囲に含まれている全てのセルに『abc』という文字列データ入力する」というマクロになります。 sub macro() dim c as range for each c in range("b2:b8") c.value = "abc" next c end sub この場合、変数cは「その繰り返し処理の中でその時処理を行う対象としているセル」を現します。 つまり、繰り返し処理の中で初回の繰り返しの時には、b2:b8の中で1番最初のセルであるb2セルが変数cの中に格納されますので、初回の繰り返しの時にはb2に「abc」と入力されます。 同様に2回目の繰り返しの時には、b2:b8の中で2番目のセルであるb3セルが変数cの中に格納されるためb3セルに「abc」と入力され、3回目の繰り返しの時にはb4セルに「abc」と入力され・・・という具合に繰り返し処理がb8セルまで繰り返されます。 それと同様に、回答no.1の【for each ~next を使う方法】における for each c in range("a" & startrow & ":a" & lastrow) n = n + 1 c.value = n next c という箇所では、 range("a" & startrow & ":a" & lastrow) というセル範囲に含まれている全てのセルに対して繰り返し処理が行われる訳です。 繰り返しが1回行われるごとに、 n = n + 1 の所で、変数nの値が1ずつ増えて行く事になり、そのnの値が c.value = n の所で、「その繰り返し処理の中でその時処理を行う対象としているセル」である「変数cに格納されているセル」に入力される訳です。 【参考url】 よねさんのwordとexcelの小部屋 > excel vba入門 > 7.繰り返し処理(for~next、do~loop) > for~next http://www.eurus.dti.ne.jp/~yoneyama/excel/vba/vba_for_next.html#each 次に、do~loopに関して説明します。 for~to~nextやfor each~in~nextの場合は繰り返す回数が最初から決まっているのに対し、do~loopの場合は「同じ処理を更に繰り返すのか、それともこの回で最後にするのか」という事を判定する際に、「何回繰り返したのか」という事で決めるのではなく、「設定した条件が満たされているのか否か」という事で決めているという違いがあります。 do~loop文はwhileかuntilのどちらか一方と組み合わせて使用され、whileを付けた場合にはwhileの後の所に記述した判定式が真(true)となっている間は繰り返しが行われ、判定式が偽(false)となったところで繰り返し処理が終了します。 例えば、 sub macro() dim i as long i = 2 do while i < 5 range("a" & i).value = "abc" i = i + 1 loop end sub というvbaですと、doの所に while i < 5 が付いているため、doの所で i < 5 という条件を満たしているのかどうかという判定が行われ、「iの値が5未満である」という条件が満たされている間(iの値が2~4の場合)は繰り返し処理が行われ、iの値が5となった際に do while i < 5 の所で繰り返し処理が打ち切られてloopの次に記述されている処理へと進みますので、a2~a4のセル範囲に「abc」という文字列データが入力されます。 一方、untilを付けた場合にはuntilの後の所に記述した判定式が偽(false)となっている間は繰り返しが行われ、判定式が真(true)となったところで繰り返し処理が終了します。 例えば、 sub macro3() dim i as long i = 2 do until i > 5 range("a" & i).value = "abc" i = i + 1 loop end sub というvbaですと、doの所に until i > 5 が付いているため、doの所で i > 5 という条件を満たしているのかどうかという判定が行われ、「iの値が5よりも大きい」という条件が満たされて"いない間"(iの値が2~5の場合)は繰り返し処理が行われ、iの値が5を超えた値である6となった際に do until i > 5 の所で繰り返し処理が打ち切られてloopの次に記述されている処理へと進みますので、a2~a5のセル範囲に「abc」という文字列データが入力されます。 尚、whileやuntilはdoの後以外にもloopの後にもつける事が出来ます。(付ける事が出来るのは「doの後」か「loopの後」のどちらか片方だけであり、「doの後」と「loopの後」の2ヶ所に同時に付ける事は出来ません) ※ まだ途中なのですが、このままでは文字数制限内に収まりそうも御座いませんので、残りは又後で投稿致します。