代码之家  ›  专栏  ›  技术社区  ›  Mike - SMT

函数在前2个任务中起作用,但在第3个任务中不起作用

  •  1
  • Mike - SMT  · 技术社区  · 6 年前

    这是一个有趣的问题。

    我编写了一个函数,它获取一个数据列表,并将该列表分为两个工作表。第一个包含发票日期前不到90天,第二个包含发票日期前超过90天。此函数在第一个和第二个列表中按预期工作,但在第三个列表(与其他两个列表的格式相同)中却无法执行任何操作。

    工作手册有7页。

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

    第6页是第3个列表。第7页是第3个列表的大于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
    

    Debug.Print() 因为某种原因给我看了 last_row start_sheet 6 .

    Debug.Print 我希望看到列表的最后一行在每次调用函数时打印两次。相反,我看到的是前2个列表的最后一行打印了两次,第2个列表只打印了一次。这对我来说毫无意义。

    这是打印结果。

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

    最后一行 最后一行

    1 回复  |  直到 6 年前
        1
  •  1
  •   Tim Williams    6 年前
    Dim last_row As Integer
    

    Dim last_row As Long
    

    整数的限制是~32000,因此对于大型数据集也是如此 last_row