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

时间:2013-05-10 13:13:56

标签: excel excel-vba vba

我在使用excel VBA时匹配()工作时遇到问题。代码是:

x = Application.Match("Sep 2008", Range("F1:F1"), 0)

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

即使我将2008年9月更改为9/1/2008,它仍然不会返回任何值。

知道怎么解决吗?

6 个答案:

答案 0 :(得分:12)

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

的原因

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

39692

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

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

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

这是因为Lookup_value可以是值(数字,文本或逻辑值)或对数字,文本或逻辑值的单元格引用。不是日期,只需将现在日期值转换为数字,即可使用CLng()

在列表中搜索匹配的数字

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

x = WorksheetFunction.Match(CLng(CDate("Sep 2008")), Range("F1:F1"), 0)

这应该会给你预期的结果

要在未找到匹配项时进行处理,请尝试使用此Sub:

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

答案 1 :(得分:5)

最好的办法是使用.Find()。如果找到,会返回range ,如果没有,则会nothing

Set x = Range("F1:F1").Find(CDate("Sept 2008"), , , xlWhole)

如果您想要列号

x = Range("F1:F1").Find(CDate("Sept 2008"), , , xlWhole).Column

捕获未找到

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

答案 2 :(得分:2)

底线:

  • 使用WorksheetFunction.Match(CDbl(date), range, 0)

  • 或者,使用Date单元格Value2属性(也将是Double代替搜索键Value

其他答案中建议的

CLng会丢弃date的时间部分。

Currency数据类型存在同样的问题,但您无法使用CDbl(请参阅下面的选项)。

Range.Value2 Property (Excel)文章表明DateCurrency类型是&#34;特殊&#34;因为他们有一个内部代表和#34;这与显示的价值形成鲜明对比。事实上:

  • Date在内部表示为IEEE 64位(8字节)浮点数,其中整数部分是日期,小数部分是时间
  • Currency也是8字节,但被视为具有4个小数位的定点数(整数按10&#39,000整数)

显然,出于性能原因,Match会比较这些内部值。因此,我们必须确保它们而不是可读的表示形式完全匹配。

由于Date内部已经是浮点数,CDbl(date)实际上并未实际更改数据。

对于Currency类型,CDbl确实会更改数据,因此无法解决问题。所以要么

答案 3 :(得分:1)

这种方式可以使用这种方法:

Nbr,L, C为整数

Datedeb作为日期

nbr = WorksheetFunction.Match(CLng(CDate(Datedeb)), Range(Cells(L, C), Cells(L + 100, C)), 0)

答案 4 :(得分:0)

我想我可以放心地假设F1中的值是一个日期。你的代码“Sep 2008”是一个字符串。只要数据类型不一致,您就永远无法获得成功的匹配。 如果您要查找日期,请确保第一个参数是日期。

Dim dSearchSDate As Date

dSearchSDate = "01/Sept/2008"

x = Application.Match(dSearchSDate, Range("F1:F1"), 0)

这是另一种可行的方法。

Sub temp()
Dim x
Dim dSearchSDate As Date

    dSearchSDate = "01/Sept/2008"

    If ThisWorkbook.Worksheets(1).Range("F1:F1").Value = dSearchSDate Then
        Debug.Print "Found it!"
    Else
        Debug.Print "Doh!!"
    End If

End Sub

答案 5 :(得分:0)

我知道这篇文章很老,但我遇到了同样的问题,并找到了答案。

要使其正常工作,首先需要让VBA看到与Excel电子表格中显示的数据格式相同的数据格式:

YourVar =格式(“YourDate”,“mmm-yyyy”) YourResult = Application.match(Clng(Cdate(YourVar)),YourRange,0)

此致

吉勒