Excel VBA中的Range.Find函数无法找到行

时间:2014-10-12 14:24:49

标签: excel vba

我的VBA子程序似乎无法找到匹配日期的行。

我的目标: 要查找Sheet1中第一行的行号,其日期等于Sheet2中最旧的日期

我的流程是:

  1. 使用最早的日期
  2. 查找Sheet2中的行
  3. 找到Sheet1中的第一行 相同的日期并返回该行的行号。
  4. 发生了什么

    当我运行我的sub时,我得到的是运行时错误' 91' - 未设置对象变量或块变量。 如果我尝试" Msgbox FindRow什么都不是"我得到了真实的回应。

    这没有任何意义,因为在这个系统中,Sheet1 E6与Sheet2 E8具有相同的值

    我的数据:

    Sheet1 (E2 - E8):
        09/10/2013
        09/10/2013
        14/11/2013
        14/11/2013
        17/11/2013
        17/11/2013
        20/11/2013
    
    Sheet2 (E2 - E8):
        01/12/2013
        01/12/2013
        27/11/2013
        27/11/2013
        24/11/2013
        24/11/2013
        20/11/2013
        17/11/2013
    

    到目前为止我的代码:

    Private Sub transferPostings()
        Dim EarliesNewDate As Variant
        Dim FirsCandidateOverlappingRow, rowCountHist, onlyNewRowsCount As Integer
        Dim wsHist, wsNew As Worksheet
        Dim possibleDuplicates, onlyNew, FindRow As Range
    
        Set wsHist = Worksheets("Sheet1")
        Set wsNew = Worksheets("Sheet2")
    
        wsNew.Range("E1").End(xlDown).NumberFormat = "General"
        Range(wsHist.Range("E2"), wsHist.Range("E2").End(xlDown)).NumberFormat = "General"
    
        EarliesNewDate = wsNew.Range("E1").End(xlDown).Value
        Set FindRow = Range(wsHist.Range("E2"), wsHist.Range("E2").End(xlDown)).Find(EarliesNewDate)
    
        wsNew.Range("E1").End(xlDown).NumberFormat = "dd/mm/yyyy"
        Range(wsHist.Range("E2"), wsHist.Range("E2").End(xlDown)).NumberFormat = "dd/mm/yyyy"
        MsgBox FindRow.Row
    End Sub
    

    非常感谢任何有关此问题的帮助。

1 个答案:

答案 0 :(得分:0)

您的.Find命令未提供任何参数。这意味着它使用的是上次使用的参数(如果未在此会话中使用,则为默认值)。至少应该使用LookIn:=xlValues,您应该指定LookAt:=xlWhole

Sub transferPostings()
    Dim EarliesNewDate As Variant
    Dim FirsCandidateOverlappingRow, rowCountHist, onlyNewRowsCount As Integer
    Dim wsHist As Worksheet, wsNew As Worksheet
    Dim possibleDuplicates, onlyNew, FindRow As Range

    Set wsHist = Worksheets("Sheet1")
    Set wsNew = Worksheets("Sheet2")

    wsNew.Range("E1").End(xlDown).NumberFormat = "General"
    Range(wsHist.Range("E2"), wsHist.Range("E2").End(xlDown)).NumberFormat = "General"

    EarliesNewDate = wsNew.Range("E1").End(xlDown).Value
    Set FindRow = wsHist.Range(wsHist.Range("E2"), wsHist.Range("E2").End(xlDown)).Find(What:=EarliesNewDate, LookIn:=xlValues, LookAt:=xlWhole)

    wsNew.Range("E1").End(xlDown).NumberFormat = "dd/mm/yyyy"
    Range(wsHist.Range("E2"), wsHist.Range("E2").End(xlDown)).NumberFormat = "dd/mm/yyyy"
    MsgBox FindRow.Row
End Sub

你没有提到Sheet1!E:E中的日期是公式的结果。我强烈怀疑他们是,而且值得一提。

顺便说一句,当声明为Dim wsHist, wsNew As Worksheet时, wsHist 是变体而不是工作表。在这种情况下它并不重要,但您应该知道如何为将来的实践声明变量。有关详细信息,请参阅Declaring VariablesDeclaring Variables