VBA按日期条件跨工作簿复制数据时Match匹配报错
问题描述
- 实现目标:基于用户窗体设置的筛选条件从
database工作簿复制对应数据,最终需支持根据TextBox1、TextBox2输入的日期范围、ComboBox1选定值筛选,当前先调试单日期匹配场景。 - 故障表现:代码运行时始终触发第一个IF判断分支,弹出*"No job started on that date."*提示,已验证无筛选条件时可正常复制全量数据。
问题根因
- 日期赋值逻辑错误:原代码中
DateStart = 6 / 21 / 22是算术除法运算,VBA会直接计算6÷21÷22得到浮点数,并非合法日期值,和E列存储的日期格式完全不匹配,导致Match函数永远返回错误。 - 匹配逻辑写错:第二个匹配分支错误地用日期值去匹配A列(工作中心列),且错误判断
CurrentRow变量而非WC匹配结果,第二个错误提示永远无法触发,也无法筛选出同时满足日期、工作中心条件的行。 - 流程逻辑漏洞:
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
相关产品推荐
相关产品推荐

