You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

列表框为空时出现类型不匹配错误的排查求助

问题分析与解决方案

嘿,我来帮你搞定这个类型不匹配的问题!

错误的核心原因

当你的列表框(比如PartNoList)是空的时候,它的List属性并不会返回一个空数组,而是返回Empty(一种Variant类型的空值)。但LBound()UBound()这两个函数只能接收数组作为参数,把Empty传进去自然就触发类型不匹配错误了——这就是问题所在!

两种可行的解决方案

方案1:先判断列表框是否有内容,再执行循环

最简单的办法就是在每个循环前,先检查列表框的ListCount属性(这个属性会返回列表框里的条目数量),只有当ListCount > 0时,才去执行拼接内容的循环。修改后的代码如下:

' 处理PartNoList
Dim parts As String
If Me.PartNoList.ListCount > 0 Then
    For i = LBound(Me.PartNoList.List) To UBound(Me.PartNoList.List)
        parts = parts & IIf(parts = "", "", vbNewLine) & Me.PartNoList.List(i, 0)
    Next
End If

' 处理PartDescList
Dim descparts As String
If Me.PartDescList.ListCount > 0 Then
    For i = LBound(Me.PartDescList.List) To UBound(Me.PartDescList.List)
        descparts = descparts & IIf(descparts = "", "", vbNewLine) & Me.PartDescList.List(i, 0)
    Next
End If

' 处理PartQntList
Dim qntparts As String
If Me.PartQntList.ListCount > 0 Then
    For i = LBound(Me.PartQntList.List) To UBound(Me.PartQntList.List)
        qntparts = qntparts & IIf(qntparts = "", "", vbNewLine) & Me.PartQntList.List(i, 0)
    Next
End If

' 统一写入工作表(优化:避免重复操作同一个Range,提升效率)
With Sheets("Sales Order Log").Range("Sales_Data_Start").Offset(TargetRow, 0)
    .Offset(0, 1).Value = SalesOrderNo
    ' (...) 这里放其他字段的赋值代码
    .Offset(0, 5).Value = parts
    .Offset(0, 6).Value = descparts
    .Offset(0, 7).Value = qntparts
End With

方案2:封装通用函数,减少重复代码

因为三个列表框的处理逻辑完全一样,你可以把这个逻辑封装成一个通用函数,这样代码更简洁,后续维护也更方便:

' 通用函数:把列表框的内容拼接成换行分隔的字符串
Function GetListBoxContent(lst As MSForms.ListBox) As String
    Dim result As String
    Dim i As Integer
    
    ' 如果列表框为空,直接返回空字符串
    If lst.ListCount = 0 Then
        GetListBoxContent = ""
        Exit Function
    End If
    
    ' 拼接内容
    For i = LBound(lst.List) To UBound(lst.List)
        result = result & IIf(result = "", "", vbNewLine) & lst.List(i, 0)
    Next
    GetListBoxContent = result
End Function

' 调用这个函数来提交数据
Sub SubmitSalesData()
    Dim parts As String, descparts As String, qntparts As String
    
    ' 直接调用通用函数获取内容
    parts = GetListBoxContent(Me.PartNoList)
    descparts = GetListBoxContent(Me.PartDescList)
    qntparts = GetListBoxContent(Me.PartQntList)
    
    ' 统一写入工作表
    With Sheets("Sales Order Log").Range("Sales_Data_Start").Offset(TargetRow, 0)
        .Offset(0, 1).Value = SalesOrderNo
        ' (...) 其他字段的赋值
        .Offset(0, 5).Value = parts
        .Offset(0, 6).Value = descparts
        .Offset(0, 7).Value = qntparts
    End With
End Sub

另外提个小优化:你之前的代码重复三次操作同一个工作表Range,把这些赋值合并到一个With块里,不仅代码更整洁,还能提升执行效率哦~

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

火山引擎 最新活动