VBA用户窗体删除功能运行时错误'94'排查求助
VBA用户窗体删除数据时运行时错误'94'排查思路
问题描述
我正在开发一个VBA用户窗体用于表格数据的录入/删除,新增功能运行正常,但执行删除操作时触发运行时错误'94'(无效使用 Null),报错代码行如下:
mySt = lstDisplay.Value
参考信息
- 表格名称:
Table2 - 工作表名称:
VendorList - 窗体名称:
UserForm1 - 按钮名称:
cmdDelete
相关子程序代码
用户窗体初始化代码
Private Sub UserForm1_Initialize() lstDisplay.List = Sheets("VendorList").ListObjects(1).DataBodyRange.Value End Sub
删除按钮点击事件代码
Private Sub cmdDelete_Click() Dim myTab As ListObject Dim mySt As String, fndmySt As Range If lstDisplay.ListIndex <> -1 Then If Me.lstDisplay.ListIndex > -1 Then mySt = "" If mySt = "" Then mySt = lstDisplay.Value End If Else MsgBox "Please select a row!", vbExclamation Exit Sub End If Set myTab = Sheets("VendorList").ListObjects(1) With myTab.ListColumns(1).Range Set fndmySt = .Find(What:=mySt, LookIn:=xlValues, LookAt:=xlWhole, _ SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) End With If Not fndmySt Is Nothing Then myTab.ListRows(fndmySt.Row - myTab.HeaderRowRange.Row).Range.Delete End If lstDisplay.List = myTab.DataBodyRange.Value End If End Sub
排查思路
- 错误本质定位:运行时错误94是「无效使用Null」,说明
lstDisplay.Value返回了Null值,而mySt是String类型,无法直接接收Null值。 - 列表框取值逻辑修正:
- 检查
lstDisplay绑定的Table2数据中,选中行的默认取值列(通常是第1列)是否存在空值(Null)。可以改为明确指定列索引取值,避免默认取值遇到Null:mySt = lstDisplay.List(lstDisplay.ListIndex, 0) ' 0代表第1列,可根据实际调整 - 或者用
Nz函数将Null转为空字符串,兼容空值场景:mySt = Nz(lstDisplay.Value, "")
- 检查
- 冗余逻辑清理:原代码中两次判断
ListIndex > -1完全重复,且mySt = ""后再次判断赋值的逻辑无意义,可简化为:If lstDisplay.ListIndex = -1 Then MsgBox "请选择一行!", vbExclamation Exit Sub End If - 删除后列表框刷新的稳定性:删除行后如果表格被清空,
DataBodyRange会变为Nothing,直接赋值会触发新错误,需增加判断:If Not myTab.DataBodyRange Is Nothing Then lstDisplay.List = myTab.DataBodyRange.Value Else lstDisplay.Clear ' 表格为空时清空列表框 End If - 数据源指向准确性:初始化时用
ListObjects(1)依赖表格索引,若工作表新增表格可能指向错误对象,建议改为明确指定表格名称:Sheets("VendorList").ListObjects("Table2")
内容的提问来源于stack exchange,提问作者xCellent
相关产品推荐
相关产品推荐

