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

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

排查思路

  1. 错误本质定位:运行时错误94是「无效使用Null」,说明lstDisplay.Value返回了Null值,而mySt是String类型,无法直接接收Null值。
  2. 列表框取值逻辑修正:
    • 检查lstDisplay绑定的Table2数据中,选中行的默认取值列(通常是第1列)是否存在空值(Null)。可以改为明确指定列索引取值,避免默认取值遇到Null:
      mySt = lstDisplay.List(lstDisplay.ListIndex, 0) ' 0代表第1列,可根据实际调整
      
    • 或者用Nz函数将Null转为空字符串,兼容空值场景:
      mySt = Nz(lstDisplay.Value, "")
      
  3. 冗余逻辑清理:原代码中两次判断ListIndex > -1完全重复,且mySt = ""后再次判断赋值的逻辑无意义,可简化为:
    If lstDisplay.ListIndex = -1 Then
        MsgBox "请选择一行!", vbExclamation
        Exit Sub
    End If
    
  4. 删除后列表框刷新的稳定性:删除行后如果表格被清空,DataBodyRange会变为Nothing,直接赋值会触发新错误,需增加判断:
    If Not myTab.DataBodyRange Is Nothing Then
        lstDisplay.List = myTab.DataBodyRange.Value
    Else
        lstDisplay.Clear ' 表格为空时清空列表框
    End If
    
  5. 数据源指向准确性:初始化时用ListObjects(1)依赖表格索引,若工作表新增表格可能指向错误对象,建议改为明确指定表格名称:
    Sheets("VendorList").ListObjects("Table2")
    

内容的提问来源于stack exchange,提问作者xCellent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:29:53