VBA:将多选列表框值粘贴到单元格时的错误处理

时间:2019-04-21 15:45:18

标签: excel vba

我需要改善代码的帮助,或者如果我的代码已经相当不错,我会对实现它的其他方式感兴趣。

我要做什么: 在Excel中,我有一个用户窗体,用户可以在其中输入人们的姓名,年龄,头发颜色等(一次输入一个人)。对于类似头发的颜色,我在列表框中提供了5个预定义的选择,并且由于人们可以更改头发的颜色,因此启用了多选。然后将选定的头发颜色(一种或多种)粘贴到特定单元格。

问题: 当用户忘记选择头发颜色时,我在错误处理方面有些挣扎。

工作代码:我确实将其与以下代码一起使用

Private Sub cmdSubmit_Click()
  Dim cnt As Long
  Dim LastRow As Long
  Dim s As String
  Dim i As Integer

  With Me.lbxHair
    For i = 0 To .ListCount - 1
        If .Selected(i) = True Then
            s = s & .List(i) & ","
            cnt = cnt + 1
        End If
    Next i
  End With

  If cnt = 0 Then
    MsgBox "No hair color selected"
    Exit Sub
  Else
    Cells(LastRow + 1, 1).Value = Me.tbxName.Value
    Me.tbxName.Value = ""
    Me.tbxName.SetFocus

    Range("B" & LastRow + 1).Value = Left(s, Len(s) - 1)
    On Error Resume Next
  End If

End Sub

这对我来说完全可以,但是有没有辅助cnt-Variable的方法吗?我尝试了此操作,因为我读过.ListIndex = -1表示什么都没选择

无效代码(与上面的变量声明相同):

With Me.lbxHair
    If .ListIndex = -1 Then
        MsgBox "No hair color selected"
        Exit Sub
    Else
        For i = 0 To .ListCount - 1
            If .Selected(i) = True Then s = s & .List(i) & ","
        Next i
    End If
End With

    Cells(LastRow + 1, 1).Value = Me.tbxName.Value
    Me.tbxName.Value = ""
    Me.tbxName.SetFocus
    Range("B" & LastRow + 1).Value = Left(s, Len(s) - 1)
    On Error Resume Next

当尝试不选择任何内容时,出现“运行时错误'5':无效的过程调用或参数”

为什么?另外,您还有其他建议如何解决这个问题或如何改进代码吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试以下操作:

Private Sub cmdSubmit_Click()

  Dim LastRow As Long
  Dim s As String, sep As String
  Dim i As Integer

  With Me.lbxHair
    For i = 0 To .ListCount - 1
        If .Selected(i) = True Then
            s = s & sep & .List(i)
            sep = ","
        End If
    Next i
  End With

  If Len(s) = 0 Then
    MsgBox "No hair color selected"
    Exit Sub
  Else
    Cells(LastRow + 1, 1).Value = Me.tbxName.Value
    Cells(LastRow + 1, 2).Value = s
    Me.tbxName.Value = ""
    Me.tbxName.SetFocus

  End If

End Sub