Do While Loop没有给我正确的输出字符串

时间:2012-08-14 15:08:18

标签: vba ms-access while-loop access-vba do-while

我正在尝试将名称列表分配给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 ...

的字符串

感谢您的帮助

2 个答案:

答案 0 :(得分: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"

此外,使用&不是+连接。加号(+)将为您提供空值问题。

答案 1 :(得分: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

此外,您应将rst声明为DAO.Recordset而不是对象。 (您可能必须添加对DAO dll的引用)。

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

Me!Combo202.RowSource = "Pool_Contact"

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

即可
Me!Combo202.Requery

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

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

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

SELECT PersonID, firstName & ' ' & lastName AS Display
FROM tblPerson
ORDER BY firstName, lastName