在vba Access中传递Listbox对象

时间:2014-05-09 09:28:48

标签: vba listbox

我正在尝试将列表框传递给另一个子来填充它,这是为了允许多个列表框通过传递列表框的名称和表的名称(检查是否输入)来使用相同的代码是有效的)到子。目前,当您将鼠标悬停在下面的代码中时,me.Autoclavelist(这是此特定表单上列表框的名称)显示为“null”。

1)实际期望输入的列表框对象是什么?

2)即使发送了null,子类1和2似乎也能正常工作 - 但使用.removeitem的类似代码却没有(3& 4)为什么会这样?

谢谢!

编辑:我在这里找到了问题 - 我已将列表框锁定在表单上。这意味着无法选择其中的任何项目,因此值始终为null,因此后两个潜艇失败。

Sub 1:

Private Sub cmdAutoClaveAddItem_Click()

On Error GoTo Errorhandler

Call AddtoList(Me.AutoClaveList, "[Autoclave Process]")

If Me.AutoClaveList.ListCount <> 0 Then
    Me.cmdRunAutoclave.Enabled = True
    Me.CmdRemoveItem.Enabled = True
End If


SubExit:
    Exit Sub

Errorhandler:
    MsgBox Error$
    Resume SubExit

End Sub

Sub 2:

Private Sub AddtoList(ListName As Listbox, FormName As String)

On Error GoTo Errorhandler

Dim StrLabel_Id As String
Dim l As Long

ListName.RowSourceType = "Value List"

StrLabel_Id = InputBox("Scan Tray Label", "Scan")

If StrLabel_Id = "" Then
    GoTo SubExit
Else
    If Not IsNull(DLookup("[Tracking_Label_ID]", "Label_Production", "[Tracking_Label_ID]='" & StrLabel_Id & "'")) Then
        If IsNull(DLookup("[Tracking_Label_ID]", FormName, "[Tracking_Label_ID]='" & StrLabel_Id & "'")) Then
            l = 0
            For l = 0 To (ListName.ListCount - 1) Step 1
                If ListName.ItemData(l) = StrLabel_Id Then
                    Call MsgBox("Label is already in batch!", , "Error")
                    GoTo SubExit
                End If
            Next
            ListName.AddItem StrLabel_Id
        Else
            Call MsgBox("Label has already been processed", , "Error")
        End If
    Else
        Call MsgBox("Label does not exist. Make sure you create label in Label Production", , "Error")
    End If
End If


SubExit:
    Exit Sub

Errorhandler:
    MsgBox Error$
    Resume SubExit

End Sub

Sub 3:

Private Sub CmdRemoveItem_Click()

On Error GoTo Errorhandler

Call RemovelistItem(AutoClaveList)

SubExit:
    Exit Sub

Errorhandler:
    MsgBox Error$
    Resume SubExit

End Sub

Sub 4:

Private Sub RemovelistItem(ListName As Listbox)

On Error GoTo Errorhandler

Dim strRemoveItem As String

If Not IsNull(ListName.Value) Then
    strRemoveItem = ListName.Value
    ListName.RemoveItem (strRemoveItem)
Else
    GoTo SubExit
End If

SubExit:
    ListName.Requery
    Exit Sub

Errorhandler:
    MsgBox Error$
    Resume SubExit

End Sub

1 个答案:

答案 0 :(得分:1)

不要担心Null。对象存在并且很好。 ListBox个对象的默认属性为Value;因此,Value的值是鼠标悬停在Me.AutoClaveList上时显示的值。它的Value恰好是Null(默认情况下是这样):

  

Null表示项目处于空状态,既未选中也未清除。

有关详细信息,您可以在“本地”窗口中查看ListName及其属性。

当然,如果你这样做:

If Not IsNull(ListName.Value) Then
    'do stuff
Else
    GoTo SubExit
End If

然后它“将无效”,即不会做任何事情,因为.ValueNull。摆脱这种状况。