プロが教える店舗&オフィスのセキュリティ対策術

データ最終行を取得し、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がカウントされる度に最終行を計算すると思いますが
、そうなのでしょうか?その場合、計算時間は問題にならないのでしょうか?

A 回答 (2件)

こんにちは。



>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

'//
    • good
    • 1
この回答へのお礼

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

お礼日時:2014/03/18 20:25

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を評価するわけではありません。
ループに入れば初回に得られた値で進みますね。
以上ご参考まで。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/03/18 20:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A