如何在另一个 sheet 的范围内找到最大和最小日期?

How to find max and min date in a range of another sheet?

我正在编写 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

这里,数据Sheet有8列,第5列和第8列是日期

您告诉范围它的父级是 Sheets("Data") 而不是单元格。出于所有意图和目的,您想要一个范围从 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") 告诉该块内以句点(又名 .句号 )开头的所有内容其父级是 张数("Data").

您最好更改代码的几个方面,尽管并非所有方面都对您遇到的错误负责。通常,它们会使您的代码更容易出错(例如,在更改代码或将其应用于其他情况时)。

  1. Dim的使用: Dim ssrRng, DestRange As RangessrRng 声明为 Variant,将 DestRange 声明为 Range。 您应该使用 Dim ssrRng As Range, DestRange As Range,假设您希望两者都作为范围。

  2. 使用变量而不是显式引用,尤其是在那些重复的情况下。 采用
    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)))
      EndDate = WorksheetFunction.Max(ws.Range(ws.Cells(2, 8), ws.Cells(numAssignments, 8)))
      同样 StartDate。在这种情况下,这些行是错误的来源,因为没有限定符的 CellsActiveSheet.
    • 中有效
  4. 避免使用 Select,除非您明确需要它。声明和设置变量,并使用它们来引用您要使用的 Ranges 或 Objects。