【问题标题】:Comparing Date to Data-Connection Date in Excel with VBA使用 VBA 在 Excel 中将日期与数据连接日期进行比较
【发布时间】: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

【问题讨论】:

    标签: vba excel date format number-formatting


    【解决方案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,都没有关系。就 而言,它们完全相同。

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多