ネストとは
別名「入れ子構造」とも呼ばれるらしいですが、ネストという言葉を使っている方が多い気がします。
これは簡単に言うと「Ifの中でIfを使う」「For Nextの中でFor Nextを使う」というような何かの中で何かを使う事を指します。
Ifを使った例
ではまずはIfを例に一つプログラムを書いてみましょう。
Dim msg As String 'メッセージという意味を込めてmsgという命名 If Cells(1, 1).Value = 1 Then msg = "A1には1が入っています。" If Cells(2, 1).Value = 2 Then msg = "A1には1が、A2には2が入っています。" End If End If Debug.Print msg
この様に条件によって処理を分ける際の幅が広がるわけですね。純粋にAndやOrを使ってもいける場合もあるのでそこは適宜使い分けを出来るように意識してみましょう。
For Nextを使った例
このあたりが本番になってきますかね。
例えば最初のFor NextをRow(縦軸)を回すFor Next。2個目のFor NextをColumn(横軸)を回すFor Nextとしましょう。
縦横に値が入っている表をそのまま10個先のRowに移してみましょう。
Dim r As Integer 'カウンタ変数(Rowを回す用) Dim c As Integer 'カウンタ変数(Columnを回す用) For r = 1 To 5 For c = 1 To 4 Cells(r, c).Offset(10, 0).Value = Cells(r, c).Value Next Next
こうなってくるといよいよ数字が減ってきたので想像つきにくくなってきますね。
一旦落ち着いて考えてみましょう。変数rはRow(縦軸)を回す用です。変数cはColumn(横軸)を回す用です。
最初に変数rの値が1の状態で次のForに入っていきます。そうすると次のForではcが1から4の間で回っていきます。この2個目のFor Nextを抜けるまでは最初のForのNextまで辿り着きませんね?
つまり1行目が1列目から4列目まで回ったら2行目の1列目から4列目…といった具合に値を移していっているんですね。
このあたりはステップ実行して頂ければ感覚がつかめるのではないかと思います。
更に言うなれば「表にはすき間がない」前提で「どのくらいずらすのかは不確定」といった場合にはこういった書き方で汎用性を上げる事も出来るかと思います。
Dim r As Integer 'カウンタ変数(Rowを回す用) Dim c As Integer 'カウンタ変数(Columnを回す用) Dim of As Integer 'オフセットさせる数 of = 13 For r = 1 To Cells(1, 1).End(xlDown).Row For c = 1 To Cells(1, 1).End(xlToRight).Column Cells(r, c).Offset(of, 0).Value = Cells(r, c).Value Next Next
まずは始点は変わらない事がほとんどですが、終点は変わる可能性がありますね?という事でEndモードを使ってしまいます。
更にどのくらいずらして移すのかは今回は修正するとしたら1か所を直せばいいだけですが、膨大なプログラムになるとそこにたどり着くのが面倒になるパターンがあります。という事で最初で値を入れ込んでその変数をオフセット値として使用してしまえば後で直すときに楽になるってわけです。
あくまでも練習パターンなのでこのケースはないと思いますが、似たようなケースになら出会うかも知れませんので覚えておきましょう。
では次回はプログラムを実行させることが出来るボタンの設置とメッセージボックスについてお勉強していきましょう。
これが出来るとちょっとだけテンション上がりますw