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

VBA按日期条件跨工作簿复制数据时Match匹配报错

问题描述
  • 实现目标:基于用户窗体设置的筛选条件从database工作簿复制对应数据,最终需支持根据TextBox1、TextBox2输入的日期范围、ComboBox1选定值筛选,当前先调试单日期匹配场景。
  • 故障表现:代码运行时始终触发第一个IF判断分支,弹出*"No job started on that date."*提示,已验证无筛选条件时可正常复制全量数据。
问题根因
  1. 日期赋值逻辑错误:原代码中DateStart = 6 / 21 / 22是算术除法运算,VBA会直接计算6÷21÷22得到浮点数,并非合法日期值,和E列存储的日期格式完全不匹配,导致Match函数永远返回错误。
  2. 匹配逻辑写错:第二个匹配分支错误地用日期值去匹配A列(工作中心列),且错误判断CurrentRow变量而非WC匹配结果,第二个错误提示永远无法触发,也无法筛选出同时满足日期、工作中心条件的行。
  3. 流程逻辑漏洞:WC变量未显式声明,窗体在调用paste_values前就被卸载,过程无法读取控件输入值;文本框输入为空时仅弹提示未终止流程,仍会继续执行后续代码。
修正后可运行代码
Option Explicit

Sub paste_values()
    Dim wsSource As Worksheet
    Dim DateStart As Date
    Dim WC As String
    Dim DateMatchRow As Variant
    Dim WCMatchRow As Variant
    Dim wbSource As Workbook
    
    ' 打开源工作簿
    Set wbSource = Workbooks.Open("C:\Users\115485\OneDrive - HUBBELL INC\Desktop\Labor tracking\database.xlsm")
    Set wsSource = wbSource.Sheets("database")
    
    ' 读取筛选值,单日期调试完成后可直接替换为控件取值
    DateStart = DateValue("6/21/2022") ' 正式环境替换为 DateValue(TextBox1.Value)
    WC = ComboBox1.Value
    
    ' 匹配日期列
    DateMatchRow = Application.Match(DateStart, wsSource.Range("E:E"), 0)
    If IsError(DateMatchRow) Then
        MsgBox "No job started on that date."
        wbSource.Close SaveChanges:=False
        Exit Sub
    End If
    
    ' 匹配工作中心列
    WCMatchRow = Application.Match(WC, wsSource.Range("A:A"), 0)
    If IsError(WCMatchRow) Then
        MsgBox "No job completed at this WC."
        wbSource.Close SaveChanges:=False
        Exit Sub
    End If
    
    ' 复制匹配数据粘贴为值
    wsSource.Range("A" & DateMatchRow).Copy
    ThisWorkbook.Sheets("Efficiency").Range("A2").PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    
    ' 关闭保存源工作簿
    wbSource.Close SaveChanges:=True
End Sub

Private Sub ComboBox1_Change()

End Sub

Private Sub CommandButton1_Click()
    ' 输入校验不通过直接终止流程
    If TextBox1.Value = "" Then
       MsgBox "YOU DID NOT ENTER A DATE."
       Exit Sub
    End If
    ' 逻辑执行完成后再卸载窗体,避免控件值丢失
    Call paste_values
    Unload Me
End Sub

Private Sub CommandButton2_Click()
    Unload Me
End Sub

Private Sub UserForm_Click()

End Sub
后续扩展提示
  • 单日期调试完成后,实现日期范围筛选不需要用Match逐行匹配,可改用AutoFilter直接筛选E列日期在起止区间内、A列等于选中工作中心的行,再批量复制可见单元格,执行效率高很多。
  • 从文本框读取日期时建议增加格式校验,避免用户输入非法日期导致运行报错。

内容的提问来源于stack exchange,提问作者Jonathan Kaufman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:16:01