在Excel VBA中对比Test工作表日期与360工作表数据库连接日期
解决日期匹配问题:让Test工作表的日期实际值为带前导零的MM/DD/YYYY格式
嘿,我懂你的困扰了——你碰到的核心问题是日期值和文本格式日期的不兼容。Test工作表里生成的是真正的日期类型数据,虽然你设置了单元格显示格式为mm/dd/yyyy,但当你用.Value读取它时,VBA会返回系统默认的短日期字符串(比如5/5/2018,不带前导零),而360工作表里从数据库拉取的是文本格式的05/05/2018,直接对比字符串自然匹配不上。
下面给你两种可行的解决方案,根据你想要让Test的日期实际值为MM/DD/YYYY格式的需求,我优先推荐第一种:
方案1:直接生成带前导零的文本格式日期
修改生成日期的代码,把日期值通过Format函数转换成带前导零的字符串,这样单元格的实际值就是你想要的MM/DD/YYYY格式文本,后续对比直接用字符串匹配即可。
修改后的完整代码:
Sub SMALLDATETEST() Dim wb As Workbook Dim wsTest As Worksheet, ws360 As Worksheet Dim iAddDays As Integer, iIncrementer As Integer, iNewIncrementer As Integer Dim sCurrentTestDate As String, sCurrent360Date As String ' 避免重复激活工作表,直接引用对象更高效 Set wb = Workbooks("Receiving Research.xlsx") Set wsTest = wb.Worksheets("Test") Set ws360 = wb.Worksheets("360") ' Generating Dates - 生成带前导零的文本格式日期 iAddDays = 0 For iIncrementer = 1 To 75 ' 使用Format函数将日期转成"mm/dd/yyyy"格式的文本 wsTest.Cells(iIncrementer, 1).Value = Format(DateAdd("d", iAddDays, "05/01/2018"), "mm/dd/yyyy") ' 设为文本格式确保显示和实际值一致 wsTest.Cells(iIncrementer, 1).NumberFormat = "@" iAddDays = iAddDays + 1 Next iIncrementer ' Comparing Dates - 直接对比字符串 For iIncrementer = 1 To 75 sCurrentTestDate = Trim(wsTest.Cells(iIncrementer, 1).Value) For iNewIncrementer = 3 To 20 sCurrent360Date = Trim(ws360.Cells(iNewIncrementer, 19).Value) ' 现在两个都是带前导零的字符串,可以直接匹配 If sCurrentTestDate = sCurrent360Date Then wsTest.Cells(iIncrementer, 2).Value = "Y" End If Next iNewIncrementer Next iIncrementer ' 释放对象 Set ws360 = Nothing Set wsTest = Nothing Set wb = Nothing End Sub
关键修改点:
- 用
Format(DateAdd("d", iAddDays, "05/01/2018"), "mm/dd/yyyy")替代原来的直接赋值日期值,生成带前导零的字符串。 - 将Test工作表的日期单元格格式设为
@(文本格式),确保显示和实际值完全一致。 - 去掉了重复的
Activate操作,直接引用工作表对象,代码更高效且不易出错。
方案2:保留日期类型,对比时统一格式
如果你想保留Test工作表的日期类型(方便后续做日期计算),可以在对比时把日期值转成格式化的字符串,再和360的文本日期对比:
修改对比部分的代码片段:
' Comparing Dates - 统一格式后对比 For iIncrementer = 1 To 75 ' 将Test的日期值转成"mm/dd/yyyy"格式的字符串 sCurrentTestDate = Format(wsTest.Cells(iIncrementer, 1).Value, "mm/dd/yyyy") For iNewIncrementer = 3 To 20 sCurrent360Date = Trim(ws360.Cells(iNewIncrementer, 19).Value) If sCurrentTestDate = sCurrent360Date Then wsTest.Cells(iIncrementer, 2).Value = "Y" End If Next iNewIncrementer Next iIncrementer
这种方式不需要修改生成日期的代码,只是在对比时做格式转换,适合需要保留日期数据类型的场景。
内容的提问来源于stack exchange,提问作者user4333011
相关产品推荐
相关产品推荐

