- 締切済み
Excel のVBA ループ処理について
マクロの歴が浅く、いまひとつ処理のロジックがわかりません。どなたかご教示下さい。 A列には番号が振ってあり、B列にはデータがあります。 ここで、番号で分けられているデータは7項目ある状態で、A列の番号をキーにして、ループ処理をさせたいと思っています。 データを上から順番に見ると、A1には番号1があり、1のデータはB1からB7まで書き込まれている配列になっています。この配列が、番号がnまで続く時のループ処理がわかりません。つまりA1の番号の下、A2からA7までは空白で、A8に番号2があり、この2のデータがB8からB14まで番号1と同様のデータが並んでいる配列です。 間に空白の無い場合の処理はわかるのですが、この様な場合、どういう処理を行えばよろしいのでしょうか?
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17070)
VBAや、(他種のプログラム言語を含めて)プログラムや関数(配列数式)では、「配列」という用語は、特別な意味のあることなので、注意して使うこと。一種の「データ構造」です(WEB記事で勉強のこと)。 本件の仕様も違和感がある。 ーー 繰り返しの最終行はRange("B100000").End(xlup)で知る B列はデータが全行入っているという仮定です。これが不確かのデータ表の場合は、別途工夫がいる。 A列でやると最下のA列データの下にある空白行を、何行かを漏らして数える恐れがあるので全行データの(確実に)ある列で察知する。 ーー データ(見出し行を除いて実質的なデータの)第2行以後、今処理を考えている1行のA列データが空白でなければ、それを変数Maeというものに入れて、その行以後でのデータはその値のつもりで処理を行い、もしA列が空白ならMaeのデータをA列の値として使う。 空白でないA列行に出くわしたら、MaeをそのA列データで置き換え、それで考える。 A列のデータが空白の場合、本行処理に全行データを(部分(A列)的に)引き継ぐ役割をさせる。 ーー プログラムで繰り返し処理は、3種類ぐらいあるが、上記の方法で、最下行がわかってしまえば、ForNextが安定しているように思う。 ーー ある列で、前の行と同じでも、できれば同じデータを入れておく方式の方が、いろんな面でプログラムや関数は簡単になるだろうと思う。 表を見る方は同じデータが省かれている方が、見やすいが、条件付き書式などで、同じ列データは見えない(色を白色文字)ようにする手もある。
- dogs_cats
- ベストアンサー率38% (278/717)
最終行を取得すればセル範囲を設定出来ますよね。 下記は最も下の行から上に向かって最終行を取得します。 1は1列目なのでA列の意味です。 dim MaxRow as long MaxRow = Cells(Rows.Count, 1).End(xlUp).Row MaxRow = Cells(Rows.Count, "A").End(xlUp).Row どの列が最終列候補になるのか判断して列していすれば良いです。 B列で最終行を取得すれば良いのでは無いかと思いますが。 do loop for each next for next どれでもループ処理は可能。 書籍や基礎サイトで構文や変数、配列などを覚えないとコード作成出来ないでしょう。 VBAはサンプルコードやメソッド等の解説サイトはいくらでもあります。それらを活用して覚えて下さい。
お礼
最近、マクロの記録から、少し先に進もうと奮闘しています。 色々なサイトを活用して覚えたいと思います。 有難うございました。
お礼
A列の番号を空白部分にも有ると見なす考えは、全く思いつきませんでした。 この「データ構造」は集計しているものからcsvで落として来たままの構造なので、そのまま利用する方法で処理ができる様にもう少し考えてみます。