【问题标题】:Range.Find function in Excel VBA not able to find rowExcel VBA中的Range.Find函数无法找到行
【发布时间】:2014-10-12 14:24:48
【问题描述】:

我的 VBA 子例程似乎找不到匹配日期的行。

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

我的流程是:

  1. 在 Sheet2 中查找日期最早的行
  2. 在 Sheet1 中使用 同一日期并返回该行的行号。

会发生什么

当我运行我的 sub 时,我得到的是运行时错误 '91' - 对象变量或未设置块变量。 如果我尝试“Msgbox FindRow Is Nothing”,我会得到真正的回应。

这是没有意义的,因为在这个系统中 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

非常感谢您对此问题的任何帮助。

【问题讨论】:

  • 你在E1有什么吗?还是E1为空?
  • 您的国际设置是什么?使用我的美国设置,您的日常工作将按设计进行。所有日期值都是真的日期吗?还是其中一些是日期的文本表示形式?
  • 似乎“EarliesNewDate”在我的本地代码中被声明为“日期”。当将其声明为 double 时,代码也对我有用。

标签: excel vba


【解决方案1】:

您的.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 了解更多详情。

【讨论】:

  • 你给了我正确的方向。这是一个变量声明问题。在我的本地代码中,“EarliesNewDate”被声明为“日期”。当使用数据类型进行调试时,它被认为是双精度的。现在可以了。
猜你喜欢
  • 2015-11-10
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多