2

我正在尝试将名称列表分配给 Access VBA 中的组合框控件。

我的问题是名称的输出字符串不正确。

这是我的代码:

Private Sub command186_click()
    Dim firstName As String
    Dim lastName As String
    Dim rst As Object
    Dim rowSourceText As String
    Dim fullName As String

    Set rst = CurrentDb.OpenRecordset("Pool_Contact")

    Do While Not rst.EOF
        firstName = rst("FName").Value
        lastName = rst("LName").Value
        fullName = firstName + " " + lastName
        rst.MoveNext
    Loop

    Forms(FrmDaysAvailable).Controls("Combo202").rowSource = fullName
    Debug.Print fullName
End Sub

我知道错误出现在我的循环内部,其中变量 fullName 被第二个结果覆盖。

如何修复此循环以生成看起来像 fullName , fullName , fullName ...

感谢你的帮助

4

2 回答 2

5

这可以简单得多:

 Forms(FrmDaysAvailable).Controls("Combo202").rowSource = _
           "SELECT ID, FName & ' ' & LName FROM Pool_Contact"

或者

Forms!FrmDaysAvailable.Combo202.rowSource = _
           "SELECT ID, FName & ' ' & LName FROM Pool_Contact"

或者

Me.Combo202.rowSource = "SELECT ID, FName & ' ' & LName FROM Pool_Contact"

此外,使用 & not + 连接。加号 (+) 会给您带来空值问题。

于 2012-08-14T15:20:05.777 回答
4

您必须将每个项目添加到 ComboBox,而不是只添加最后一个

Do While Not rst.EOF
    firstName = rst("FName").Value
    lastName = rst("LName").Value
    fullName = firstName & " " & lastName
    Me!Combo202.AddItem(fullName)
    rst.MoveNext
Loop

你也应该声明rstDAO.Recordset不是对象。(您可能必须添加对 DAO dll 的引用)。

或者,您可以将表或查询直接分配给 ComboBox 的行源并完全删除循环

Me!Combo202.RowSource = "Pool_Contact"

但是您可以在表单设计器中执行此操作,而根本不需要在 VBA 中执行此操作。如果您需要刷新 ComboBox 的内容,您可以简单地编写

Me!Combo202.Requery

注意:我假设这Forms(FrmDaysAvailable)是当前的形式。在这种情况下,您可以简单地通过Me. 此外,Controls集合是表单的默认属性。Forms(FrmDaysAvailable).Controls("Combo202")可以简化为Me("Combo202")甚至Me!Combo202用 VBA 集合访问操作符!

我还建议您给您的 ComboBox(和其他控件)起有意义的名称,例如cboFullName. 这使代码更具可读性。我通常会查询以“q”为前缀的同名 ComboBox 对应的查询,qcboFullName并将其分配给属性窗口中组合的 RowSource。查询比表具有优势,您可以应用“ORDER BY”并准确选择组合框所需的列。

通常,作为用户选择的结果,您将有一个隐藏的 ID 列(在列宽属性中输入 0)和一个用于显示的字符串列。

SELECT PersonID, firstName & ' ' & lastName AS Display
FROM tblPerson
ORDER BY firstName, lastName 
于 2012-08-14T15:19:34.013 回答