2016年6月7日火曜日

【VBAリファレンス】For文を理解してフォアフォアしてみよう。

大量のデータ処理を行う上で、必要なステートメント(述べること)が
いくつかあります。

その中でも私が現在とても重きを置いているのが

Forステートメント(以下For文って言います)
Ifステートメント(以下If文って言います)があります。

ちなみにIf文は後程ご紹介します。

For文とは
For~Nextという基本構文の~の部分に処理内容を記述します。

では、肝心のFor~Nextとは一体何をするものなのかですが、
まず、ざっくりいうと
カウントするんです。

まず、カウントするという言葉を頭の中に置いておいてください。

記述サンプルは以下の通りです。
-----------------------------------------
Sub test()

Dim i As Long  'ロング型の変数を宣言します

For i = 1 To 10
'ここに処理内容を書く
Next i

End Sub
-----------------------------------------
For i =の後がポイントです。
ここで記述している 1 To 10というのは
1から10までカウントするという意味です。
最初のiには1が入り、処理が行われます。
そして、処理が終わるとNext iに到着。
しかし、カウントはまだ1回目なので、このiは2回目のi、つまり
上に戻り、カウントは2にアップし、2回目の処理が行われます。
そして、それが10回まで繰り返されます。

もちろん、数字の入力は自由です。
2 To 5
これは、2~5カウントします。
1 To 1000
これは、1~1000までカウントします。

さて、ここまでカウントといってはぐらかしてきましたが
このカウントこそが最大のポイントです。

カウントとして使用するこの変数i(もちろん変数名はiじゃなくてもいいです)は
列の値、行の値、処理を行う回数など、
様々な使い方が出来るんです。

だって変数だから

その変数iを直接処理内容のCellsプロパティやRowsプロパティに
当て込んであげれば、もうエクセル内縦横無尽に
行ったり来たり出来ます。
あっちこっちに処理が出来ます。

ただ、For文というのは
掴むまで個人差があり、私は開花するまで数か月かかりました。
そのかわり、一度掴むと結構複雑な動作が出来るようになります。



具体例をコードで記述してみます。
-----------------------------------------
Sub test()

Dim i As Long

For i = 1 To 10
Cells(i, 1).Value = "カウント" & i 
Next i

End Sub
-----------------------------------------
これはCellsプロパティを使って、Rowの値を1つずつ増やし、
尚且つ、指定したセルにカウントというコメントと変数を組み合わせて入れてます。

その結果は以下の通りです。




























先ほどのCells(i, 1).Valueのiと1入れ替えると
RowとColumnが入れ替わるので




























横向きに入力されていきます。
ただし、これは基本的な使用になります。

例えばAとB列に数値が入っていて
その数値に対してC列へ処理を実行したい場合、
また、そのC列の処理が終了したら、
隣の列に移動して別の処理を行いたいなど、
様々な処理が可能になります。

なんだかワクワクしませんか?

また、このカウントは段飛ばしにカウントすることも出来ます。

For i = 1 To 10の後に Step 2とつけると1段飛ばし
For i = 1 To 10の後に Step 3とつけると2段飛ばしが出来ます。
例):For i = 1 To 10 Step 2
※下の図はStep 2を実行したものです。



















もちろん、カウントの逆打ちも出来ます。
逆打ちの場合はToを挟む数字も逆になります。
-----------------------------------------
Sub test()

Dim i As Long

For i = 10 To 1 Step -2
Cells(i, 1).Value = "カウント" & i
Next i

End Sub
-----------------------------------------
逆打ちでStepを使用する場合はマイナスをつけてください。

この、逆打ちは不要な列の削除をする際に
大活躍します。

具体的には後々ご案内しますね。



さて、ここまでカウントの数値を具体数で記述していましたが
ここのカウント値に変数を使用することが出来ます。

ここで??と思う方もいるかもしれません。

→For i = 1 To count (Countが変数とします)

変数には値を代入しなければならないので
結局2度手間じゃないの?と思うかもしれません。

ここで魔法の言葉です。
先日紹介しました記事にも記載しています。

Cells(Rows.Count, 1).End(xlUp).row
Cells(1, Columns.Count).End(xlToLeft).Column

それぞれCellsの後に記述しているの
Cells(Rows.Count, 1).End(xlUp).rowはA列
Cells(1, Columns.Count).End(xlToLeft).Columnは1行目の意味です。
その1の部分はデータ最終行、もしくは列まで入っているところを記述します。
※こちらも詳しくは後日ご案内します。

そして、その左辺に変数を入力してあげれば
最終行が入っている行が変数に代入されます。
例):A列に10行目までデータが入ってた場合、
count = Cells(Rows.Count, 1).End(xlUp).rowと記述すると
変数countには10という値が代入されます。

さて、もうお判りでしょうか。
あとはその変数countをForのカウントとして設定してあげればいいわけですね。

つまり、データが入っている最終までVBAで調べ
その値をForのカウンタに設定するわけです。

なので、Forは慣れればなれるほど
拡張性が増し、よりパフォーマンスの幅が広がってきます。

慣れてくると、エディター内はフォアフォアしまくるようになってくるでしょう。


最後に、先日私がプライベートで調査のために書いた
For文だらけのサンプルコードを乗っけておきます。
参考にはしないでください。

-----------------------------------------
Sub Sample()

Dim cc, re, sc, colcount, rocount, i As Long

cc = Cells(1, Columns.Count).End(xlToLeft).Column
rc = Cells(Rows.Count, 1).End(xlUp).Row
For sc = 1 To Sheets.Count
   Sheets.count(sc)
    For colcount = 1 To cc
        For rocount = 1 To rc
            For i = 1 To 30
            '処理実行
            Next i
        Next rocount
    Next colcount
Next sc
End Sub
-----------------------------------------

0 件のコメント:

コメントを投稿