VBA运行时错误1004:Application.WorksheetFunction.Match无法获取Match属性求助
问题描述
我尝试创建多个用户窗体来更新我的数据表,我有一个CTR汇总信息数据表,由于需要填写的列太多,将所有信息放在同一个表单里会非常混乱,因此我根据需要更新的板块拆分了多个分段表单。
点击更新命令按钮后会跳转到更新表单,从列表框中拉取我需要的对应板块数据信息,如下图所示:
我修改文本框中的值后点击更新,就抛出错误:Application.WorksheetFunction.Match Unable to get the Match Property of the Work,以下是我的代码:
Private Sub UPDATE_Click() If MsgBox(" Check the Data Again ", vbYesNo, "Proceed to Subcontractor Form Information if Any") = vbYes Then ' write the data to the worksheet from controls Call WriteDataToTheSheet ' empty the textboxes Call EmptyTextBoxes Else ' empty the textboxes Call EmptyTextBoxes End If End Sub
'UPDATE CODE Private Sub WriteDataToTheSheet() With Sheet2 Dim selectedRow As Long LRow = .Range("A" & .Rows.Count).End(xlUp).row selectedRow = Application.WorksheetFunction.Match(WONUMBER.Value, Sheet2.Range("I2:I" & LRow), 0) .Cells(selectedRow, 1).Value = Now .Cells(selectedRow, 2).Value = NAMACLIENT.Value .Cells(selectedRow, 3).Value = BLANKETNUMBER.Value .Cells(selectedRow, 4).Value = CTRNUMBER.Value .Cells(selectedRow, 5).Value = PICBIRU.Value .Cells(selectedRow, 6).Value = PICCLIENT.Value .Cells(selectedRow, 7).Value = PROJECTSTATUS.Value .Cells(selectedRow, 8).Value = PROJECTTITLE.Value .Cells(selectedRow, 9).Value = WONUMBER.Value .Cells(selectedRow, 10).Value = WODIR.Value .Cells(selectedRow, 11).Value = WOSTARTDATE.Value .Cells(selectedRow, 12).Value = WOENDDATE.Value .Cells(selectedRow, 13).Value = REMARKS.Value .Cells(selectedRow, 14).Value = WAPU.Value .Cells(selectedRow, 17).Value = ENGVALUE.Value .Cells(selectedRow, 18).Value = REIMBURSABLE.Value End With End Sub
补充说明:
Excel数据截图:

调试代码截图:
问题原因及修复方案
错误原因
这个报错的核心是Application.WorksheetFunction.Match在指定范围内找不到和WONUMBER.Value匹配的值时,会直接抛出运行时错误,常见触发场景有3种:
WONUMBER文本框的内容和I列存储的WO编号格式不匹配,比如I列是数字格式、文本框取到的是字符串格式,或者内容前后多了空格、不可见字符- 要匹配的WO编号确实不存在于指定的搜索范围内
- 原代码用A列统计最后一行,若A列存在空值、I列数据比A列更长,会导致搜索范围漏掉后面的行,无法匹配到目标值
修复代码
把WriteDataToTheSheet的逻辑替换为以下内容即可:
Private Sub WriteDataToTheSheet() With Sheet2 Dim selectedRow As Variant ' 用Variant类型接收,匹配不到时会存储错误值 Dim LRow As Long ' 改用I列统计最后一行,避免搜索范围漏行 LRow = .Range("I" & .Rows.Count).End(xlUp).Row ' 改用Application.Match不会直接抛错,返回错误值可被捕获 selectedRow = Application.Match(Trim(WONUMBER.Value), .Range("I2:I" & LRow), 0) ' 先判断是否匹配到结果 If IsError(selectedRow) Then MsgBox "找不到WO编号为【" & WONUMBER.Value & "】的记录,请检查编号是否正确", vbCritical Exit Sub End If ' Match返回的是搜索范围(从I2开始)的相对行,加1才是工作表实际行号 selectedRow = selectedRow + 1 ' 原有赋值逻辑保持不变 .Cells(selectedRow, 1).Value = Now .Cells(selectedRow, 2).Value = NAMACLIENT.Value .Cells(selectedRow, 3).Value = BLANKETNUMBER.Value .Cells(selectedRow, 4).Value = CTRNUMBER.Value .Cells(selectedRow, 5).Value = PICBIRU.Value .Cells(selectedRow, 6).Value = PICCLIENT.Value .Cells(selectedRow, 7).Value = PROJECTSTATUS.Value .Cells(selectedRow, 8).Value = PROJECTTITLE.Value .Cells(selectedRow, 9).Value = WONUMBER.Value .Cells(selectedRow, 10).Value = WODIR.Value .Cells(selectedRow, 11).Value = WOSTARTDATE.Value .Cells(selectedRow, 12).Value = WOENDDATE.Value .Cells(selectedRow, 13).Value = REMARKS.Value .Cells(selectedRow, 14).Value = WAPU.Value .Cells(selectedRow, 17).Value = ENGVALUE.Value .Cells(selectedRow, 18).Value = REIMBURSABLE.Value End With End Sub
如果修改后仍然提示找不到记录,确认WO编号是数字类型的话,可以把匹配语句里的Trim(WONUMBER.Value)改成Val(WONUMBER.Value)统一格式即可。
内容的提问来源于stack exchange,提问作者muntun
相关产品推荐
相关产品推荐

