我在表单上有2个组合框。 ComboID
和ComboName
ComboID包含1001,1002,1003,1004等项目...... ComboName包含诸如John,Matt,David,Luke等项目......
我有一张包含这些数据的表格: 1001,约翰 1002,马特 1003,大卫 1004,卢克
当我从ComboID
选择1001
时,我希望John
显示ComboName
。
当我选择ComboName
时,我也希望Matt
显示“1002”。
我需要能够在任何时候选择一个新的名称或ID,并在另一个组合框中更新其相应的值。
我坚持试图让它发挥作用,它不会像我想要的那样难。我还在学习VBA代码。有什么帮助吗?
答案 0 :(得分:3)
我对此问题的初步反应是尝试使用change event。为每个组合框设置子程序以改变其他组合框的值将是解决方案。
但是,在Access vba更改事件的文档(上面的链接)中,它明确指出:
“避免创建两个或多个具有相互影响的Change事件的控件 - 例如,两个相互更新的文本框”(msdn access vba change event)
不幸的是,这正是您使用更改事件解决方案所做的事情(使用组合框而不是文本框)。在您的示例中,ComboID组合框中的更改将触发ComboName组合框中的相应更改,但ComboName组合框中的更改将触发ComboID中的尝试更改,并且此循环可以继续。因此,这不是您的问题的好答案。
在这种情况下,AfterUpdate Event似乎是更合适的方法。
如AfterUpdate文档中所述:
使用Visual Basic或包含SetValue操作的宏更改控件中的数据不会触发控件的这些事件。
因此,AfterUpdate事件(可能使用SetValue)应该是更好的方法。
非常感谢@Remou指出我的更改事件方式的错误并将AfterUpdate事件引起我的注意。
答案 1 :(得分:2)
更改事件很少是代码的合适选择。例如,组合框允许用户键入以及选择项目,因此更改事件将针对键入的每个单个字符触发。任何链接到该事件的事件都会发生,导致可能出现可怕的并发症。
设置这样的组合框,认为为什么你想这样做有点神秘。您可能需要在当前事件中保持它们的同步。你没有提到组合是否绑定到控制源,所以我没有包括一个。
ComboID
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
ComboName
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