函数适用于前两个任务,但对第三个任务无效

时间:2018-09-21 16:15:49

标签: excel vba function

这很有趣。

我编写了一个函数,该函数接受一个数据列表并将该列表分成2个工作表。第一个包含发票日期之前90天以下,第二个包含发票日期之前90天以上。此功能可以对第一个列表和第二个列表按预期工作,但对于第三个列表(与其他两个列表相同的格式),它什么也没做。

该工作簿有7页。

第2页是第一个列表。第1页的第3页大于90页。

第4页是第二个列表。第2页的第5页大于90页。

第6页是第3个列表。第7页是大于90的第三张列表。

无论出于何种原因,该功能都可以正常运行,直到需要处理第6页和第7页。

这是我对函数的调用:

Call split90(2, first_of_month, inv_wb)
Call split90(4, first_of_month, inv_wb)
Call split90(6, first_of_month, inv_wb)

第一个参数用于定义正在处理的页面。第二个参数用于传递月份的第一个日期。第三个参数用于传递工作簿,该函数将在该工作簿中操作列表。

功能如下:

Function split90(start_sheet, first_of_month, inv_wb)

    Dim rng_wk As Range
    Dim last_row As Integer
    Dim stop_row As Integer

    Debug.Print ("Before last_row: " & inv_wb.Worksheets(start_sheet).Cells(Rows.Count, "C").End(xlUp).Row)
    last_row = inv_wb.Worksheets(start_sheet).Cells(Rows.Count, "C").End(xlUp).Row
    Debug.Print ("After last_row: " & last_row)
    Set rng_wk = inv_wb.Worksheets(start_sheet).Range("C2:C" & last_row)

    For Each cell In rng_wk
        If Not IsEmpty(cell.Value) Then
            If CDate(cell.Value) < CDate(first_of_month) - 90 And CDate(cell.Value) <> CDate("1/1/0001") Then
                stop_row = cell.Row
                Exit For
            End If
        End If
    Next cell

    Set rng_wk = inv_wb.Worksheets(start_sheet).Range("A" & stop_row & ":H" & last_row)
    rng_wk.Cut Destination:=inv_wb.Worksheets(start_sheet + 1).Range("A2")

End Function

上面的代码对列表1和2正常工作,但是当我为列表3传递数字6时,它只是失败了。没有。没错没什么。我对Debug.Print()进行的所有测试都向我表明,由于某种原因,last_rowstart_sheet是整数6时没有得到分配的值。

从上面的Debug.Print开始,我希望看到该列表的最后一行为每次调用该函数打印两次。相反,我看到的是最后一行为前两个列表打印了两次,为第二个列表打印了一次。对我来说没有意义。

这是打印结果。

Before last_row: 20892
After last_row: 20892
Before last_row: 3098
After last_row: 3098
Before last_row: 35738

如您所见,由于某些原因,变量last_row未被分配最后一个组的值...但是它可以在分配给last_row之前看到数字。

1 个答案:

答案 0 :(得分:1)

Dim last_row As Integer

应该是

Dim last_row As Long

整数的上限为32,000,因此对于大数据集last_row将溢出并引发运行时错误。