访问VBA列表框方法。选择与.ItemData

时间:2016-02-26 14:53:51

标签: vba ms-access listbox

在处理应用程序时,我无法在列表框中获取所选项目以实际输出正确的行值。我正在使用.Selected方法来选择需要选择哪一行以进行下一步,这将从列表框中提取绑定列的值以进行进一步处理,而无需用户与之交互列表框。

事实证明.Selected与点击列表行的工作方式不同,因为其输出值仍然是最后一个“手动”选定行的绑定列值。

我意识到我必须使用.Selected方法跟进.ItemData方法,以实际使列表框输出值等于我在.Selected方法中选择的行。

以下是我用于将供应商PN查找表单上的选择复制到主要零件搜索表单的代码:

Private Sub cmdAddTofrmPartSearch_Click()
Dim i as Integer
... [truncated]
Forms("frmPartSearch").lstSearchResults.Selected(i - 1) = True
... [truncated]
Forms("frmPartSearch").txtHiddenPN.Value 
  = Forms("frmPartSearch").lstSearchResults.ItemData(i - 1)
...[truncated]

End Sub

如上所述,为什么我需要使用:

Forms("frmPartSearch").lstSearchResults.Selected(i - 1) = True

Forms("frmPartSearch").txtHiddenPN.Value 
  = Forms("frmPartSearch").lstSearchResults.ItemData(i - 1)

要让txtHiddenPN接收正确的行值,而不是简单地将txtHiddenPN的控件来源设置为=[lstSearchResults]并让它更新为.Selected之后的行值?

如果.Selected没有改变列表框的输出值(除了轻松,但徒劳地突出显示一行),它的用途是什么?同样,为什么.ItemData也不突出显示输出绑定值的行?这是一个糟糕的设计,还是有另一种同时实现两种结果的方法?是自动包含两种方法的最佳做法吗?是否有需要调用一种方法的情况?

我是VBA的新手并且编码一般,所以也许这是该领域的常见现象,但它似乎很钝。

1 个答案:

答案 0 :(得分:1)

“已选择”ListBox属性不会影响“值”一个

它甚至不会触发事件

“Selected”属性主要用于检查选择了哪些列表框元素

您可能需要check this

所以你不需要Forms("frmPartSearch").lstSearchResults.Selected(i - 1) = True代码行,因为它对你的代码没有影响

要更全面地了解列表框功能,您可能还想按照以下方式使用它

将此代码添加到项目的模块中

Option Explicit

Sub PlayWithListBox()

With UserForm4
    With .ListBox1
        .AddItem "a1"
        .AddItem "a2"
        .AddItem "a3"
        .AddItem "a4"
    End With
    .Show

    MsgBox "going to use Select property"
    With .ListBox1
        .Selected(2) = True
        Call ShowValueAndListIndex(.value, .List(.ListIndex))
    End With

End With
Unload UserForm4
End Sub


Sub ShowValueAndListIndex(valueStrng As String, listIndexStr As String)
MsgBox "Value: " & valueStrng
MsgBox "listIndex: " & listIndexStr
End Sub

然后添加到您的项目

  • 以“UserForm4”命名的Userform
  • 以“Userform4”
  • 中的“ListBox1”命名的ListBox

最后在“UserForm4”代码模块中添加以下代码

Private Sub ListBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
MsgBox "BeforeUpdate"
With Me.ListBox1
    If .ListIndex >= 0 Then Call ShowValueAndListIndex(.value, .List(.ListIndex))
End With

End Sub

Private Sub ListBox1_Change()
MsgBox "Change"
With Me.ListBox1
    If .ListIndex >= 0 Then Call ShowValueAndListIndex(.value, .List(.ListIndex))
End With
End Sub

Private Sub ListBox1_Click()
MsgBox "Click"
With Me.ListBox1
    If .ListIndex >= 0 Then Call ShowValueAndListIndex(.value, .List(.ListIndex))
End With
End Sub

Private Sub ListBox1_Enter()
MsgBox "Enter"
With Me.ListBox1
    If .ListIndex >= 0 Then Call ShowValueAndListIndex(.value, .List(.ListIndex))
End With
End Sub

Private Sub ListBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
MsgBox "KeyDown"
With Me.ListBox1
    If .ListIndex >= 0 Then Call ShowValueAndListIndex(.value, .List(.ListIndex))
End With
End Sub

Private Sub ListBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
MsgBox "MouseDown"
With Me.ListBox1
    If .ListIndex >= 0 Then Call ShowValueAndListIndex(.value, .List(.ListIndex))
End With
End Sub