Excel VBA删除行触发运行时错误'-214702882(8007000e)'如何解决
问题根因
你遇到的报错和无响应问题由3个核心错误导致:
- 未校验列表框选中状态:如果用户没有选中任何列表项,
ListIndex返回-1,Offset(-1)会引用工作表无效区域,是内存不足报错的直接诱因 - 行号映射逻辑不严谨:直接删除源表行后,列表框之前绑定的
ListFillRange地址是固定的,源表行数变化后,绑定的区域变为越界无效地址,控件持续尝试访问无效内存会累计报错 - 直接操作单元格删除未同步更新列表绑定,导致引用悬空
修复方案
1. 修改删除触发逻辑(Sheet1中的hapus过程)
增加选中校验,删除完成后立即刷新列表绑定
Sub hapus() ' 校验是否选中列表项 If Sheet1.DataBarang.ListIndex = -1 Then MsgBox "请先选中要删除的行", vbExclamation Exit Sub End If Call DeleteRow(Sheet1.DataBarang.ListIndex) ' 刷新列表绑定,清除无效引用 Call loaddata End Sub
2. 优化删除行逻辑
改为直接操作结构化表,避免范围异常
Sub DeleteRow(ByVal row As Long) Dim tabeldata As ListObject Set tabeldata = Sheet2.ListObjects("DataBarang") ' 二次校验行号合法性 If row >= 0 And row < tabeldata.ListRows.Count Then ' 结构化表行索引从1开始,ListIndex从0开始,所以+1 tabeldata.ListRows(row + 1).Delete End If End Sub
3. 优化列表加载逻辑,彻底解决内存报错
把ListFillRange绑定改为直接赋值列表内容,避免区域引用失效问题
Sub loaddata() Dim listdata As Object Set listdata = Sheet1.DataBarang Dim tabeldata As ListObject Set tabeldata = Sheet2.ListObjects("DataBarang") ' 清空旧数据 listdata.Clear ' 判空处理:表无数据时不赋值 If Not tabeldata.DataBodyRange Is Nothing Then With listdata .ColumnHeads = True .ColumnCount = 12 ' 直接加载值到列表内存,不需要绑定单元格区域 .List = tabeldata.DataBodyRange.Value End With End If End Sub
修改完成后重启工作簿即可正常运行,不会再出现内存不足的报错。
内容的提问来源于stack exchange,提问作者muntun
相关产品推荐
相关产品推荐

