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

