在另一张纸的范围内查找最大和最小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不是所有人都对你得到的错误负责,你最好改变你的代码的几个方面。 一般而言,它们会使代码更容易出错(例如,更改代码或将其应用于其他情况)。

  1. 使用DimDim ssrRng, DestRange As Range声明ssrRngVariantDestRangeRange 。 您应该使用Dim ssrRng As Range, DestRange As Range ,假设您希望两个范围。

  2. 使用variables而不是显式引用 ,特别是如果重复的话。 使用
    Dim ws as Worksheet
    Set ws = Workbooks(<your workbook name>).Sheets("Data")
    numAssignments = ws...
    代替
    numAssignments = Sheets("Data")...

  3. 完全限定您使用的范围 ,除非您明确不需要。

    • 更换
      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 。 在这种情况下, 这些行是错误的来源 ,因为没有限定符的CellsActiveSheet
  4. 避免使用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 .句号 )开始的