このページでは、VBAビギナー向けに(備忘録として)For文を使った簡単な繰り返し処理を紹介していきます。
具体的には
①1行おきにセルの値を右上セルに移動(切り取り⇒貼り付け)させ
②移動前の行を削除して空白セルをなくす
という2つの手順をFor ~ Next文で完成させます。
下図をご覧ください↓
流れとしては
①A3、A5、A7、A9の「〇店」の値を切り取り(左)
②それぞれ右上のセルであるB2、B4、B6、B8へペースト(中)
③空白となった3、5、7、9行目を削除して上詰め(右)
のようになります。
完成形のGIF動画↓
コードはこちら
このような記述でできました↓
Sub fruit() Dim i As Long, j As Long For i = 9 To 3 Step -2 j = i - 1 Cells(i, 1).Cut Destination:=Cells(j, 2) Rows(i).Delete Next i End Sub
1つずつコメントをつけました↓
Sub fruit() Dim i As Long, j As Long '変数iとjを宣言 For i = 9 To 3 Step -2 '変数iは9から3まで、1つおきにステップ(=9,7,5,3) j = i - 1 '変数jはi-1(=8,6,4,2) Cells(i, 1).Cut Destination:=Cells(j, 2) '最初はi=9なので、セルA9の値を切り取り、B8に貼り付け Rows(i).Delete '最初はi=9なので、9行目を削除 Next i End Sub
コードの流れとしては下記のように感じでしょうか。
- Cells(9,1)=セルA9の値を、Cells(8,2)=セルB8へカット&ペースト
- 空白となった9行目を削除
- Cells(7,1)=セルA7の値を、Cells(6,2)=セルB6へカット&ペースト
- 空白となった7行目を削除
- Cells(5,1)=セルA5の値を、Cells(4,2)=セルB4へカット&ペースト
- 空白となった5行目を削除
- Cells(3,1)=セルA3の値を、Cells(2,2)=セルB2へカット&ペースト
- 空白となった3行目を削除
ちなみに、変数はlong型かinteger型、どちらが良いか分からなかったので…ひとまずlongにしておきました。
Point1:「値を右上のセルに移動」は、考えれば意外と簡単
「値を右上のセルに移動」
筆者のように論理思考がなくても、しっかり考えれば意外と難しくないことが分かります
例えば上図の場合…
- A3セル➡Cells(3,1)
- B2セル➡Cells(2,2)
と記述できますが、単純に行番号は-1されただけです。
そして今回のケースで言えば、その行番号が「i」という変数になっているため、もう1つ「j」という変数を作れば、貼り付け先のセルを指定することができます。
Point2:「1つおきに」はStepで対応する
「1つおきに(1行おきに)」値を操作する場合は、Stepを使うとできるようになります。
ただし今回のケースのように「行削除」のコードが含まれている場合は、注意が必要です。
(筆者もここで長時間悩みました…)
Point2-1:下から上に向かってStepさせる
For i = 9 To 3 Step -2 '変数iは9から3まで、1つおきにステップ
通常であれば【For i = 3 To 9 Step 2】のように、行番号が小さいほうから大きいほうへステップさせるみたいですが…
そうしてしまうと、行削除のときにうまくいかなくなります。
なので行番号が大きいほうから小さいほうへ1つおきにステップ。
今回のケースだと、A9⇒A7⇒A5⇒A3という具合です。
記述も「Step -2」とマイナスをつていますね。
なぜ大きいほうからなのか?の理由は、私が参考になった記事(ページ下部『事例18』)をご覧いただければ分かるかと思います↓
効率のよいコードの記述ができたら追記します。
ひとまず完成したものの、もう少し精度を上げられると思います。
例えば今回は【i = 9 to 3】と指定しましたが、これが実務で使う場合に、データの量が毎回異なっていて指定することが難しいときはどうするか?
適当に【i = 500 to 3】と、おおよその目途を立てても良いのか?
また、そもそもこの記述にムダがあるのではないか?など。
さらなる追求が必要になるでしょう。
ベストな記述ができたら、そのときにこのページに追記していこうと思います。
お気軽にコメントどうぞ コメント欄がないとき⇒下にスクロール