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

VBA运行时错误1004:fm、sm为空致求和语句执行失败求助

解决VBA运行时错误1004:变量fm/sm为空的问题

首先直接点破问题核心:你的代码里fm和sm只有在特定条件触发时才会被赋值,如果循环过程中没找到符合要求的行,这两个变量会保持初始的Empty状态,调用WorksheetFunction.Sum时引用空单元格范围,自然会抛出1004错误。

具体触发场景

看你的循环逻辑就能发现漏洞:

  • fm仅在第一次匹配wo和leg时(j=1)才会被赋值
  • sm仅在找到匹配rc的行时才会被赋值,且找到后直接Exit For
    如果出现以下情况,变量就会为空:
  1. 虽然CountIfs返回大于0,但循环中没找到同时匹配wo+leg+rc的行(比如CountIfs统计的是其他组合)
  2. 第一个匹配wo+leg的行之后,没有找到对应rc的行
  3. 循环根本没进入(比如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:47:44