访问 VBA 基于组合框导航到记录

Posted

技术标签:

【中文标题】访问 VBA 基于组合框导航到记录【英文标题】:Access VBA Navigate to a record based on a combobox 【发布时间】:2017-10-16 06:15:33 【问题描述】:

想象一个表(tblEmployee)设置如下:

    EmpID(PrimaryKey) EmpName(ShortText) EmpNo(ShortText) EmpPhoto(附件)

在表单上,​​我希望能够从 Combobox(EmpName) 中选择员工姓名,以便其他控件更新并向我显示所选员工的编号和照片。

我已经制作了一个表格(frmEmployee)并将记录源选择为:

  SELECT tblEmployee.* FROM tblEmployee;

并通过“添加现有字段”选项卡将所有字段添加到表单中。然后,我将 textbox(EmpName) 更改为具有两列的组合框,第一列的宽度为零,并将 Row Source 更改为:

SELECT tblEmployee.ID, tblEmployee.EmpName
FROM tblEmployee;

因此用户可以查看和选择任何员工的姓名,而无需处理主键 (EmpID)。 还有combobox(EmpName)的afterUpdate事件是这样的:

    Private Sub EmpName_AfterUpdate()
' Find the record that matches the control.
    Dim rs As Object

    Set rs = Me.Recordset.Clone
    rs.FindFirst "[ID] = " & Str(Nz(Me![EmpName], 0))
    If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End Sub

这为我提供了我想要的功能,而且每当我从组合框中选择另一个员工姓名时,当前员工的姓名都会更新为新选择的员工的 ID(EmpID)。

如何解决这个问题?还有其他更快更好的方法吗?

【问题讨论】:

【参考方案1】:

只需使用未绑定的组合框。

要解除当前组合框的绑定,只需删除 Control Source 属性即可。

【讨论】:

【参考方案2】:

由于您通过添加现有字段构建表单,然后将 EmpName 更改为 ComboBox,因此 ComboBox 仍然绑定到数据库中的员工姓名!!

我的意思是,如果您显示 John Smith 的记录并在组合框中选择“Peter Griffin”,那么您只是将 John 的名字更改为“Peter Griffin”。您所追求的功能已经很好地内置在 Access 中。这是执行此操作的“标准”方式...

1) 创建一个表单(这将是一个子表单)。叫它frmEmployeeDetail。将Record Source 指定为tblEmployee,并像以前一样将所有员工字段添加到其中。

2) 现在创建一个未绑定的表单(Record Sourcenothing 表单)。将您的 ComboBox 添加到其中。将Row Source 设置为像以前一样显示名称,但Control Source 留空!您不希望此 ComboBox 更改任何基础数据。你只是想让它坐在那里,现在看起来很漂亮。确保将Bound Column 设置为1。这样组合框的“值”就是您选择的任何名称的EmpID。将组合框命名为 cmbEmpID

3) 在您刚刚创建的未绑定表单上,添加一个子表单(这将是您在步骤 1 中创建的表单)。对于Source Object,请输入frmEmployeeDetail。对于Link Master Fields 输入cmbEmpID。对于Link Child Fields,请输入EmpID

现在,每当您在 ComboBox 上选择一个名称时,它会将 cmbEmpID 的值设置为您刚刚选择的任何员工 ID。由于您将其链接到子表单,因此子表单将显示与 ComboBox 匹配的任何数据(因为这是子表单所做的......)

就格式而言,您可以从子表单中删除边框等,并轻松地将其融合到“主”表单中,使其看起来像一个不错的表单。最好的部分:全部内置。没有代码。

【讨论】:

我也喜欢这种方法,但是因为我会导致拥有更多对象,所以我会接受 Erik 的建议。无论如何,根据您的经验,从长远来看,哪种方法更适合数据库可管理性、编写更少的代码或拥有更少的对象? 不管怎样。像员工表这样的大表,我喜欢你原来的方法(Erik 建议取消绑定组合框)。对于较小的“类别”类型表(如“员工部门”、“职位名称”等——只有少于 30 个左右条目且相当静态的表),我喜欢使用我的方式。我使用列表框而不是组合框,因此我可以查看所有条目并选择要为其设置定义的条目。对于这类表格,我喜欢这种方法,主要是因为那些“类别”类型的表格通常用于在其他地方填充下拉菜单 ...在您的 GUI 中。因此,能够在列表框中看到这些选项,我可以在“主”表单上查看所有选项、调整列表顺序等,但在子表单端设置每个选项的单独行为属性,我觉得非常有用。不过,您是对的……在您正在查找数据的非静态大表上,您的方法确实更简单。现在你明白为什么它不起作用了,所以这都是从这里开始的偏好。

以上是关于访问 VBA 基于组合框导航到记录的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 postgresql 表的 vba 填充组合框访问 2007

通过在列表下拉组合框中选择它来访问 VBA 代码以转到另一个表单上的特定记录

访问 VBA - 使用 VBA 的 SQL 语句使用文本框组合框值在表单上填充列表框 OR

编辑组合框时访问表单不会更新,必须移动到下一条记录

从组合框中访问 VBA 随机值

如何在组合框 vba 中过滤数据