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

Excel VBA按钮宏执行报错1004及INDEX/MATCH取值异常问题咨询

问题排查与修复方案

你的代码存在多处基础语法和逻辑错误,逐个修正如下:

核心错误列表

  • 变量赋值逻辑完全错误:你写的a = Range("M8").FormulaR1C1 = "xxx"是布尔比较逻辑,VBA会先判断「单元格M8的公式是否等于后面的字符串」,再把判断结果(True/False,转数值是-1/0)赋值给a,所以a永远小于90,自然每次都触发第一个提示框。你需要先给单元格写入公式,再读取单元格的计算值。
  • R1C1引用语法错误:R0C0是非法写法,相对偏移0需要写为R[0]C[0]或者直接省略,非法公式会导致单元格取值错误。
  • 变量作用域与分支逻辑错误:answer变量仅在b=0的分支里声明赋值,其他分支访问会报错,同时你的条件分支缺少End If闭合。
  • Select操作非法:你在employee info工作表激活的状态下,直接选择另一个工作表的单元格,就会触发1004错误,VBA操作单元格完全不需要用Select,直接引用对象即可。
  • 判断条件重复:最后两个分支都写了c < 6,第二个分支永远不会执行,应该是一个小于6、一个大于等于6。

修正后完整代码

Private Sub Submitsp3_Click()
    Dim a As Long
    Dim b As Integer
    Dim c As Integer
    Dim answer As Integer ' 提前声明变量,保证全局可访问
    
    ' 正确写法:先给单元格写入公式,再读取计算结果
    Range("M8").FormulaR1C1 = "=INDEX(Employee_List[[#All],[Days Since Hire]],MATCH(R[0]C[-9],Employee_List[[#All],[ID '#]],0))"
    a = Range("M8").Value ' 读取单元格计算后的值
    Range("M8").FormulaR1C1 = "=INDEX(Employee_List[[#All],[Days left]],MATCH(R[0]C[0],Employee_List[[#All],[ID '#]],0))"
    b = Range("M8").Value
    
    If a < 90 Then
        MsgBox ("This employee does not yet have access to paid days off")
        Exit Sub ' 不符合条件直接结束宏,避免后续逻辑执行
    ElseIf b = 0 Then
        MsgBox ("This employee is out of paid off days")
        answer = MsgBox("Do you want to Continue?", vbQuestion + vbYesNo)
        If answer = vbNo Then
            MsgBox "Macro Ending"
            Exit Sub ' 选否直接结束
        End If
    End If
    
    ' 这里放你之前的复制粘贴逻辑
    
    ' 不需要Select,直接操作目标工作表的单元格
    With Sheets("raw list of dates off")
        .Range("A3").FormulaR1C1 = "=INDEX(Employee_List[[#All],[Days left]],MATCH(R[0]C[0],Employee_List[[#All],[ID '#]],0))"
        c = .Range("A3").Value
        If c < 6 Then
            .Range("D3").Formula = "=EDATE([@[Hire date]],12*INT(YEARFRAC([@[Hire date]],TODAY())+2))"
        Else ' 修正重复的判断条件
            .Range("D3").Formula = "=EDATE([@[Hire date]],12*INT(YEARFRAC([@[Hire date]],TODAY())+1))"
        End If
    End With
    
    Sheets("employee info").Select
    MsgBox ("Date added")
End Sub

额外注意事项

  • 如果你的员工ID不在M8向左偏移9列的位置,要对应调整R[0]C[-9]里的偏移量,避免匹配不到ID返回错误值。
  • 操作表格结构化引用的时候,确认表名Employee_List和列名没有拼写错误,否则也会触发公式计算错误。

内容的提问来源于stack exchange,提问作者Philopappus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 03:21:01