使用 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