将ListBox控制为对象

时间:2015-02-02 08:27:50

标签: vba

我正在处理包含ListBox的VBA用户表单 到目前为止,当我不得不操纵一个或多个时,我总是在我的潜艇中继续这样做,dlg作为对话框名称,并且它没有造成任何问题,因为我从来不想做任何复杂的事情:

Dim List1 As Object
...
List1 = dlg.GetControl("CBXname")
...
List1.addItem("String",index)
...

现在我想在此Sub

中执行以下操作
...
If (List1.Exists(Cell1.String) = False) Then
    List1.addItem(Cell1.String,k)
End If
...
List1.Clear
...

但是我无法做到,因为List1是一个Object。但是,如果我决定将List1声明为Listbox,我不知道如何从对话框中对ListBox进行适当的控制(当前的getcontrol给我一个错误)。

2 个答案:

答案 0 :(得分:0)

您的代码的一个问题是列表框对象没有“exists”属性。要检查列表框项目中是否已存在某个值,您需要遍历这些项目。

dim i as integer 
for i = 0 to List1.listcount - 1 
    if List1.column(0, i) = myvalue then 
        'myvalue exists in List1, skip
    else
        List1.additem myvalue     
    end if 
next i

myvalue是您尝试添加到列表框的任何值。但是,这会将我们带到您的代码中的第二个问题,即添加“Cell1.String”。如果您尝试从工作表范围添加值,则需要引用该范围的值,因为工作表范围在此处使用时没有“字符串”属性。 IE浏览器。 Cell1 =范围(“A1”)。值

至于控制列表框,您可以简单地将对象名称称为表单的对象。例如,dlg.List1,如果对象的名称是List1。

答案 1 :(得分:0)

以下是您可以为任何列表框调用的通用例程。调用代码假定一个名为ListBox1的列表框,一个名为TextBox1的文本框和一个名为CommandButton的命令按钮。当您单击该按钮时,它会在列表框中搜索textbox1中的文本。

Private Function ExistsInListbox(ByRef aListBox As msforms.ListBox, ByVal Item As String) As Boolean

Dim booFound As Boolean
    booFound = False
    Dim t As Integer
    ExistsInListbox = False
    For t = 0 To aListBox.ListCount - 1 'correction, aListBox not ListBox1
    If Item = aListBox.List(t) Then
            'if we find a match, short-circuit the loop
            booFound = True
            Exit For
        End If
    Next

   ExistsInListbox = booFound
End Function
private sub CommandButton_click()
 Dim answer As String
    Dim val As Boolean
    val = ExistsInListbox(Me.ListBox1, TextBox1.Text)
    If val Then
        answer = "found"
    Else
        answer = "Not Found"
    End If
    MsgBox "found-" & answer
End Sub