■ 楽をしたいから繰り返し
さて、前回で作ったプログラム。セルA1のデータをセルB1に加工して書き出す…ですが、あまりありがたく感じませんよね。
データひとつの書き換えなら正直、手でやったほうが早いです。
プログラムにありがたみを感じるのは、変換するデータが膨大な数にのぼるときです。
つまり繰り返し処理が必要な時ということです。
前回のtestプロシージャを繰り返しできるように改造してみましょう。
Public Sub test()
Dim MyStr As String
Dim i As Long
For i = 1 To 100
MyStr = Range("A" & i)
If MyStr <> "" Then
Range("B" & i) = "Hello" & MyStr & "!"
End If
Next i
End Sub
うん。とってもまずいコードですね。とりあえずこれでやってみましょう。セルA1、A2、A3、くらいに適当な名前を入れて実行してみてください。
B列に"Hello〜"つきのデータが出力されたと思います。まず、For〜Nextの説明です。
3行目にiという変数がLong型で宣言されていますね。このiのことをカウンタとよび通常、整数型で宣言します。
For i = 1 To 100 はiが1からスタートして1づつ増えていき100になるまで繰り返せという意味です。1づつ増えるという指定のStep 1 は省略しています。(省略した場合のデフォルトはStep 1)
カウンタのiは一般的によく使われる変数名ですが別にMyCounterでもかまいません。またカウンタは必ず1から始まる必要はなくどんな数でもかまいません。
For i = 0 To 99 でもちゃんと100回繰り返します。
さてこのコード、いったいどこがまずいのでしょう?
まず繰り返しの上限値が100回なのでデータ数が100を超えると、その部分は無視されちゃいます。さらにデータ数が100未満でも律儀に100回繰り返します。
画面上の変化はありませんがセルA100まで、毎回キッチリとデータを見にいってます。
これはだめなコードのいい見本ですね。
ではもう一つの繰り返し処理をご紹介します。Do〜Loopです。
Public Sub test()
Dim MyStr As String
Dim i As Long
i = 1
Do
MyStr = Range("A" & i)
If MyStr <> "" Then
Range("B" & i) = "Hello" & MyStr & "!"
End If
i = i + 1
Loop Until Range("A" & i) = ""
End Sub
うん。ちょっとゴチャゴチャしちゃいましたね。まず、i=1 と i=i+1 が増えましたね。これはFor〜Nextのときは自動的にカウンタを増分してくれたのですが、Do〜Loopはやってくれないので手動で行う必要があります。
それはDo〜Loopは「何回繰り返す」という命令ではなく「条件が真になるまで繰り返す」命令だからです。
その条件は
Loop Until Range("A" & i) = ""
の部分です。ここはその直前で増分したiを使ってA列i行のセルを見にいっています(つまりA3の処理をした時点で次のA4セル)。そしてそのセルが空のときに繰り返しを終えます。
Untilは「条件が真になるまで」繰り返せという意味です。逆に「条件が真のあいだは」繰り返せと命令することもできます。Whileを使います。
Loop While Range("A" & i) <> ""
これでも全く同じに動きます。A列の次のセルが空でない(データがある)あいだは繰り返せという意味になります。
ちょっとましになりましたね。
これでデータ数が100を超えても大丈夫ですし、100未満ならデータが無くなった時点で処理を終了します。
でもまだちょっと問題があります。A列のデータが歯抜けだった場合、そこで処理が止まってしまいます。
歯抜けのデータがある場合はいったいどうしたらいいのでしょう?
要するに問題なのは繰り返しの回数が分らないことなのです。
A列にあるデータの最終行さえわかれば繰り返し回数を指定できるのです。早速やってみましょう。
Public Sub test()
Dim MyStr As String
Dim i As Long
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
MyStr = Range("A" & i)
If MyStr <> "" Then
Range("B" & i) = "Hello" & MyStr & "!"
End If
Next i
End Sub
最初のFor文と同じです。ただひとつ違うところはカウンタの上限値に
Cells(Rows.Count, 1).End(xlUp).Row
をつかっているところです。
なんじゃこりゃ?そうおもったあなた、ちゃんと一つづつ説明しますからご安心を。
まずRows.Countですが言葉のとおりエクセルの行数です。Excel2003までは65536行、Excel2007は1048576行になります。
Cellsはセルを(行,列)番地で指定できるプロパティです。Cells(Rows.Count, 1)はセル(最終行, 1列目)ということです。Excel2003までならRange("A65536")と同じ意味になります。
簡単にいえばA列の一番下にあるセルのことです。そこから.End(xlUp).Row は上に見ていってデータが見つかった最初のセルの行数を返せという意味になります。
たとえばA列に100行までデータが入っていることにしましょう。この命令でA列を最終行から順に見ていって最初にデータが見つかった行番号(つまり100)を返します。
これならデータが歯抜けでもなんでも、ちゃんとデータの入力されている最終行まで処理し、きちんとそこで処理を終えます。
ちなみに最終列を取得する場合は、
Cells(1, Columns.Count).End(xlToLeft).Column
です。この二つはとてもよくつかいますので覚えておいてください。
さて二つの繰り返し処理を説明しました。他にも繰り返し処理はあるのですがほとんどの場合、For文とDo文で事足ります。
たった二つですのでしっかりとマスターしてください。
※ 繰り返し処理についての詳細な解説はこちらを参照ください。
いろいろな繰り返し処理
|
|
|