2016-08-29 126 views
0

我幾乎是在Access中使用VBA的新手,我遇到了一些看起來應該很簡單的問題。從另一個列表框選擇填充列表框

我有兩個列表框(稱爲LB1_ID和LB2_ID)在我的表單(MainForm),我想列出相應的ID從他們各自的行來源。我需要基於LB1中的選擇來填充LB2。他們都有來自同一個表(表1)的行來源,它是需求ID(「需求ID1」和「需求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

如果您的列表框是多選的,則不能使用簡單的表單參考作爲查詢條件。如果不是多選,請記住,它的價值可能是一個隱藏的列(通常是ID字段),那麼有兩種可能的問題和解決方案:

可能出現的問題:

  1. 單 - 選擇列表框有一個隱藏的ID字段(列寬= 0「),並且將它與表中的錯誤字段匹配。要檢查列表框的輸出,請打開VBE並在即時窗口中鍵入?[Forms]![MainForm]![LB1_ID],然後按在窗體視圖中打開表單並在LB1_ID中選擇一行時輸入,如果返回的行是您所期望的,則問題必須在其他地方。

  2. 啓用多選列表框屬性。在這種情況下,您的查詢將不起作用,因爲列表框只會返回Null。您需要編寫一些VBA來遍歷行並找出哪些是被選中的,這有點痛苦。最終,您將構建一些代碼,用每個選定行的特定條件來更改您的查詢。不要在這裏解釋,請參閱文章this

.Requery方法仍然是擺在AfterUpdate事件你的第一個列表框的刷新第二個重要。

+0

成功!這是#1的問題。在嘗試使用立即窗口的建議之後,我發現它返回的是列1中的值而不是所需的列2.我只需要將綁定列更改爲2,並且所有工作都像魅力一樣。謝謝! – jstyler

1

您的查詢似乎工作,但你需要刷新listbox2每當你做出選擇到ListBox1中,所以如果兩個列表框都以相同的形式添加此事件處理程序:

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

如果沒有這個,你listbox2只會根據listbox1的初始值在加載時填充一次。另外,如果你還沒有完成它,我建議將你的listbox1控件作爲參數添加到你的listbox2查詢中(在查詢生成器中,右鍵單擊 - >參數)。

+0

謝謝,我根據您的建議進行了更新。我沒有看到Change事件,所以我把它放在LB1_ID_AfterUpdate中。但是,我仍然沒有看到預期的效果。該清單仍然是空的,所以我恐怕還有其他一些我不知道的東西。我還必須對原始文章中的行來源進行編輯 - 我將SELECT參數從列表框的名稱改爲表格列的名稱(例如LB1_ID到Req ID1)。不確定這是否相關,但我只是爲了準確而提及它。 – jstyler

相關問題