使用 VBA 在 Excel 中将日期与数据连接日期进行比较

Posted

技术标签:

【中文标题】使用 VBA 在 Excel 中将日期与数据连接日期进行比较【英文标题】:Comparing Date to Data-Connection Date in Excel with VBA 【发布时间】:2018-05-15 21:54:29 【问题描述】:

我正在尝试将工作表“测试”中生成的日期与另一个工作表中的日期进行比较,该日期是从工作表“360”中的数据库连接生成的。我似乎无法让“测试”工作表中生成的日期具有“MM/DD/YYYY”的实际值。换句话说,我无法将单元格中的实际值设为“05/05/2018”,它始终将其生成为“5/5/2018”。我首先尝试更改它的格式,但这只是更改格式而不是数据。

“360”数据库连接中的日期作为“MM/DD/YYYY”的文本被拉入,为了比较两个工作表中的日期以查看何时匹配,我需要在“测试”工作表为“MM/DD/YYYY”。考虑到下面的代码,有谁知道如何生成“MM/DD/YYYY”的实际值?

Sub SMALLDATETEST()

Workbooks("Receiving Research.xlsx").Activate
Worksheets("Test").Activate

iAddDays = 0

For iIncrementer = 1 To 75

    'Generating Dates
    Cells(iIncrementer, 1).Value = DateAdd("d", iAddDays, "05/01/2018")
    Cells(iIncrementer, 1).NumberFormat = "mm/dd/yyyy"
    iAddDays = iAddDays + 1

Next iIncrementer

'Comparing Dates
For iIncrementer = 1 To 75
    Worksheets("Test").Activate

    sCurrentTestDate = Cells(iIncrementer, 1).Value
    Worksheets("360").Activate

    'MsgBox sCurrentTestDate

    For iNewIncrementer = 3 To 20

        sCurrent360Date = Cells(iNewIncrementer, 19).Value

       'If the dates match put a "Y" in the B column
        If Trim(sCurrentTestDate) = Trim(sCurrent360Date) Then
            Worksheets("Test").Activate
            Cells(iIncrementer, 2).Value = "Y"
        End If

    Next iNewIncrementer

Next iIncrementer

End Sub

【问题讨论】:

【参考方案1】:

我添加了一个附加列并使用以下内容将“测试”工作表中的文本转换为“MM/DD/YYYY”的实际格式:

Cells(iIncrementer, 2).Formula = "=TEXT(A" & iIncrementer & ",""mm/dd/yyyy"")"

完整的工作代码:

Sub DateTestingBD()

Workbooks("Receiving Research.xlsx").Activate
Worksheets("Test").Activate

iAddDays = 0

For iIncrementer = 1 To 75

    Cells(iIncrementer, 1).Value = DateAdd("d", iAddDays, "05/01/2018")
    Cells(iIncrementer, 2).Formula = "=TEXT(A" & iIncrementer & ",""mm/dd/yyyy"")"
    iAddDays = iAddDays + 1

Next iIncrementer

For iIncrementer = 1 To 75
Worksheets("Test").Activate

    sCurrentTestDate = Cells(iIncrementer, 2).Value
    Worksheets("360").Activate

    For iNewIncrementer = 3 To 20

        sCurrent360Date = Cells(iNewIncrementer, 19).Value

        If Trim(sCurrentTestDate) = Trim(sCurrent360Date) Then
            Worksheets("Test").Activate
            Cells(iIncrementer, 3).Value = "Y"
        End If

    Next iNewIncrementer

Next iIncrementer

End Sub

【讨论】:

【参考方案2】:

你有一个X/Y problem。

真正的日期只不过是一个长整数,表示自 1899 年 12 月 31 日以来的天数。无论您是比较 5/5/2018、05/05/2018 还是 43,225,都没有关系。就excel 而言,它们完全相同。

不同的是看起来像日期的文本。这些是字符串,字符串比较的基本规则适用;看起来像日期的文本永远不会等于真实日期。

在这种情况下,您有两个选择:

    将每个工作表中的日期转换为具有相同格式掩码的日期文本。这不被认为是“最佳实践”,因为日期变成了无用的文本标签。

    'on the worksheet
    =text(a1, "mm/dd/yyyy;@")
    
    ' in vba
    Cells(iIncrementer, 1).NumberFormat = "@" '<~~ set text format first
    Cells(iIncrementer, 1).Value = Format(DateAdd("d", iAddDays, dateserial(2018, 5, 1)), "mm/dd/yyyy")
    

    将每个工作表中的日期转换为真实日期。这是首选方法,因为日期可用于进一步计算。 您可以使用 Text-to-Columns 将整列看起来像日期的文本快速转换为真实日期。

【讨论】:

以上是关于使用 VBA 在 Excel 中将日期与数据连接日期进行比较的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBA 从 Access 表中将选定的列导入 Excel

VBA/Excel 中的最早日期为 00:00:00

使用 VBA 读写后 Excel 日期更改(月份和日期交换)

如何使用 VBA 在 Excel 注释中查找和替换日期格式

excel vba字符串到日期

添加日期列vba