VBA运行时错误1004:fm、sm为空致求和语句执行失败求助
解决VBA运行时错误1004:变量fm/sm为空的问题
首先直接点破问题核心:你的代码里fm和sm只有在特定条件触发时才会被赋值,如果循环过程中没找到符合要求的行,这两个变量会保持初始的Empty状态,调用WorksheetFunction.Sum时引用空单元格范围,自然会抛出1004错误。
具体触发场景
看你的循环逻辑就能发现漏洞:
fm仅在第一次匹配wo和leg时(j=1)才会被赋值sm仅在找到匹配rc的行时才会被赋值,且找到后直接Exit For
如果出现以下情况,变量就会为空:
- 虽然
CountIfs返回大于0,但循环中没找到同时匹配wo+leg+rc的行(比如CountIfs统计的是其他组合) - 第一个匹配
wo+leg的行之后,没有找到对应rc的行 - 循环根本没进入(比如
sr大于lr)
修复后的代码(带关键注释)
Private Sub TextBox6_Change() Dim ws As Worksheet Dim sr, leg, lr, fm, sm, tval, sval, i, j As Long Dim wo, rc As String ' 初始化变量,避免Empty状态导致后续错误 fm = 0 sm = 0 tval = 0 sval = 0 Set ws = ThisWorkbook.Worksheets("Cost Analysis") sr = 5 ' 起始行 ' 注意:Rows.Count前加ws,避免引用活动工作表的行数 lr = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row wo = Trim(UserForm1.TextBox4.Value) leg = Trim(UserForm1.TextBox5.Value) rc = Trim(UserForm1.ComboBox3.Value) ' 先验证所有输入不为空,且起始行<=最后一行(避免无效循环) If wo <> "" And leg <> "" And rc <> "" And Trim(TextBox6.Value) <> "" And sr <= lr Then ' CountIfs的范围修正:Resize(lr - sr + 1,1)确保只覆盖sr到lr的行 If Application.WorksheetFunction.CountIfs( _ ws.Cells(sr, 1).Resize(lr - sr + 1, 1), wo, _ ws.Cells(sr, 4).Resize(lr - sr + 1, 1), leg, _ ws.Cells(sr, 5).Resize(lr - sr + 1, 1), rc) > 0 Then j = 0 For i = sr To lr ' 先匹配wo和leg If Trim(ws.Cells(i, 1)) = wo And Trim(ws.Cells(i, 4)) = leg Then j = j + 1 ' 记录第一个匹配wo+leg的行 If j = 1 Then fm = i End If ' 找到匹配rc的行,记录并退出循环 If Trim(ws.Cells(i, 5)) = rc Then sm = i Exit For End If End If Next i ' 关键:计算Sum前先验证fm和sm都是有效的行号 If fm > 0 And sm > 0 And fm <= sm Then ' 用Application.Sum替代WorksheetFunction.Sum,遇到错误返回#VALUE!而非直接抛错 tval = Application.Sum(ws.Range(ws.Cells(fm, 11), ws.Cells(sm, 11))) ' 用Val转换文本框值为数值,避免字符串相乘出错 sval = tval * Val(Trim(TextBox6.Value)) End If End If End If ' 赋值给文本框,即使tval/sval为0也不会出错 UserForm1.TextBox7 = tval UserForm1.TextBox16 = sval End Sub
核心优化点
- 变量初始化:给fm、sm、tval、sval设置初始值0,彻底避免Empty状态
- 范围修正:
Resize(lr - sr + 1, 1)确保CountIfs只统计目标行范围,避免无效行干扰 - 安全判断:计算Sum前检查fm和sm的有效性,避免引用无效单元格范围
- 错误容忍:
Application.Sum比WorksheetFunction.Sum更灵活,遇到错误会返回错误值而非直接终止程序 - 数值转换:用
Val()确保文本框输入被转为数值,避免字符串类型导致的运算错误
内容的提问来源于stack exchange,提问作者TCO
相关产品推荐
相关产品推荐

