我在使 match() 在 excel VBA 中工作时遇到问题。代码是:
x = Application.Match("Sep 2008", Range("F1:F1"), 0)
单元格 F1 中的值为 2008 年 9 月 1 日。
即使我将 2008 年 9 月更改为 2008 年 9 月 1 日,它仍然没有返回任何值。
知道如何解决吗?
之所以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 中的每个日期都存储有这样的值。因此,处理此问题的最简单方法是将您看到的日期转换为 excel 看到的日期,使用CDate()
.
这本身会给您一个无用的错误,即 vba 无法获取该属性。
这是因为 Lookup_value 可以是值(数字、文本或逻辑值)或对数字、文本或逻辑值的单元格引用。不是日期,因此只需将现在的日期值转换为数字即可使用在列表中搜索匹配的数字CLng()
试一试,它也会比使用 Find 替代方法快得多:
x = WorksheetFunction.Match(CLng(CDate("Sep 2008")), Range("F1:F1"), 0)
这应该会给你预期的结果
要在未找到匹配项时进行处理,请尝试以下子:
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
你最好的选择是使用.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
底线:
利用WorksheetFunction.Match(CDbl(date), range, 0)
或者,使用Date
单元格的Value2
属性(也将是 a Double
)而不是Value
搜索键。
CLng
在其他答案中建议将丢弃date
.
数据类型存在同样的问题,Currency
但您不能使用CDbl
它(请参阅下面的选项)。
Range.Value2 属性 (Excel)文章建议Date
和Currency
类型是“特殊的”,因为它们具有与显示值形成鲜明对比的“内部表示”。的确:
显然,Match
出于性能原因比较这些内部值。因此,我们必须确保它们,而不是可读的表示,完全匹配。
由于Date
内部已经是浮点数,CDbl(date)
因此实际上不会更改数据。
对于Currency
类型,CDbl
确实会更改数据,所以这是毫无疑问的。所以要么
Round
如果要比较的值来自其他地方和/或您只需要等于 2 个小数位,则使范围内的单元格实际上是带有 ) 的公式这样它就可以使用这种方法工作:
Nbr,L, C
作为整数
Datedeb
作为日期
nbr = WorksheetFunction.Match(CLng(CDate(Datedeb)), Range(Cells(L, C), Cells(L + 100, C)), 0)
我知道这篇文章很旧,但我遇到了同样的问题,并且确实找到了答案。
要使其正常工作,您首先需要让 VBA 看到与您的 excel 电子表格中相同的数据格式:
YourVar = Format("YourDate","mmm-yyyy") YourResult = Application.match(Clng(Cdate(YourVar)), YourRange, 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