Access中ComboBox选择姓名后无法跳转对应联系人表单的问题
Access联系人表单搜索跳转问题
现有对象说明
- Contacts表:包含字段
ID(自动编号)、First Name、Last Name、Department、Business Phone、Physical Address、City、State - Contacts Extended查询:SQL语句如下:
SELECT IIf(IsNull([Last Name]), IIf(IsNull([First Name]),[Group Code],[First Name]), IIf(IsNull([First Name]),[Last Name],[Last Name] & "," & [First Name])) AS [File As], IIf(IsNull([Last Name]), IIf(IsNull([First Name]),[Group Code],[First Name]), IIf(IsNull([First Name]),[Last Name],[Last Name] & "," & [First Name])) AS [Contact Name], Contacts.* FROM Contacts ORDER BY IIf(IsNull([Last Name]), IIf(IsNull([First Name]),[Group Code],[First Name]), IIf(IsNull([First Name]),[Last Name],[Last Name] & "," & [First Name])), IIf(IsNull([Last Name]), IIf(IsNull([First Name]),[Group Code],[First Name]), IIf(IsNull([First Name]),[Last Name],[Last Name] & "," & [First Name]));
问题详情
在Contacts Details表单上有一个未绑定组合框[SearchContacts],输入或选择姓名后无法跳转至对应联系人的表单记录。尝试过以下VBA代码,但选择后表单无反应:
Private Sub Search_Exp_AfterUpdate() If search_SearchContact <> "" Then query = "SELECT * FROM Contacts WHERE (([Contacts].[Last Name])=[Forms].[Contacts Details].[SearchContacts])” Me.RecordSource = query Me.Refresh Else Me.RecordSource = "SELECT * FROM Contacts" Me.Refresh End If End Sub
尝试宏无法满足需求,使用控件向导时找不到“根据组合框所选值查找表单记录”的选项,需实现:选择组合框姓名后表单自动显示对应联系人,且可重新输入其他姓名查询。
解决方案
步骤1:正确设置组合框SearchContacts属性
打开组合框属性表,切换到数据选项卡:
- 行来源类型:选择「表/查询」
- 行来源:选择
Contacts Extended查询,或直接用以下SQL(确保包含唯一标识的ID和显示用的姓名字段):SELECT ID, [Contact Name] FROM [Contacts Extended] ORDER BY [Contact Name] - 绑定列:设置为
1(对应ID字段,避免重名匹配错误) - 列数:设置为
2 - 列宽:设置为
0cm;5cm(隐藏ID列,仅显示姓名)
步骤2:替换VBA代码
删除原有错误代码,在组合框的AfterUpdate事件中添加以下代码:
Private Sub SearchContacts_AfterUpdate() ' 组合框有选择值时执行定位 If Not IsNull(Me.SearchContacts.Value) Then Me.Recordset.FindFirst "ID = " & Me.SearchContacts.Value ' 未找到记录时提示并恢复全量显示 If Me.Recordset.NoMatch Then MsgBox "未找到对应联系人", vbInformation Me.RecordSource = "SELECT * FROM Contacts" End If Else ' 清空选择时恢复显示所有联系人 Me.RecordSource = "SELECT * FROM Contacts" End If Me.Refresh End Sub
代码说明
- 用
ID作为匹配条件,彻底避免重名联系人导致的匹配错误 - 使用
Recordset.FindFirst直接定位现有记录,比重新设置RecordSource更高效 - 修正了原有代码的变量名错误、中文全角引号问题
- 增加未找到记录的提示,优化用户体验
替代方案(保留原记录源)
如果表单原本的记录源是Contacts Extended,可直接用以下代码定位,无需切换记录源:
Private Sub SearchContacts_AfterUpdate() If Not IsNull(Me.SearchContacts.Value) Then Me.Recordset.FindFirst "ID = " & Me.SearchContacts.Value If Me.Recordset.NoMatch Then MsgBox "未找到对应联系人", vbInformation End If End If End Sub
内容的提问来源于stack exchange,提问作者Amari Richardson
相关产品推荐
相关产品推荐

