我正在尝试将名称列表分配给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 ...
的字符串感谢您的帮助
答案 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