我正在编写VBA代码以查找范围中的最小和最大日期。当我执行它时,我收到一个错误:
运行时错误' 1004':应用程序定义或面向对象的错误。
以下是我的代码:
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列是日期
答案 0 :(得分:3)
您最好更改代码的某些方面,尽管并非所有方面都对您获得的错误负责。通常,它们会使您的代码更容易出错(例如,在更改代码或将其应用于其他情况时)。
使用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")...
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
。
答案 1 :(得分:1)
您告诉范围其父级是表格(&#34;数据&#34;)但不是单元格。对于所有意图和目的,您需要一个范围来自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")
告诉该块内的所有内容都以句点(又名.
或句号)开头,其父级为表格(&# 34;数据&#34)强>