7

我在使 match() 在 excel VBA 中工作时遇到问题。代码是:

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

单元格 F1 中的值为 2008 年 9 月 1 日。

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

知道如何解决吗?

4

6 回答 6

16

之所以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
于 2013-05-10T14:03:22.653 回答
7

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

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
于 2013-05-10T13:27:22.213 回答
4

底线:

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

  • 或者,使用Date单元格的Value2属性(也将是 a Double而不是Value搜索键。

CLng在其他答案中建议将丢弃date.

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


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

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

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

由于Date内部已经是浮点数,CDbl(date)因此实际上不会更改数据。

对于Currency类型,CDbl确实会更改数据,所以这是毫无疑问的。所以要么

于 2017-07-09T06:56:31.477 回答
1

这样它就可以使用这种方法工作:

Nbr,L, C作为整数

Datedeb作为日期

nbr = WorksheetFunction.Match(CLng(CDate(Datedeb)), Range(Cells(L, C), Cells(L + 100, C)), 0)
于 2017-04-02T16:55:29.983 回答
0

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

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

YourVar = Format("YourDate","mmm-yyyy") YourResult = Application.match(Clng(Cdate(YourVar)), YourRange, 0)

问候

吉尔斯

于 2014-08-13T15:09:31.307 回答
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
于 2013-05-10T13:34:09.980 回答