Вопрос:
Я пишу код 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 . или полная остановка), что его родительский элемент Листы ( “Данные” ).