在另一张工作表的

时间:2015-05-21 01:28:47

标签: excel vba excel-vba excel-2013

我正在编写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列是日期

2 个答案:

答案 0 :(得分:3)

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

  1. 使用Dim Dim ssrRng, DestRange As RangessrRng声明为VariantDestRange声明为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。在这种情况下,这些行是错误的来源,因为Cells没有限定符在ActiveSheet中有效。
  4. 避免使用Select ,除非您明确需要它。声明和设置变量,并使用它们来引用您想要使用的RangeObject

答案 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)