Как найти максимальную и минимальную дату в диапазоне другого листа?

Вопрос:Я пишу код VBA, чтобы найти минимальные и максимальные даты в диапазоне. Когда я его выполняю, я получаю сообщение об ошибке: Run-time error '1004': Application-defined or object-oriented error. Ниже мой код: Sub GenerateSheet() Dim i, r, numAssignments As Integer Dim ssrRng, DestRange As Range Dim StartDate, EndDate, d As Date numAssignments = Sheets("Data").Range("A1048576").End(xlUp).Row - 1

Вопрос:

Я пишу код VBA, чтобы найти минимальные и максимальные даты в диапазоне. Когда я его выполняю, я получаю сообщение об ошибке:

Run-time error ‘1004’: Application-defined or object-oriented error.

Ниже мой код:

Sub GenerateSheet() Dim i, r, numAssignments As Integer Dim ssrRng, DestRange As Range Dim StartDate, EndDate, d As Date numAssignments = Sheets(«Data»).Range(«A1048576»).End(xlUp).Row — 1 Sheets(«Schedule»).Select EndDate = WorksheetFunction.Max(Sheets(«Data»).Range(Cells(2, 8), Cells(numAssignments, 8))) StartDate = WorksheetFunction.Min(Sheets(«Data»).Range(Cells(2, 5), Cells(numAssignments, 5))) End Sub

Здесь, Таблица данных имеет 8 столбцов, столбцы 5 и 8 – даты

Ответ №1

Лучше изменить несколько аспектов вашего кода, несмотря на то, что не все они несут ответственность за полученную ошибку. В общем, ваш код более подвержен ошибкам (например, при смене кода или применении его в других случаях).

  • Использование Dim:
    Dim ssrRng, DestRange As Range объявляет ssrRng как Variant и DestRange как Range.
    Вы должны использовать Dim ssrRng As Range, DestRange As Range, считая, что хотите как диапазоны.

  • Используйте переменные вместо явных ссылок, в частности, если они повторяются.
    использование

    Dim ws as Worksheet

    Set ws = Workbooks(<your workbook name>).Sheets(«Data»)

    numAssignments = ws…

    вместо

    numAssignments = Sheets(«Data»)…

  • Полностью квалифицируйте диапазоны, используемые вами, если вы явно не хотите этого.

    • Заменить

      numAssignments = Sheets(«Data»)…
      с, например,

      numAssignments = Workbooks(<your workbook name>).Sheets(«Data»)…

      (или, лучше, следуйте точке 2, которая уже рассматривает эту точку).

    • Заменить

      EndDate = WorksheetFunction.Max(Sheets(«Data»).Range(Cells(2, 8), Cells(numAssignments, 8)))
      с

      EndDate = WorksheetFunction.Max(ws.Range(ws.Cells(2, 8), ws.Cells(numAssignments, 8)))
      Аналогично для StartDate. В этом случае эти строки были источником ошибки, так как Cells без квалификатора работает в ActiveSheet.

  • Избегайте использования Select, если вы явно не нуждаетесь в нем. Объявите и установите переменные и используйте их для ссылки Range или Object, с которой вы хотите работать.

Ответ №2

Вы указываете диапазон, что его родительский элемент Листы ( “Данные” ), но не ячейки. Для всех целей и целей вам нужен диапазон от Data! E2: Schedule! E99.

Sub GenerateSheet() Dim i, r, numAssignments As Integer Dim ssrRng, DestRange As Range Dim StartDate, EndDate, d As Date numAssignments = Sheets(«Data»).Range(«A1048576»).End(xlUp).Row — 1 Sheets(«Schedule»).Select with Sheets(«Data») EndDate = WorksheetFunction.Max(.Range(.Cells(2, 8), .Cells(numAssignments, 8))) StartDate = WorksheetFunction.Min(.Range(.Cells(2, 5), .Cells(numAssignments, 5))) end with End Sub

Использование With Sheets(«Data») сообщает все внутри этого блока, которому предшествует период (aka . или полная остановка), что его родительский элемент Листы ( “Данные” ).

Оцените статью
Добавить комментарий