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
相关产品推荐
相关产品推荐

