如何在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
如果nothing
find或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键。
CLng
build议在其他答案中会放弃时间的一部分date
。
Currency
数据types存在同样的问题,但不能使用CDbl
(请参阅下面的选项)。
Range.Value2属性(Excel)文章build议Date
和Currency
types是“特殊的”,因为它们具有与显示值形成鲜明对比的“内部表示”。 确实:
-
Date
在内部表示为IEEE 64位(8字节)浮点数,其中整数部分是date,小数部分是时间 -
Currency
也是8个字节,但被视为一个定点数字,有4个小数位(一个10,000的整数)
显然,由于性能原因, Match
比较这些内部值。 所以,我们必须确保他们,而不是可读的表示,完全匹配。
由于Date
在内部已经是浮点数,所以CDbl(date)
实际上并没有改变数据。
对于Currency
types, CDbl
确实会改变数据,所以没有问题。 所以要么
- 如果您需要完全匹配,请使用这种或那种方式的密钥的精确表示(至4个小数位)
- 如果要比较的值来自其他地方和/或您只需要相等到2个小数位