0

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

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

我有一张包含这些数据的表格:1001、John 1002、Matt 1003、David 1004、Luke

当我从中选择时,我想ComboID显示。而且我还想在选择时显示“1002” 。1001JohnComboNameComboNameMatt

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

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

4

2 回答 2

3

第一眼解决方案(不推荐)

这是什么

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

为什么你不应该使用它

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

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

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

更好的解决方案

在这种情况下,更新后事件似乎是更合适的方法。

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

如更新后文档中所述:

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

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

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

于 2013-01-03T19:18:13.863 回答
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
于 2013-01-04T00:21:07.970 回答