从另一个列表框选择填充列表框

Populating listbox from another listbox selection

我对在 Access 中使用 VBA 几乎是个新手,但我遇到了一些看起来应该很简单的事情。

我的表单 (MainForm) 上有两个列表框(称为 LB1_ID 和 LB2_ID),我想从它们各自的行源中列出相关 ID。我需要根据 LB1 中的选择填充 LB2。它们都有来自相同 Table (Table1) 的行源,并且它是需求 ID 的多对多关系("Req ID1" 和 "Req ID2")。我当前的表格不起作用,LB1 的行源为:

SELECT Table1.ID, Table1.[Req ID1] FROM Table1 ORDER BY Table1.ID;

LB2 的行源为:

SELECT Table1.ID, Table1.[Req ID2] FROM Table1 WHERE ([Forms]![MainForm]![LB1_ID]=Table1.[Req ID1]); 

当我在 LB1 中进行选择时,在 LB2 中没有任何反应。列宽的格式正确,如果我使用 Me.[Forms]![MainForm]![LB1_ID] 我可以让它工作,但如果我使用它,我必须在弹出框中手动输入 LB1 选择。

我错过了什么?

您的查询似乎有效,但您需要在选择列表框 1 时刷新列表框 2,因此如果两个列表框的格式相同,请添加此事件处理程序:

Private sub LB1_ID_Change()
  Me.LB2_ID.Requery
End sub

如果不这样做,您的 listbox2 只会在加载时根据 listbox1 的初始值填充一次。

此外,如果您还没有这样做,我建议将您的 listbox1 控件作为参数添加到您的 listbox2 查询中(在查询生成器中,右键单击 -> 参数)。

如果您的列表框是多select,则不能使用简单的表单引用作为查询条件。如果不是multi-select,请记住它的值可能是一个隐藏列(通常是一个ID字段),所以有两个可能的问题和解决方案:

可能的问题:

  1. Single-Select 列表框有一个隐藏的 ID 字段(列宽 = 0"),您将其与 table 中的错误字段匹配。检查列表框的输出,打开 VBE 并在 window 中键入 ?[Forms]![MainForm]![LB1_ID] 并在表单视图中打开表单并且在 [=31] 中编辑了一行时按回车键=]。如果 returned 行是您所期望的,那么问题一定出在其他地方。

  2. 多Select 列表框属性 已启用。在这种情况下,您的查询将不起作用,因为列表框只会 return Null。您将需要编写一些 VBA 来遍历行并找出哪些是 selected,这有点麻烦。最终,您将构建一些代码,这些代码将根据每个 selected 行的特定条件来更改您的查询。与其在这里解释,不如看看 this 文章中的教程。

.Requery 方法对于放入第一个列表框的 AfterUpdate 事件以刷新第二个列表框仍然很重要。