Функция работает для первых двух задач, но ничего не делает на третьем - PullRequest
0 голосов
/ 21 сентября 2018

Это интересный.

Я написал функцию, которая берет список данных и разделяет список на 2 рабочих листа.Первый содержит менее 90 дней до даты выставления счета, а второй содержит более 90 дней до даты выставления счета.Эта функция работает, как и ожидалось, для первого и второго списка, но для третьего списка (в том же формате, что и два других) ничего не происходит.

Рабочая книга имеет 7 страниц.

Страница 2 - первый список.Страница 3 для первого списка превышает 90.

Страница 4 - второй список.Страница 5 для второго списка больше 90.

Страница 6 - третий список.Страница 3 для третьего списка больше 90.

По какой-то причине функция работает без сбоев, пока не настало время работать со страницами 6 и 7.

Вот мой призыв кfunction:

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

1-й аргумент используется для определения того, над какой страницей выполняется работа.2-й аргумент - использование для передачи первой даты месяца.Третий аргумент используется для передачи рабочей книги, где функция будет манипулировать списком.

Вот функция:

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, но когдаЯ передаю номер 6 для списка 3, он просто терпит неудачу.Ничего такого.Нет ошибок.Совсем ничего.Все мои тесты с Debug.Print() показали, что по какой-то причине last_row не получает присвоенное ему значение, когда start_sheet является целым числом 6.

Из приведенного выше Debug.Print Iожидайте увидеть последнюю строку списка, напечатанную дважды для каждого вызова функции.Вместо этого я вижу, что последняя строка печатается дважды для первых двух списков и только один раз для второго списка.Это не имеет смысла для меня.

Вот результаты печати. ​​

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 голосов
/ 21 сентября 2018
Dim last_row As Integer

должно быть

Dim last_row As Long

Ограничение для Integer составляет ~ 32 000, поэтому для больших наборов данных last_row будет переполнено и вызовет ошибку времени выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...