将组合框设置为另一个组合框的值 - Access Vba

Posted

技术标签:

【中文标题】将组合框设置为另一个组合框的值 - Access Vba【英文标题】:Set combobox to the value of another combobox - Access Vba 【发布时间】:2013-01-03 19:13:34 【问题描述】:

我在一个表单上有 2 个组合框。 ComboIDComboName

ComboID 包含 1001、1002、1003、1004 等项目... ComboName 包含 John、Matt、David、Luke 等项目...

我有一张包含这些数据的表格: 1001,约翰 1002,马特 1003,大卫 1004,路克

当我从ComboName 中选择John 时,我希望ComboID 显示1001。 当我选择Matt 时,我还希望ComboName 显示“1002”。

我需要能够随时选择一个新的名称或 ID,并在另一个组合框中更新其相应的值。

我一直在努力让它发挥作用,但它并没有我想象的那么难。我还在学习 VBA 代码。有什么帮助吗?

【问题讨论】:

【参考方案1】:

First Glance 解决方案(不推荐)

它是什么

我对这个问题的最初反应是尝试使用change event。为每个组合框设置子例程以更改另一个组合框的值将是解决方案。

为什么你不应该使用它

但是,在 Access vba 更改事件的文档(上面的链接)中明确指出:

“避免创建两个或多个具有相互影响的更改事件的控件——例如,两个相互更新的文本框”(msdn access vba change event)

不幸的是,这正是您使用更改事件解决方案要做的事情(使用组合框而不是文本框)。在您的示例中,ComboID 组合框中的更改将触发 ComboName 组合框中的相应更改,但 ComboName 组合框中的更改将触发 ComboID 中的尝试更改,并且此循环可以继续。因此,这不是您问题的好答案。

更好的解决方案

AfterUpdate Event 似乎是在这种情况下使用的更合适的方法。

为什么不会触发有问题的循环

如更新后文档中所述:

使用 Visual Basic 或包含 SetValue 操作的宏更改控件中的数据不会触发控件的这些事件。

因此,更新后事件(可能使用SetValue)应该是更好的方法。

非常感谢@Remou 指出我的更改事件方式的错误,并让我注意到更新后事件。

【讨论】:

我不确定,因为我不知道在 VBA 中会是什么样子。我在正确的轨道上吗?当我将它设置为 OnClick() 时,我遇到了一个错误。现在我什么也得不到。私有子 ComboID_OnChange() Me.ComboName.Text = ? End Sub Private Sub ComboName_OnChange() Me.ComboID.Text = ?结束子 @user1946392 是的,你走在正确的轨道上。获取值的简单 1 行解决方案是使用 DLookup 它就像 Me.ComboName.value = Dlookup("NameField","yourTable","IDField = " & Me.ComboID.value) 非常感谢,到目前为止这对您有很大帮助。但是这些字段没有正确地相互更新。当我选择一个 ID 时,名称框变为空白,当我选择一个名称时,ID 框变为空白。这将适用于我们的目的,但如果 ID 和 Name 字段匹配,那就太好了。谢谢你!! Private Sub SearchID_Change() Me.SearchName.Value = DLookup("SubjectID", "Master Hearing Data", "SubjectID = " & Me.SearchID.Value) End Sub Private Sub SearchName_Change() Me.SearchID.Value = DLookup(" SubjectID", "Master Hearing Data", "SubjectID = " & Me.SearchName.Value) End Sub 我不会使用更改事件,除非有特殊的例外原因。更新后事件更适合组合。恐怕这不是一个好的答案,但我看你是这个网站的新手。 @Remou 谢谢。我很欣赏澄清。删除我的答案是否适合我现在做的事情?【参考方案2】:

更改事件很少适合代码选择。例如,组合框允许用户输入和选择项目,因此每输入一个字符就会触发 change 事件。与该事件相关联的任何事件都可能导致可怕的并发症。

像这样设置组合框,认为您为什么要这样做有点神秘。您可能需要在当前事件中使它们保持同步。你没有提到组合是否绑定到控制源,所以我没有包括一个。

组合ID

RowSource: SELECT ID, [Name] FROM Table ORDER BY ID
BoundColumn: 1 
ColumnCount: 2
ColumnWidths: 2cm;0cm ''The second column is hidden,
                      ''the first column is any width

Private Sub ComboID_AfterUpdate()
    Me.ComboName = Me.ComboID
End Sub

组合名称

RowSource: SELECT ID, [Name] FROM Table ORDER BY [Name]
BoundColumn: 1
ColumnCount: 2
ColumnWidths: 0cm;2cm ''The first column is hidden, 
                      ''the second column is any width

Private Sub ComboName_AfterUpdate()
    Me.ComboID = Me.ComboName
End Sub

【讨论】:

以上是关于将组合框设置为另一个组合框的值 - Access Vba的主要内容,如果未能解决你的问题,请参考以下文章

Access VBA中不稳定的组合框比较

如何在 MS Access 2010 中使用 VBA 选择多值组合框的值?

MS Access - 带有组合框和文本框的 If 语句

Access VBA:根据非绑定列在组合框中查找项目

来自组合框的 MS Access Like 查询

extjs:加载时如何设置组合框的值