在另一张纸的范围内查找最大和最小date
我正在编写一个VBA代码来查找Range中的最小和最大date。 当我执行它时,我得到一个错误:
运行时错误“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是date
尽pipe不是所有人都对你得到的错误负责,你最好改变你的代码的几个方面。 一般而言,它们会使代码更容易出错(例如,更改代码或将其应用于其他情况)。
-
使用
Dim
:Dim ssrRng, DestRange As Range
声明ssrRng
为Variant
,DestRange
为Range
。 您应该使用Dim ssrRng As Range, DestRange As Range
,假设您希望两个范围。 -
使用variables而不是显式引用 ,特别是如果重复的话。 使用
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)))
with
EndDate = WorksheetFunction.Max(ws.Range(ws.Cells(2, 8), ws.Cells(numAssignments, 8)))
同样适用于StartDate
。 在这种情况下, 这些行是错误的来源 ,因为没有限定符的Cells
在ActiveSheet
。
- 更换
-
避免使用
Select
,除非你明确需要它。 声明和设置variables,并使用它们来引用你想要使用的Range
s或Object
。
你告诉范围它的父母是Sheets(“数据”),但不是单元格。 对于所有的意图和目的,你需要从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")
告诉该块内的所有内容是以父级为Sheets(“Data”)的句点(aka .
或句号 )开始的 。