用于将列表框中的所有已检查项目返回到单元格

时间:2016-06-04 13:27:56

标签: excel vba

我想将活动x列表框中的所有选中项目都放到工作表上的单元格中。我有这个代码完全符合我的要求:

Private Sub CommandButton1_Click()
Dim lItem As Long
Dim outstr As String

   For lItem = 0 To ListBox1.ListCount - 1

      If ListBox1.Selected(lItem) = True Then

        outstr = outstr & ListBox1.List(lItem) & "/"

      End If

   Next
   Range("A1") = Left(outstr, Len(outstr) - 1)
End Sub

这会将所有已检查的项目放入单元格a1。

我把它转换成这样的函数:

Function CopySelected(lb As MSForms.ListBox) As String

Dim lItem As Long
Dim outstr As String

For lItem = 0 To lb.ListCount - 1

    If lb.Selected(lItem) = True Then

        outstr = outstr & lb.List(lItem) & "/"

    End If

Next
CopySelected = Left(outstr, Len(outstr) - 1)

End Function

但是我不能给函数提供正确的参数来返回与sub相同的参数。我需要提出什么作为参数?

我尝试了以下内容:

=Copyselected(Sheet1.ListBox1)                           
=Copyselected(Sheet1.ListBoxes("ListBox1"))         
=Copyselected(Sheet1.Shapes("ListBox1").OLEFormat.Object)
=Copyselected(Worksheets("Sheet1").ListBox1)

似乎没什么用。功能不正确还是通过?

2 个答案:

答案 0 :(得分:3)

使用以下代码:

Public Function GetAllSelected(strListBox As String)

Dim lItem As Long
Dim outstr As String

With Worksheets(1).OLEObjects(strListBox).Object
    For lItem = 0 To .ListCount - 1
       If .Selected(lItem) = True Then
         outstr = outstr & .List(lItem) & "/"
       End If
    Next lItem
End With

GetAllSelected = Left(outstr, Len(outstr) - 1)

End Function

然后调用它将ListBox的名称作为字符串传递:

=GetAllSelected("ListBox1")

请注意,此时必须知道工作表。如果您需要将工作表名称(以及)传递给该函数,则必须相应地调整代码。

更新

对于使用ListBox1_Change()事件的下面评论中概述的主动方法,结果将是这样的:

enter image description here

然而,在这种情况下,每个ListBox都有一个过程,sub的结果总是写入同一个单元格(硬编码)。

答案 1 :(得分:1)

使用@Ralph中的代码,你也应该能够按原样使用你的功能......

...试

=Copyselected(Sheet1.OLEObjects("ListBox1").Object)