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

时间:2013-01-03 19:13:34

标签: vba combobox access-vba

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

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

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

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

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

我坚持试图让它发挥作用,它不会像我想要的那样难。我还在学习VBA代码。有什么帮助吗?

2 个答案:

答案 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
相关问题