我几乎是在Access中使用VBA的新手,而我在使用看起来应该非常简单的事情时遇到了麻烦。
我的表单(MainForm)上有两个列表框(称为LB1_ID和LB2_ID),我想从各自的行源列出相关的ID。我需要根据LB1中的选择来填充LB2。它们都具有来自同一表(表1)的行源,它是需求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选择。
我错过了什么?
答案 0 :(得分:1)
您的查询似乎有效,但每当您选择listbox1时,您需要刷新listbox2,因此如果两个列表框的格式相同,则添加此事件处理程序:
Private sub LB1_ID_Change()
Me.LB2_ID.Requery
End sub
如果没有这个,你的listbox2只会在加载时根据listbox1的初始值填充一次。
另外,如果您还没有这样做,我建议您将listbox1控件作为参数添加到listbox2查询中(在查询构建器中,右键单击 - >参数)。
答案 1 :(得分:1)
如果您的列表框是多选的,则不能使用简单的表单引用作为查询条件。如果它不是多选,请记住它的值可能是隐藏列(通常是ID字段),因此有两个可能的问题和解决方案:
可能的问题:
单选列表框有一个隐藏的ID字段(列宽= 0和#34;),并且您将其与表中的错误字段匹配。要检查列表框的输出,请打开VBE并在即时窗口中键入?[Forms]![MainForm]![LB1_ID]
,然后在表单视图中打开表单并在LB1_ID中选择一行时按Enter键。如果返回的行符合您的预期,则问题必须在其他地方。
启用了多选列表框属性。在这种情况下,您的查询将无效,因为列表框只会返回Null
。您需要编写一些VBA来循环遍历行并找出选择哪些行,这有点痛苦。最终,您将构建一些代码,这些代码将使用每个选定行的特定条件更改您的查询。而不是在这里解释,请查看this文章以获得教程。
.Requery
方法对于放入第一个列表框的AfterUpdate
事件来刷新第二个列表仍然很重要。