« アナウンサーのスカートの丈はどうよ? | トップページ | 使える文字数と種類も増やしてくださいよ。 »

For...Next ステートメントの「初期値」と「終了値」について

この記事は自分用の覚書です。

VBA で列方向(右方向)に対しての繰り返しを For...Next ステートメントで処理する場合、列数を把握する必要があるが、列数が多いと数え間違えて繰り返し回数の指定ミスにつながる。また右端まで数えるのも手間。
( Excel2013 )

■例
VBA の For...Next ステートメントで、繰り返しの回数を決める「初期値」と「終了値」を指定する際に、列数を数えないで済む例。
Column プロパティを活用する。

・前提
A1セルからMZ1セルには列見出しが入っている。
値を入れたいのはA2セルからMZ2セル。


Sub sample1()
    Dim i As Long, cnt As Long
    For i = Range("A1").Column To Range("MZ1").Column
        cnt = cnt + 1
        Cells(2, i).Value = cnt
    Next i
'
'上記のコードを実行すると、1 から1つずつ増やして
' 364 までの連番になるように、A2セルからMZ2セルに値を入れる。
' For i = の行は、For i = 1 To 364 と書いたのと同じ意味。
' Column プロパティは、そのセルの列位置を数値で返す。
'一番右端のセル参照(上記では MZ1)を確認しておけば、
'列数を数えなくても最終の列位置を終了値に指定できる。
'
' For i = 1 To Range("MZ1").Column と書いても同じ意味。
'このコードは、 Column プロパティが、セルの列位置を数値で返すことを示す例なので、
'「1」を書かないで、 Range("A1").Column にしてある。
'
'もし、一番右端の列のセル位置が固定でない場合、次の書き方で対応できる。
' Range("MZ1").Column の部分を
' Cells(1, Columns.Count).End(xlToLeft).Column
'にする。
'
' For i = 1 To Cells(1, Columns.Count).End(xlToLeft).Column
'
' Columns.Count プロパティでワークシートにある最大列数を数値で取得する。
' Excel2013 では 16,384列。
'
' Cells(1, 16384).End(xlToLeft).Column
'と書いたのと同じ意味。
'ワークシートの列の上限(16,384列目)のセルから End(xlToLeft) で、
'エクセルをEndモードの状態に切り替えて、左へ向かって、
'データが入力されている最初のセルへジャンプ。
'そのセルの列位置を取得すれば、それが最終列。
'
'セルに値が入っていないであろう十分に後ろの方向から逆にジャンプすれば、
'最終列の列位置を取得できるという考え方。
'
'列位置を数値で取得したいので、ここでも Column プロパティを使って
' End(xlToLeft).Column
'と書く。
End Sub


■補足

Cells(2, i).Value = cnt の Value プロパティは省略可能。

Cells(2, i) = cnt

でもよい。
ここでは、セルの値に変数 cnt を代入しているのだとわかりやすくするために Cells(2, i).Value = cnt と書いて強調した。

|

« アナウンサーのスカートの丈はどうよ? | トップページ | 使える文字数と種類も増やしてくださいよ。 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: For...Next ステートメントの「初期値」と「終了値」について:

« アナウンサーのスカートの丈はどうよ? | トップページ | 使える文字数と種類も増やしてくださいよ。 »