多选组合框,选择之间有逗号分隔 - 确保末尾没有逗号

Multi-select Combobox with comma separation between selections - making sure no comma at end

提问人:PaulDee 提问时间:10/18/2023 更新时间:10/18/2023 访问量:36

问:

我正在使用下面的VBA代码在组合框(lstHomeroom)多选之间放置逗号分隔。但是,我的代码在列表末尾给了我一个逗号。如何修改代码以删除末尾的逗号?

例如:不想要:selection1,selection2,selection3, 想要:selection1,selection2,selection3

Dim x As Long
Dim y As Long
Dim Homeroomselected As String

For y = 2 To x

        'Update Homeroom
        For Z = 0 To lstHomeroom.ListCount - 1
        
            If lstHomeroom.Selected(Z) = True Then
                Homeroomselected = Homeroomselected & lstHomeroom.List(Z) & ","
            End If
            
            Next Z
            Sheets("Input").Cells(y, 4).Value = Homeroomselected

Next y
Excel VBA 组合框 多选

评论

2赞 Tom 10/18/2023
我不认为您可以在组合框上使用多选。你是说列表框吗?无论哪种方式,这都将实现您正在寻找的东西。Sheets(“输入”)。细胞(y,4)。值 = left(Homeroomselected, Len(Homeroomselected) - 1)
0赞 PaulDee 10/18/2023
我的错误,列表框,是的,谢谢。
0赞 PaulDee 10/18/2023
这很有效。谢谢!

答:

1赞 FunThomas 10/18/2023 #1

连接未知数量的字符串(包括分隔符(在本例中为逗号)是一项常见任务。如果您有值数组,则可以使用VBA函数,但在您的情况下,这将不起作用,因为您没有数组并且只想添加选定的项目。join

基本上,有两种方法可以解决这个问题。

第一个是您当前在代码中执行的操作,始终附加分隔符,完成后,删除最后一个分隔符。这是@Tom评论中建议的:

Homeroomselected  = Left(Homeroomselected, Len(Homeroomselected) - 1)

这有一个小问题:当未选择任何内容时,您将收到运行时错误,因为字符串的 Len 为 0,并且 -1 不是函数的有效参数。可以肯定的是,您需要检查:Left

If Homeroomselected <> "" Then
    Homeroomselected  = Left(Homeroomselected, Len(Homeroomselected) - 1)
End If

而且,如果您将分隔符更改为 比方说 ,您需要记住,现在您需要删除 2 个字符。", "

我也不太喜欢的是,直到最后一刻,字符串才无效。您必须确保始终删除最后一个字符。假设您有一个循环来创建字符串,并决定出于任何原因您有足够的数据并想要退出(例如,达到最大长度或最大元素数)。您需要确保始终执行删除最后一个字符的语句,因此您不能简单地发出语句。Exit Function

第二种方法是检查我们是否需要逗号。由于我们无法提前判断以后是否要添加另一个元素,因此请反转逻辑:在编写元素之前,请检查是否已经存在元素。如果是,请将逗号添加到现有元素中。

If lstHomeroom.Selected(Z) = True Then
    If Homeroomselected <> "" Then
        Homeroomselected = Homeroomselected & ","
    End If
    Homeroomselected = Homeroomselected & lstHomeroom.List(Z)
End If

可以使用 -function 简单地编写:IIf

Homeroomselected = Homeroomselected & IIf(Homeroomselected <> "", ",", "") & lstHomeroom.List(Z)

或者,您可以创建一个小例程:

Sub JoinString(ByRef result As String, element As String, Optional Separator As String = ",")
    result = result & IIf(result <> "", Separator, "") & element
End Sub

并像这样使用它:

If lstHomeroom.Selected(Z) Then
    JoinString Homeroomselected, lstHomeroom.List(Z), ","
End If

评论

0赞 PaulDee 10/18/2023
哇,多么彻底的回应!非常清楚,并且确实帮助了我对VBA的原始理解。我真的很感激。
1赞 Tom 10/19/2023
您还可以将所选值添加到数组中并使用Join(array, ", ")
0赞 FunThomas 10/20/2023
@Tom:是的,但这样做的坏处是你事先不知道数组的大小,所以你要么需要一个初始循环来计算你的数组需要多大,要么你需要使用 Redim preserve 语句。两者都会使代码更加丑陋,并且您再次遇到仅在过程结束时创建结果的问题(因此没有 Exit 函数等)。
0赞 T.M. 11/14/2023
@Tom 仅供参考 我通过 paramArray 函数的方法:如何在单词之间添加分隔符.. 除了最后一个单词