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

Excel VBA Submit按钮运行时错误1004:Range方法失败调试求助

报错根因

  • 你已经将Input_Date、Input_Journal_Code等变量声明为Range类型,且已经赋值为结构化表对应列的区域,后续调用时不需要再嵌套form.Range(),多余的嵌套会直接触发_worksheet对象的Range方法报错
  • 用ActiveSheet获取结构化表Input_Data不可靠,如果点击提交按钮时当前激活的不是Input表,会找不到对应表对象
  • 当前的写入逻辑不符合多分录日记账的需求:结构化表Input_Data可能存在多行分录,直接把整列区域赋值给Database的单个单元格,不仅会报错,也无法批量写入多行数据
  • 结构化表没有数据行时,DataBodyRange会返回空值,直接访问会触发报错

修复后的完整代码

Sub Submit_Data()

Dim database As Worksheet
Dim form As Worksheet

Set database = ThisWorkbook.Sheets("Database")
Set form = ThisWorkbook.Sheets("Input")

'''''''''' 数据校验 ''''''''''''''
If form.Range("H2").Value = True Then
    MsgBox "请输入交易日期", vbCritical, "数据录入表单"
    Exit Sub
End If

If form.Range("H4").Value = True Then
    MsgBox "请输入交易备注", vbCritical, "数据录入表单"
    Exit Sub
End If

If form.Range("H6").Value = True Then
    MsgBox "请选择日记账类型", vbCritical, "数据录入表单"
    Exit Sub
End If

If form.Range("L10").Value <> 0 Then
    MsgBox "借贷方金额不平", vbCritical, "数据录入表单"
    Exit Sub
End If

''''''''''''''''''''''''''''''''''''''

Dim Last_Row As Long
Dim Input_Data As ListObject
Dim i As Long
' 直接从Input表获取结构化表,避免ActiveSheet的问题
Set Input_Data = form.ListObjects("Input_Data")

' 先判断结构化表是否有数据
If Input_Data.DataBodyRange Is Nothing Then
    MsgBox "未录入分录明细", vbCritical, "数据录入表单"
    Exit Sub
End If

Last_Row = database.Range("D1").Value + 3

' 循环逐行写入分录到Database
For i = 1 To Input_Data.ListRows.Count
    database.Range("A" & Last_Row).Value = Input_Data.ListColumns("Date").DataBodyRange.Cells(i).Value
    database.Range("B" & Last_Row).Value = Input_Data.ListColumns("Journal Code").DataBodyRange.Cells(i).Value
    database.Range("C" & Last_Row).Value = Input_Data.ListColumns("Type").DataBodyRange.Cells(i).Value
    database.Range("D" & Last_Row).Value = Input_Data.ListColumns("Account Code").DataBodyRange.Cells(i).Value
    database.Range("E" & Last_Row).Value = Input_Data.ListColumns("Account Name").DataBodyRange.Cells(i).Value
    database.Range("F" & Last_Row).Value = Input_Data.ListColumns("Description").DataBodyRange.Cells(i).Value
    database.Range("G" & Last_Row).Value = Input_Data.ListColumns("Detail").DataBodyRange.Cells(i).Value
    database.Range("H" & Last_Row).Value = Input_Data.ListColumns("Amount").DataBodyRange.Cells(i).Value
    database.Range("I" & Last_Row).Value = Input_Data.ListColumns("Position").DataBodyRange.Cells(i).Value
    Last_Row = Last_Row + 1
Next i

''''' 清空录入数据
Input_Data.DataBodyRange.Delete ' 直接删除结构化表的所有数据行,比逐列清空更可靠
form.Range("H2:H6").ClearContents

MsgBox "数据提交成功", vbInformation, "数据录入表单"

End Sub

额外注意事项

  • 请确认Database表的D1单元格存储的确实是当前已有数据的最大行号,避免写入时覆盖已有数据
  • 如果不需要批量删除结构化表的所有行,可以保留原逐列清空的逻辑,直接写Input_Data.ListColumns("Account Code").DataBodyRange.ClearContents即可,不需要套form.Range()

内容的提问来源于stack exchange,提问作者Tasya Ananda Gisella

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:36:04