我有一个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
答案 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