在列表中查找日期的匹配会根据日期的格式产生不同的答案

问题描述 投票:0回答:1

我在 A 列上有一个按升序排序的日期列表(工作日,无周末)。该列有一个字符串标题,内容为“日期”。该列的格式为 m/d/yyyy。
单元格 A2 上的第一个日期是 5/28/1998。
单元格 A6216 的最后日期是 2/9/2023。

我的手机 AG275 上的日期是 1999 年 6 月 28 日。我需要在 A 列上找到该日期的行。

只要 A 列和单元格 AG275 的格式都设置为常规,此代码即可查找日期。
在这种情况下,单元格 AG275 读取为 36337,答案(下面代码中的变量 a)返回 275,即 36337 所在的行。

Sub findDate()
    
    Dim dateToFind
    Dim arr()
    Dim Rng As Range
    
    dateToFind = Cells(275, "ag").Value
    
    Set Rng = Worksheets("calcSheet").Range("A1:A6216")
    
    arr = Rng
 
    a = WorksheetFunction.Match(dateToFind, arr, 1)
 
End Sub

问题是,如果 A 列和单元格 AG275 都被格式化为短日期,则代码答案(变量 a)不是 275,而是 1530,即 6/25/2004,在常规格式中为 38163(以下日期)单元格 A1531 是 6/28/2004)。

我可以在开始代码之前添加代码来重新格式化所有内容,并使用数字而不是日期,但我宁愿使用给定的日期。

如果所有内容都格式化为短日期,我怎样才能得到答案?

我怀疑问题可能与我声明变量和数组的方式有关。我尝试声明为 Date、Variant、Long 和 Integer。

我也尝试过,正如我在相关帖子中读到的那样,

dateToFind = CDate(Cells(275, "ag").Value)

dateToFind = CLng(CDate(Cells(275, "ag").Value))

长日期 (mm/dd/yyyy) 的行为是相同的。

excel vba date match
1个回答
1
投票

无论格式如何,如果单元格的内容是日期并且要查找的单元格的内容是日期,则以下内容将起作用:

Sub findDate()
    
    Dim dateToFind As Variant
    Dim Rng As Range
    
    dateToFind = Cells(275, "ag")
    
    Set Rng = Worksheets("calcSheet").Range("A1:A6216")
    a = Application.Match(CLng(dateToFind), Rng, 1)
 End Sub
© www.soinside.com 2019 - 2024. All rights reserved.