Excel VBA运行时错误'424'排查及库存申请单数据校验需求
解决Excel VBA运行时错误424及完善库存申请单校验逻辑
一、先修复运行时错误'424'
你遇到的需要对象错误,根源有两个:
- 错误使用
.Select:Set myCellRange = ... .Select是错误写法——Select是执行选中单元格的操作,不会返回Range对象,而Set语句要求右侧必须是可赋值的对象,所以得去掉末尾的.Select。 - 未指定目标工作表:如果当前激活的不是
TestOrder工作表,Range会默认指向激活表,导致引用错误。一定要明确指定工作表,避免这种隐性bug。
修正后的单列范围赋值代码如下:
Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("TestOrder") ' 明确绑定目标工作表 Dim lastRow As Long lastRow = ws.Range("M" & ws.Rows.Count).End(xlUp).Row ' 获取M列最后一行有数据的行号 Dim myCellRange As Range Set myCellRange = ws.Range("M7:M" & lastRow) ' 正确赋值Range对象
二、完善L、M列的关联校验逻辑
接下来我们把校验逻辑扩展到数量(L列)和客户代码(M列)的关联检查,核心是遍历每一行,确保两者的非空状态一致:
- 若某行L列(数量)有值,同行M列(客户代码)不能为空
- 若某行M列(客户代码)有值,同行L列(数量)不能为空
三、完整的校验代码
把所有校验逻辑整合到你的btn_test_checkdata过程中,替换原来的错误代码块:
Sub btn_test_checkdata() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("TestOrder") ' 绑定目标工作表 ' 校验申请人(D2)和处理人(F2)是否为空(保留你已实现的逻辑并优化) If ws.Range("D2").Value = "" Then MsgBox "必须选择申请人姓名缩写!", vbOKOnly, "必填项缺失" ws.Range("D2").Select Exit Sub End If If ws.Range("F2").Value = "" Then MsgBox "必须选择处理人姓名缩写!", vbOKOnly, "必填项缺失" ws.Range("F2").Select Exit Sub End If ' 获取数据区域的最后一行(取L、M列最大行号,避免漏检) Dim lastRowL As Long, lastRowM As Long, lastRow As Long lastRowL = ws.Range("L" & ws.Rows.Count).End(xlUp).Row lastRowM = ws.Range("M" & ws.Rows.Count).End(xlUp).Row lastRow = IIf(lastRowL > lastRowM, lastRowL, lastRowM) ' 遍历每一行,检查L和M列的关联规则 Dim i As Long For i = 7 To lastRow ' 情况1:已填写数量但客户代码为空 If ws.Range("L" & i).Value <> "" And ws.Range("M" & i).Value = "" Then MsgBox "第" & i & "行:已填写数量,但客户代码不能为空!", vbOKOnly, "数据不完整" ws.Range("M" & i).Select Exit Sub End If ' 情况2:已填写客户代码但数量为空 If ws.Range("M" & i).Value <> "" And ws.Range("L" & i).Value = "" Then MsgBox "第" & i & "行:已填写客户代码,但数量不能为空!", vbOKOnly, "数据不完整" ws.Range("L" & i).Select Exit Sub End If Next i ' 所有校验通过,可在此添加筛选和邮件发送逻辑 MsgBox "所有校验通过,可执行后续操作!", vbInformation, "校验完成" End Sub
四、额外优化建议
- 避免使用
[D2]这类简写,改用ws.Range("D2")更清晰且不易出错。 - 取L、M列最大行号作为遍历终点,确保不会漏掉仅某一列有值的行。
- 校验不通过时直接定位到错误单元格,方便用户快速修正。
内容的提问来源于stack exchange,提问作者PaulJ
相关产品推荐
相关产品推荐

