Excel vba反向循环步进超出最终值

时间:2015-05-12 14:19:12

标签: excel vba excel-vba for-loop

我正在调试下面的代码。当我遍历它时,我注意到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

2 个答案:

答案 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