【问题标题】:Assigning options from Listbox using VBA in Access 2013在 Access 2013 中使用 VBA 从列表框中分配选项
【发布时间】:2016-01-18 20:30:39
【问题描述】:

我在我的项目中遇到了一些问题,我想知道是否有人能指出我正确的方向。

图片应该比我描述它更容易解释功能:

很简单,我希望用户能够单击“添加”,然后双击其中一个专业将其分配给该 DJ。

当用户单击保存按钮时,需要为他们选择的每个专业在名为“tblDJSpecialitiy”的表中创建一个新行。每行都需要包含“Dj_No”和专业的主键。

首先,我需要在编辑 DJ 表单上获取专业列表,以更新以反映用户从所有专业列表中单击的专业。

这是我目前在编辑 DJ 表单上的专业列表的代码:

Public Sub displaySpecialities()
'for the selected member display current loans (including overdue loans)
'and loans which have been returned but for which fines are still outstanding
Dim RstSpecialities As DAO.Recordset
Dim strSQL, strSpecialityInformation As String
Dim strDJNo As String
Dim intNumberOfSpecialities, intIndex As Integer
strDJNo = txt_dj_no.Value
'call the function to clear the list
Call clearLst_Specialities
'create an sql query to find the specialities
strSQL = strSQL & "SELECT tblSpeciality.SpecialityName FROM tblSpeciality INNER JOIN tblDJSpeciality ON tblDJSpeciality.[FKSpecialityNo] = tblSpeciality.[SpecialityNo] WHERE tblDJSpeciality.FKDjNo = '" & strDJNo & "';"
'store the results of the query in the recordset
Set RstSpecialities = dbase.OpenRecordset(strSQL, dbOpenDynaset)
'calculate the number of specialities
If Not RstSpecialities.EOF Then
    RstSpecialities.MoveLast
    intNumberOfSpecialities = RstSpecialities.RecordCount
    RstSpecialities.MoveFirst
End If
'add the details of each speciality to the list box
For intIndex = 0 To intNumberOfSpecialities - 1
    strSpecialityInformation = RstSpecialities("SpecialityName")
    lst_specialities.AddItem (strSpecialityInformation)
    RstSpecialities.MoveNext
Next
'close the recordet
RstSpecialities.Close
End Sub

这是我目前必须在添加表单上填充所有专业列表的代码:

Public Sub displaySpecialities()
    'list all specialities in the system
    Dim RstSpecialities As DAO.Recordset
    Dim strSQL, strSpecialityInformation As String
    Dim intNumberOfSpecialities, intIndex As Integer
    'call the function to clear the list
    Call clearLst_Specialities
    'create an sql query to find the specialities
    strSQL = strSQL & "SELECT tblSpeciality.SpecialityName FROM tblSpeciality  ORDER BY SpecialityName ;"
    'store the results of the query in the recordset
    Set RstSpecialities = dbase.OpenRecordset(strSQL, dbOpenDynaset)
    'calculate the number of specialities
    If Not RstSpecialities.EOF Then
        RstSpecialities.MoveLast
        intNumberOfSpecialities = RstSpecialities.RecordCount
        RstSpecialities.MoveFirst
    End If
    'add the details of each speciality to the list box
    For intIndex = 0 To intNumberOfSpecialities - 1
        strSpecialityInformation = RstSpecialities("SpecialityName")
        lst_speciality_add.AddItem (strSpecialityInformation)
        RstSpecialities.MoveNext
    Next
    'close the recordet
    RstSpecialities.Close
End Sub

我在尝试使用它时一直在谷歌上搜索 - 但没有太多运气。感谢所有回复的人。

编辑:

这出现了两次 - 如果我两次都输入“11”(DJ 号码),那么我会得到一个列表 - 但它显示如下:

这似乎是我的 tblDJSpecialty 中的所有记录

【问题讨论】:

  • 我将通过不使用“添加”表单来简化此操作,而是将列表框放在当前专业控件的右侧。您可以使用“>”“
  • 是的 - 如果这样可以简化一些事情,我肯定愿意将两个列表框并排放置。你有什么想法我怎么能做到这一点? - 另外,不,当保存 DJ 详细信息时,我没有实际添加/删除专业的代码 - 我还没有做到这一点!非常感谢您的回复
  • 保存现有数据库的副本,以便在需要时回退。然后在编辑表单上,去掉添加和删除按钮;缩小“首选项”列表框的宽度;在右侧添加一个新的列表框控件;您可以在两个列表之间插入两个命令按钮,一个带有“>”,一个带有“
  • 谢谢 - 我刚刚重新设计了我的表单,现在开始编写代码以在两个列表之间移动项目。
  • 您是要使用带有 > 和 代码维护表,然后重新查询。你怎么看?

标签: ms-access vba ms-access-2013


【解决方案1】:

