如何在excel vba中使用match()处理date?

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

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

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

即使我2008年9月更新到2008年9月1日,它仍然没有任何价值。

任何想法如何解决它?

你最好的select是使用.Find() 。 这将返回一个range如果nothingfind或nothing

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

如果你想要列号

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

捕获未find

 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 

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

是因为当Excel中有Date时,Excel会自动将该date转换为数字值,您真正想要search的是:

39692

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

excel中的每个date都存储着一个像这样的值。 所以处理这个问题最简单的方法就是把你所看到的date转换成Excel使用CDate()看到的date。

这本身会给你一个无用的错误,vba不能得到的财产。

这是因为Lookup_value可以是一个值(数字,文本或逻辑值),也可以是数字,文本或逻辑值的单元格引用。 不是一个date,所以简单地将现在的date值转换为一个数字来使用CLng()来search列表中的匹配数字。

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

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

这应该给你预期的结果

要处理没有find匹配时尝试这个子:

 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 

这种方式使用这种方法:

Nbr,L, C为整数

Datedeb作为date

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

我想我可以放心地假设F1中的价值是一个date。 在你的代码“2008年9月”是一个string。 只要数据types不一致,就永远无法获得成功的匹配。 如果您正在查找date,请确保第一个参数是date。

 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 

我知道这个post是旧的,但我有同样的问题,并find了答案。

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

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

问候

吉尔斯

底线:

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

  • 或者,使用Date单元格的Value2属性 (也将是一个Double而不是值为search键。

CLngbuild议在其他答案中会放弃时间的一部分date

Currency数据types存在同样的问题,但不能使用CDbl (请参阅下面的选项)。


Range.Value2属性(Excel)文章build议DateCurrencytypes是“特殊的”,因为它们具有与显示值形成鲜明对比的“内部表示”。 确实:

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

显然,由于性能原因, Match比较这些内部值。 所以,我们必须确保他们,而不是可读的表示,完全匹配。

由于Date在内部已经是浮点数,所以CDbl(date)实际上并没有改变数据。

对于Currencytypes, CDbl确实会改变数据,所以没有问题。 所以要么

  • 如果您需要完全匹配,请使用这种或那种方式的密钥的精确表示(至4个小数位)
  • 如果要比较的值来自其他地方和/或您只需要相等到2个小数位