如何使match()在excel vba中使用日期?

Tin*_*ing 5 excel vba excel-vba

我有问题使match()在excel VBA中工作.代码是:

x = Application.Match("Sep 2008", Range("F1:F1"), 0)
Run Code Online (Sandbox Code Playgroud)

单元格F1中的值是9/1/2008.

即使我将2008年9月更改为2008年9月9日,它仍然没有返回任何值.

知道怎么解决吗?

use*_*261 13

之所以 Even if I changed Sep 2008 to 9/1/2008, it still doesn't return any value.

是因为当excel中有一个Date时,Excel会自动将该日期转换为数值,您真正想要搜索的是:

39692

此数字是9/1/2008默认值为1/1/1900 之间的天数

excel中的每个日期都存储有这样的值.因此,处理此问题的最简单方法是将您看到的日期转换为Excel使用的日期CDate().

这本身就会给你一个无用的错误,即vba无法获得该属性.

这是因为Lookup_value可以是值(数字,文本或逻辑值)或对数字,文本或逻辑值的单元格引用.不是日期,所以只需将now date值转换为数字,即可使用列表搜索匹配的数字CLng()

给它一个镜头它也会比使用Find替代方法快得多:

x = WorksheetFunction.Match(CLng(CDate("Sep 2008")), Range("F1:F1"), 0)
Run Code Online (Sandbox Code Playgroud)

这应该给你预期的结果

要在没有找到匹配项时进行处理,请尝试以下

Sub MatchDate()
Dim myvalue As Double
Dim LastRow As Long

LastRow = Cells(Rows.Count, "F").End(xlUp)

On Error GoTo NotFound
myvalue = WorksheetFunction.Match(CLng(CDate("Sep 2008")), Range("F1:F" & LastRow), 0)
MsgBox (myvalue)
End

NotFound:
MsgBox ("No Match Was Found")
End

End:
End Sub
Run Code Online (Sandbox Code Playgroud)

  • @glh没有任何个人的承诺,我只是想确保他们理解为什么我看到他们已经有了一个有效的解决方案时给了他们另一种选择. (2认同)

glh*_*glh 5

你最好的选择是使用.Find().这将返回range如果找到或nothing如果没有.

Set x = Range("F1:F1").Find(CDate("Sept 2008"), , , xlWhole)
Run Code Online (Sandbox Code Playgroud)

如果您想要列号:

x = Range("F1:F1").Find(CDate("Sept 2008"), , , xlWhole).Column
Run Code Online (Sandbox Code Playgroud)

捕获未找到

Sub test()

    Dim y As Date, x As Variant, c As Long
    y = CDate("Sep 2008")
    Set x = Range("1:1").Find(y, , , xlWhole)
    If Not x Is Nothing Then
        c = x.Column '<~~found
    Else
        Exit Sub 'not found
    End If

End Sub
Run Code Online (Sandbox Code Playgroud)