You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel VBA查找日期始终返回空值问题排查与解决

问题:VBA Range.Find在不同日期格式工作表中返回空值

我有一段VBA代码,在日期格式为d-mmm-yy的工作表中运行完全正常,但在日期格式为d/mm/yyyy的工作表中,查找操作始终返回空值。代码逻辑是:先在第一张工作表筛选出目标年月的日期,再到另一工作表查找该日期,复制对应行的单元格数据带回原工作表。

可运行版本代码

Set rngFnd = wsElog1.Range("A7:A37")

Dim i As Integer
i = 0
    For Each rngRow In rngInput.Rows
        vntInput = rngRow.Cells(1, 1)  ' Dates in Column A

        If IsDate(vntInput) = True Then  ' Ensure Excel sees the value as a date
        
            nYear = year(vntInput)
            nMonth = Month(vntInput)
        
            ' Is the date within target month/year?
            If nYear = nTargetYear And nMonth = nTargetMonth Then
               SrchDt = Format(rngRow.Value, "d-mmm-yy")
           
               Set rngFnd = wsElog1.Range("A7:A37").Find(SrchDt, LookIn:=xlValues)
           
                           
                    Set rngTarget = wsTEff.Range("B" & rngRow.Row)
            
                    wsElog1.Range("GW" & rngFnd.Row).Copy
                    rngTarget.Offset(0, 0).PasteSpecial xlPasteValues
                    wsElog1.Range("GX" & rngFnd.Row).Copy
                    rngTarget.Offset(0, 1).PasteSpecial xlPasteValues
                    wsElog1.Range("HL" & rngFnd.Row).Copy
                    rngTarget.Offset(0, 2).PasteSpecial xlPasteValues
                    wsElog1.Range("HH" & rngFnd.Row).Copy
                    rngTarget.Offset(0, 3).PasteSpecial xlPasteValues
                    wsElog1.Range("HK" & rngFnd.Row).Copy
                    rngTarget.Offset(0, 4).PasteSpecial xlPasteValues
                    wsElog1.Range("GZ" & rngFnd.Row).Copy
                    rngTarget.Offset(0, 5).PasteSpecial xlPasteValues
                    wsElog1.Range("HO" & rngFnd.Row).Copy
                    rngTarget.Offset(0, 6).PasteSpecial xlPasteValues
                    wsElog1.Range("HP" & rngFnd.Row).Copy
                    rngTarget.Offset(0, 7).PasteSpecial xlPasteValues
                
                         
                i = i + 1
            End If
        End If
    Next rngRow

不可运行版本代码

Dim c As Integer
c = 0
    For Each rngRow In rngInput.Rows
        vntInput = rngRow.Cells(1, 1)  ' Dates in Column A

        If IsDate(vntInput) = True Then  ' Ensure Excel sees the value as a date
        
            nYear = year(vntInput)
            nMonth = Month(vntInput)
        
            ' Is the date within target month/year?
            If nYear = nTargetYear And nMonth = nTargetMonth Then
               SrchDt1 = Format(rngRow.Value, "d/mm/yyyy")

               Set rngFndA = wsRlog.Range("A:A").Find(What:=SrchDt1, LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False)
           
                    Set RngTarget1 = wsTEff.Range("M" & rngRow.Row)
                
                    wsRlog.Range("CP" & rngFndA.Row).Copy
                    RngTarget1.Offset(0, 0).PasteSpecial xlPasteValues
                    wsRlog.Range("CM" & rngFndA.Row).Copy
                    RngTarget1.Offset(0, 1).PasteSpecial xlPasteValues
                    wsRlog.Range("CX" & rngFndA.Row).Copy
                    RngTarget1.Offset(0, 2).PasteSpecial xlPasteValues
                    wsRlog.Range("CS" & rngFndA.Row).Copy
                    RngTarget1.Offset(0, 3).PasteSpecial xlPasteValues
                    wsRlog.Range("CU" & rngFndA.Row).Copy
                    RngTarget1.Offset(0, 4).PasteSpecial xlPasteValues
                    wsRlog.Range("CN" & rngFndA.Row).Copy
                    RngTarget1.Offset(0, 5).PasteSpecial xlPasteValues
                    wsRlog.Range("CL" & rngFndA.Row).Copy
                    RngTarget1.Offset(0, 6).PasteSpecial xlPasteValues
                    wsRlog.Range("CD" & rngFndA.Row).Copy
                    RngTarget1.Offset(0, 7).PasteSpecial xlPasteValues

                         
                c = c + 1
            End If
        End If
    Next rngRow

问题现象

不可运行版本中,Range.Find方法对rngFndA始终返回空值,无法定位到目标日期单元格。

解决方案

给SrchDt1添加明确的日期类型声明:

Dim SrchDt1 As Date

原因说明

未声明类型时,Format函数返回的是字符串类型,而目标工作表中的日期是Excel内部存储的日期序列号(数值类型),仅显示为d/mm/yyyy格式。用字符串去匹配日期值时,容易因系统区域设置、格式细节差异导致匹配失败。声明为Date类型后,VBA会自动处理日期的实际数值匹配,不受显示格式影响,从而能正确找到目标单元格。

内容的提问来源于stack exchange,提问作者Kim Woods

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:57:05