下面是一些将在两个列表框之间添加/删除特殊功能的代码。但首先,有一些解释:

  • 左侧的列表框 (lst_specialities) 用于各个 DJ 专业
  • 右侧的列表框 (lst_specialities_All) 包含所有可供选择的专业
  • tblSpeciality 有两列:(1) SpecialityNo、AutoNumber、PK; (2) 专业名称文本
  • 表 tblDJSpecialityID 有 3 列: (1) DJSpecialityID AutoNumber, PK; (2)DJ_FKDjNo LongInt(DJ的PK); (3) FKSpecialityNo, LongInt(专业PK)
  • 更改用于匹配您的姓名的名称。
  • 以下是Preferences列表框'lst_specialities'的rowsource SQL

    SELECT tblDJSpecialitiy.DJSpecialityID, tblDJSpecialitiy.DJ_FKDjNo, tblDJSpecialitiy.FKSpecialityNo, tblSpeciality.SpecialityName FROM tblDJSpecialitiy 
    INNER JOIN tblSpeciality ON tblDJSpecialitiy.FKSpecialityNo = tblSpeciality.SpecialityNo 
    WHERE (((tblDJSpecialitiy.DJ_FKDjNo)=[Forms]![dj_edit]![txt_dj_no]));
    
  • 以下是列表框'lst_specialities_All'的行源:

    SELECT tblSpeciality.SpecialityNo, tblSpeciality.SpecialityName 
    FROM tblSpeciality ORDER BY tblSpeciality.SpecialityName;
    

以下是添加/删除的代码。我将命令按钮命名为 cmdPlus 和 cmdMinus:

Option Compare Database
Option Explicit

Private Sub Form_Current()
    Me.lst_specialities.Requery
End Sub

Private Sub cmdMinus_Click()
Dim strSQL  As String
Dim i       As Integer

    If Me.lst_specialities.ItemsSelected.Count = 0 Then
        MsgBox "You must select a specialty to remove from this DJ.", vbOKOnly, "No Specialty Selected"
        Exit Sub
    End If

    For i = 0 To 3
        Debug.Print i & vbTab & Me.lst_specialities.Column(i)
    Next i
    strSQL = "DELETE tblDJSpecialitiy.DJSpecialityID, tblDJSpecialitiy.FKSpecialityNo " & _
                "FROM tblDJSpecialitiy " & _
                "WHERE (((tblDJSpecialitiy.DJSpecialityID)=" & Me.lst_specialities.Column(0) & "));"
    DoCmd.SetWarnings False
    DoCmd.RunSQL strSQL
    DoCmd.SetWarnings True

    UnSelect_All
    UnSelect_DJ
    Me.lst_specialities.Requery
End Sub

Private Sub cmdPlus_Click()
Dim strSQL  As String
Dim i       As Integer


    If Me.lst_specialities_All.ItemsSelected.Count = 0 Then
        MsgBox "You must select a specialty to add to this DJ.", vbOKOnly, "No Specialty Selected"
        Exit Sub
    End If

    For i = 0 To 3
        Debug.Print i & vbTab & Me.lst_specialities_All.Column(i)
    Next i
    strSQL = "INSERT INTO tblDJSpecialitiy ( DJ_FKDjNo, FKSpecialityNo ) " & _
            "SELECT " & Me.txt_dj_no & " AS Expr1, " & Me.lst_specialities_All.Column(0) & " AS Expr2;"
    DoCmd.SetWarnings False
    DoCmd.RunSQL strSQL
    DoCmd.SetWarnings True

    UnSelect_All
    UnSelect_DJ

    Me.lst_specialities.Requery
End Sub

Function UnSelect_All()
Dim i  As Integer
    For i = 0 To Me.lst_specialities_All.ListCount             'Deselect ALL rows in Listbox
        lst_specialities_All.Selected(i) = False
    Next i

End Function
Function UnSelect_DJ()
Dim i  As Integer
    For i = 0 To Me.lst_specialities.ListCount             'Deselect ALL rows in Listbox
        lst_specialities.Selected(i) = False
    Next i

End Function

【讨论】:

  • 非常感谢您提供这么多的帮助!我现在很晚了,我必须睡觉,但我明天会用这个。再次感谢!
  • 忘了提到您需要确定列表框中的列数和值的顺序。我使用了“Me.lst_specialities.Column(0)”作为记录的主键。
  • 嗨 - 你知道为什么左侧 DJ 专业列表框的行源 SQL 没有加载任何内容吗?我已经用我自己的表名等调整了您的查询,如下所示:SELECT tblDJSpecialitiy.DJSpecialityID, tblDJSpecialitiy.DJ_FKDjNo, tblDJSpecialitiy.FKSpecialityNo, tblSpeciality.SpecialityName FROM tblDJSpecialitiy INNER JOIN tblSpeciality ON tblDJSpecialitiy.FKSpecialityNo = tblSpeciality.SpecialityNo WHERE (((tblDJSpecialitiy.FKDjNo)=[Forms]![dj_edit]![txt_dj_no])); 它只是给了我一个空白列表框
  • 你确定你的表中有记录吗?并且键在两个表和列表框列之间正确映射?我更改了我所有的名字以匹配你的名字,并将用最新的和表格格式的解释更新答案。我需要在大约 25 分钟后离开这里......
  • 您好,感谢您的评论。对不起,我想你了——我把自己和美国/英国的专业/专业拼写搞混了! (哎呀)现在由于某种原因,当我单击编辑时,我得到了一个新的弹出窗口(我已将图像附加到上面的主要问题 - 如果你不介意看一下) - 我已经检查过了,我的表格肯定被称为'dj_edit' 我的文本框绝对叫'txt_dj_no'
猜你喜欢
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
相关资源
最近更新 更多