I am writing a VBA code to find the minimum and maximum dates in a Range. When I execute it, I get an error:
Run-time error '1004': Application-defined or object-oriented error.
Below is my code:
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
Here, Data Sheet has 8 columns, Column 5 and 8 are dates
You better change a few aspects of your code, despite not all of them being responsible for the error you get. They make, in general, your code more prone to errors (for instance, when changing code or applying it to other cases).
Use of
Dim
:Dim ssrRng, DestRange As Range
declaresssrRng
asVariant
, andDestRange
asRange
. You should useDim ssrRng As Range, DestRange As Range
, assuming you want both as ranges.Use variables instead of explicit references, in particular if those are repeated. Use
Dim ws as Worksheet
Set ws = Workbooks(<your workbook name>).Sheets("Data")
numAssignments = ws...
instead of
numAssignments = Sheets("Data")...
Fully qualify the ranges you use, unless you explicitly do not want that.
numAssignments = Sheets("Data")...
with, e.g.,numAssignments = Workbooks(<your workbook name>).Sheets("Data")...
(or, better, follow point 2, which already considers this point).
EndDate = WorksheetFunction.Max(Sheets("Data").Range(Cells(2, 8), Cells(numAssignments, 8)))
withEndDate = WorksheetFunction.Max(ws.Range(ws.Cells(2, 8), ws.Cells(numAssignments, 8)))
Likewise for
StartDate
. In this case, these lines were the source of error, sinceCells
without qualifier works in theActiveSheet
.Avoid using
Select
, unless you explicitly need it. Declare and Set variables, and use them for referencingRange
s orObject
s you want to work with.You are telling range that its parent is Sheets("Data") but not cells. For all intents and purposes you wanted a range from Data!E2:Schedule!E99.
Using the
With Sheets("Data")
tells everything inside that block that is prefaced with a period (aka.
or full stop) that its parent is Sheets("Data").