这很有趣。
我编写了一个函数,该函数接受一个数据列表并将该列表分成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_row
在start_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
之前看到数字。
答案 0 :(得分:1)
Dim last_row As Integer
应该是
Dim last_row As Long
整数的上限为32,000,因此对于大数据集last_row
将溢出并引发运行时错误。