VBA / Excel:查找包含特定值的行

时间:2018-08-03 00:17:17

标签: excel vba excel-vba

我有一个Excel WS,其中A列中的每个单元格都是按顺序排列的日期。

    A    |
----------
1/01/2016
...
12/31/2019

使用VBA,如何返回找到特定日期的行号? 像这样:

Private Sub btnSubmit_Click()

    today = Date

    row_today = ThisWorkbook.Sheets("Sheet1").Range("A:A").Find(What:=today, LookIn:=x1Values)

    MsgBox row_today

End Sub

3 个答案:

答案 0 :(得分:2)

优良作法是在子例程的开始处声明变量,在这种情况下,这将有助于您找到错误。另一个问题是.Find当前正在返回一个范围,您希望在其中查看该范围的行号。我将在下面说明如何解决这两个问题:


声明变量

您要在代码中返回:

  • today作为日期和
  • row_today作为长整数

编辑:我以前建议将row_today声明为integer。如果行号大于32,767,将产生错误;否则,将产生错误。所以我修改为long,它可以轻松处理超过200万行

但是您当前正在返回:

  • today作为变体和
  • row_today作为变体

您可以这样声明它们:

Dim today As Date
Dim row_today As Long

使用。查找

在代码的这一行:

row_today = ThisWorkbook.Sheets("Sheet1").Range("A:A").Find(What:=today, LookIn:=x1Values)

首先,您有一个错字-应该是LookIn:=xlValues而不是LookIn:=x1Values

第二,您将返回包含所要查找日期的单元格范围。有关.Find方法的更多信息,请阅读MSDN Doc here

要返回行号,只需在末尾添加.Row,如下所示:

row_today = ThisWorkbook.Sheets("Sheet1").Range("A:A").Find(What:=today, LookIn:=x1Values).Row

因此您的最终代码应如下所示:

Private Sub btnSubmit_Click()

Dim today As Date
Dim row_today As Long

today = Date
row_today = ThisWorkbook.Sheets("Sheet1").Range("A:A").Find(What:=today, LookIn:=xlValues).Row

Debug.Print row_today

End Sub

答案 1 :(得分:0)

替换

row_today = ThisWorkbook.Sheets("Sheet1").Range("A:A").Find(What:=today, LookIn:=x1Values)
MsgBox row_today

使用

set row_today = ThisWorkbook.Sheets("Sheet1").Range("A:A").Find(What:=today, LookIn:=x1Values)
MsgBox row_today.value

答案 2 :(得分:0)

在您找不到今天的日期的情况下,接受的答案将给您一个错误:
.find将返回nothing,然后添加的.row将以错误停止代码。

建议稍微更改一下代码以解决找不到任何东西的问题:

Private Sub btnSubmit_Click()

Dim today As Date
Dim row_today As Long

today = Date

With ThisWorkbook.Sheets("Sheet1").Range("A:A")

    If .Find(What:=today, LookIn:=xlValues) is not Nothing then
        row_today = .Find(What:=today, LookIn:=xlValues).Row
    Else
        MsgBox "Today's date not found"
    End If

End With

End Sub