• ベストアンサー

VBA for i=1 to lastrow

データ最終行を取得し、for nextループで回すことは多いですが、書き方として以下の2通り考えられます。 For i=1 to cell(cells.count, 1).end(xlup).row Lastrow=cell(cells.count, 1).end(xlup).row For i=1 to Lastrow 最初の方法はiがカウントされる度に最終行を計算すると思いますが 、そうなのでしょうか?その場合、計算時間は問題にならないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

こんにちは。 >For i = 1 to Cell(Cells.Count, 1).End(xlUp).Row '←オーバーフローします。 正しくは、 For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row 実際には試さずに、頭の中だけで考えた質問でしょうけれども、こういう問題は、実際にVBEditorに書いて試してからにしてください。 以下が、ループのカウンタがインクリースする都度、Endプロパティを取っていたら、無限ループになるはずです。 '// Sub Test1()  Dim i As Long  Dim j As Long  For i = 1 To 10   Cells(i, 1).Value = i  Next i  Stop '一旦止めました  For j = 1 To Cells(Rows.Count, 1).End(xlUp).Row   Cells(j + 10, 1).Value = j  Next j End Sub '//

over_the_galaxy
質問者

お礼

ありがとうございます。 私は「ループの度に計算して時間がかかるかなぁ」程度に考えてましたが、確かにループの度に取得値が変わったらすごいことになりますね。気づきませんでした。

すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.2

A列の1~100000まで連番で埋めといて 標準モジュールで簡単なテストです。 Public Declare Function GetTickCount Lib "kernel32" () As Long Sub test1() Dim i As Long, j As Long, lastRow As Long, t As Long t = GetTickCount Cells(10001, 1).Value = Null For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row j = Cells(i, 1) If i = 1000 Then '途中で1行追加 Cells(10001, 1).Value = 10001 End If Next Debug.Print j, GetTickCount - t End Sub Sub test2() Dim i As Long, j As Long, lastRow As Long, t As Long t = GetTickCount Cells(10001, 1).Value = Null lastRow = Cells(Rows.Count, 1).End(xlUp).Row For i = 1 To lastRow j = Cells(i, 1) If i = 1000 Then '途中で1行追加 Cells(10001, 1).Value = 10001 End If Next Debug.Print j, GetTickCount - t End Sub 1/1000秒単位での経過時間は両者とも誤差の範囲内と言えるくらいに同じです。 For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row の場合でも毎回Cells(Rows.Count, 1).End(xlUp).Rowを評価するわけではありません。 ループに入れば初回に得られた値で進みますね。 以上ご参考まで。

over_the_galaxy
質問者

お礼

ありがとうございます。 毎回計算のではないので経過時間もほぼ同じということですね。

すると、全ての回答が全文表示されます。

関連するQ&A