【问题标题】:Take list box selection, add value to other list box without allowing duplicates获取列表框选择,向其他列表框添加值,不允许重复
【发布时间】:2020-12-20 20:10:15
【问题描述】:

我正在制作的表单上有两个列表框。第一个列表框链接到具有各种公司名称的表。我追求的目标是双击公司名称后,将值插入到第二个列表框中。

在我尝试添加代码以防止重复项出现在第二个列表框中之前,它一直运行良好,因此您不会意外插入同一家公司两次。我尝试了几次不同的迭代,但没有运气。有人能帮忙解决这个问题吗?我的最终目标是弹出一个msgbox,提醒用户不允许重复。

Private Sub ContractorLstbx_DblClick(Cancel As Integer)
    Dim found As Boolean
    found = False
    Dim ID As Long
    Dim Contractor As String
    
    For Each newItem In Me.ContractorLstbx.ItemsSelected
        For j = 0 To Me.SelectedContractorLst.ListCount - 1
            If (Me!ContractorLstbx.ItemData(newItem).Column(1) = Me.SelectedContractorLst.ItemData(j).Column(1)) Then
                found = True
                Exit For
            End If
        Next j
        If found = False Then
            ID = Me.ContractorLstbx.ItemData(newItem)
            Me.SelectedContractorLst.AddItem ContractorLstbx!.ItemData(newItem).Column(0) & ";" & Me!ContractorLstbx.ItemData(newItem).Column(1)
            
        End If
        found = False
    Next newItem
End Sub

【问题讨论】:

  • 为什么不从第一个列表框中删除选定的项目?
  • 我想这可行,从长远来看可能会更简单。那不会弄乱桌子吧?我是新手,所以不能完全理解所有内容,我正在学习。
  • 我不知道 - 我想这取决于您的列表框是如何设置的。我不是 Access 的人,所以也许其他人可以插话......
  • 您的代码似乎是正确的并且应该可以运行,但我注意到检查行中的一点If (Me!ContractorLstbx.ItemData(newItem).Column(1) = Me.SelectedContractorLst.ItemData(j).Column(1)) Then 尝试替换“!”在第一个我用“。”之后因为我猜这将给出空值,因为它试图调用记录值而不是列表项值,因此它永远不会进入。尝试在此行设置断点并检查条件中的值,您将得到问题原因。
  • @Tmyers 抱歉,这行代码也需要同样修改。这里是修改后的,可以直接复制粘贴:Me.SelectedContractorLst.AddItem ContractorLstbx.ItemData(newItem).Column(0) & ";" & Me.ContractorLstbx.ItemData(newItem).Column(1)

标签: vba ms-access ms-access-2016 ms-access-forms


【解决方案1】:

这是您解决方案的完整代码。我在测试样本上试了一下,效果很好。只需复制并粘贴代码。如果您需要您的比较区分大小写(我的意思是 A a),请使用Option Compare Binary,如下面的代码所示。如果需要不区分大小写 (A = a),只需保留默认的 Option Compare Database 或更好地使用 Option Compare Text 强制它

Option Compare Binary

Private Sub ContractorLstbx_DblClick(Cancel As Integer)
    Dim found As Boolean
    found = False
    Dim ID As Long
    Dim Contractor As String

    For i = 0 To Me.ContractorLstbx.ItemsSelected.Count - 1
        For j = 0 To Me.SelectedContractorLst.ListCount - 1
            If (Me.ContractorLstbx.Column(1, Me.ContractorLstbx.ItemsSelected(i)) = Me.SelectedContractorLst.Column(1, j)) Then
                found = True
                Exit For
            End If
        Next j
        If found = False Then
            ID = Me.ContractorLstbx.ItemData(Me.ContractorLstbx.ItemsSelected(i))
            Me.SelectedContractorLst.AddItem (ContractorLstbx.Column(0, Me.ContractorLstbx.ItemsSelected(i)) & ";" & Me.ContractorLstbx.Column(1, Me.ContractorLstbx.ItemsSelected(i)))
        
        End If
        found = False
    Next i
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多