从另一个列表框选择填充列表框
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字段),所以有两个可能的问题和解决方案:
可能的问题:
Single-Select 列表框有一个隐藏的 ID 字段(列宽 = 0"),您将其与 table 中的错误字段匹配。检查列表框的输出,打开 VBE 并在 window 中键入 ?[Forms]![MainForm]![LB1_ID]
并在表单视图中打开表单并且在 [=31] 中编辑了一行时按回车键=]。如果 returned 行是您所期望的,那么问题一定出在其他地方。
多Select 列表框属性 已启用。在这种情况下,您的查询将不起作用,因为列表框只会 return Null
。您将需要编写一些 VBA 来遍历行并找出哪些是 selected,这有点麻烦。最终,您将构建一些代码,这些代码将根据每个 selected 行的特定条件来更改您的查询。与其在这里解释,不如看看 this 文章中的教程。
.Requery
方法对于放入第一个列表框的 AfterUpdate
事件以刷新第二个列表框仍然很重要。
我对在 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字段),所以有两个可能的问题和解决方案:
可能的问题:
Single-Select 列表框有一个隐藏的 ID 字段(列宽 = 0"),您将其与 table 中的错误字段匹配。检查列表框的输出,打开 VBE 并在 window 中键入
?[Forms]![MainForm]![LB1_ID]
并在表单视图中打开表单并且在 [=31] 中编辑了一行时按回车键=]。如果 returned 行是您所期望的,那么问题一定出在其他地方。多Select 列表框属性 已启用。在这种情况下,您的查询将不起作用,因为列表框只会 return
Null
。您将需要编写一些 VBA 来遍历行并找出哪些是 selected,这有点麻烦。最终,您将构建一些代码,这些代码将根据每个 selected 行的特定条件来更改您的查询。与其在这里解释,不如看看 this 文章中的教程。
.Requery
方法对于放入第一个列表框的 AfterUpdate
事件以刷新第二个列表框仍然很重要。