我正在调试下面的代码。当我遍历它时,我注意到row_j
的值为1,尽管For row_j = LastRow_date_new To 2 Step -1
。
我希望最小row_j
值为2,因为第1行中没有数据。SearchCol
中的值是20/01/2015 09:15:00
格式的日期,没有间隙或空值
row_j
用于设置传递给End_row
的{{1}}并在那里传播错误。
任何人都可以看到我的问题来自何处?
另外,如果符合Copy_to_b
所需的值,您能推荐一种退出循环的方法吗?
谢谢
Date_end
答案 0 :(得分:2)
使用For row_j = LastRow_date_new To 2 Step -1
,并且在每For
之后,您的变量将等于最后一个值+步,这就是For
- 循环退出自身的方式。
因此,如果您不希望将该变量设置为1,则必须在For
- 循环之后将其设置为正确的值,如下所示:
For row_i = 2 To LastRow_date_new
If Sheets("a").Cells(row_i, SearchCol).Value = DateMax Then Start_row = row_i
Next row_i
row_i=2
For row_j = LastRow_date_new To 2 Step -1
If Sheets("a").Cells(row_j, SearchCol).Value = Date_end Then End_row = row_j
Next row_j
row_j=2
要在匹配条件时退出循环,您可以使用Exit For
,有些人会说它不优雅但它确实有效(并且在代码审核之下另一种方式)
Sub select_date_range(LastCol As Long, LastRow_date_new As Long, DateMax As Date, Date_end As Date)
Dim SearchCol As Integer
Dim row_i As Integer
Dim row_j As Integer
Dim Start_row As Integer
Dim End_row As Integer
With Worksheets("a")
For SearchCol = 1 To LastCol Step 3
LastRow_date_new = Application.CountA(.Range((.Cells(1, SearchCol)), (.Cells(65536, SearchCol))))
For row_i = 2 To LastRow_date_new
If CDate(.Cells(row_i, SearchCol).Value) <> CDate(DateMax) Then
Else
Start_row = row_i
Exit For
End If
Next row_i
For row_j = LastRow_date_new To 2 Step -1
If CDate(.Cells(row_j, SearchCol).Value) <> CDate(Date_end) Then
Else
End_row = row_j
Exit For
End If
Next row_j
''''''' use range col1, row i to col2, row j to copy into new sheet
Call copy_to_b(Start_row, SearchCol, End_row)
Next SearchCol
End With
End Sub
要替换For
,您可以使用Do While
ou Do Until
:
row_j = LastRow_date_new
Do While row_j >= 2 And .Cells(row_j, SearchCol).Value <> Date_end
row_j = row_j - 1
Loop
End_row = row_j
答案 1 :(得分:2)
我认为您的问题可能是由于您查看的列中没有任何值或只有一个值而导致的。此外,如果此列中包含空值,您可能会错过值,如果是这种情况,我将更改我的答案。你应该改变
With Worksheets("a")
For SearchCol = 1 To LastCol Step 3
LastRow_date_new = Application.CountA(.Range((.Cells(1, SearchCol)), (.Cells(65536, SearchCol))))
For row_i = 2 To LastRow_date_new
If Sheets("a").Cells(row_i, SearchCol).Value = DateMax Then Start_row = row_i
Next row_i
For row_j = LastRow_date_new To 2 Step -1
If Sheets("a").Cells(row_j, SearchCol).Value = Date_end Then End_row = row_j
Next row_j
''''''' use range col1, row i to col2, row j to copy into new sheet
Call copy_to_b(Start_row, SearchCol, End_row)
Next SearchCol
End With
到此
Dim xlws As Excel.Worksheet
Dim lngrow as Long
Set xlws = Thisworkbook.Sheets("a")
For SearchCol = 1 to LastCol Step 3
While xlws.Range.Cells(lngrow,SearchCol).Value <> ""
If xlws.Cells(lngrow,SearchCol).Value = DateMax Then
Start_row = lngrow
Elseif xlws.Cells(lngrow,SearchCol).Value = Date_end Then
End_row = lngrow
End If
lngrow = lngrow + 1
Loop
Call copy_to_b(Start_row, SearchCol, End_row)
Next SearchCol