将组合框设置为另一个组合框的值 - Access Vba
Posted
技术标签:
【中文标题】将组合框设置为另一个组合框的值 - Access Vba【英文标题】:Set combobox to the value of another combobox - Access Vba 【发布时间】:2013-01-03 19:13:34 【问题描述】:我在一个表单上有 2 个组合框。 ComboID
和 ComboName
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的主要内容,如果未能解决你的问题,请参考以下文章