2010-05-31 29 views
1

因此,我有一個列表框,其值爲DeptA,DeptB,​​DeptC & DeptD。如果適用,我有一個方法可以使這些自動填充到這個列表框中。換句話說,如果它們填充在這個列表框中,我想讓結果邏輯在表中的一個布爾字段中表示它們是「是」。VBA - 訪問03 - 遍歷列表框,用if語句評估

因此,要做到這一點,我試圖通過列表框中首先要使用迭代這個例子週期,它的偉大工程:

dim i as integer 
dim myval as string 

For i = o to me.lstResults.listcount - 1 
    myVal = lstResults.itemdata(i) 
Next i 

如果我debug.print設爲myVal,我得到的名單我想從列表框中獲得的數據項目。所以現在我試圖評估該列表,以便我可以有一個UPDATE SQL語句來更新表,因爲我需要它完成。

所以,我知道這是一個錯誤,但是這是我試圖做的(給它作爲一個例子,這樣就可以看到什麼,我試圖去這裏)

dim sql as string 
dim i as integer 
dim myval as string 
dim db as database 

sql = "UPDATE tblMain SET " 

for i = 0 to me.lstResults.listcount - 1 
    myval = lstResults.itemdata(i) 

    If MyVal = "DeptA" Then 
     sql = sql & "DeptA = Yes" 
    ElseIF myval = "DeptB" Then 
     sql = sql & "DeptB = Yes" 
    ElseIf MyVal = "DeptC" Then 
     sql = sql & "DeptC = Yes" 
    ElseIf MyVal = "DeptD" Then 
     sql = sql & "DeptD = Yes" 
    End If 
Next i 

    debug.print (sql) 

    sql = sql & ";" 
    set db= currentdb 
    db.execute(sql) 

    msgbox "Good Luck!" 

所以你可以明白爲什麼這會導致問題,因爲這些值(DeptA,DeptB等)自動填充的列表框是動態的......列表框中很少有一個值,並且每個OrderID的值列表更改我使用的表單首先填充信息;唯一的實例)。

我正在尋找一種能夠一次評估這個列表的東西(即遍歷值的列表,並查找「DeptA」,並且如果找到,則向SQL字符串添加「是」,如果不是向SQL字符串添加「否」,然後繼續進行下一次迭代)。即使列表框動態填充值,它們是設置值,這意味着我知道最終會有什麼結果。

感謝您的幫助, 賈斯汀

+0

什麼是列表框的行來源和行來源類型? – Fionnuala 2010-05-31 18:04:07

+0

這聽起來像你沒有遵循你在這個問題給出的建議,http://stackoverflow.com/questions/2921454/access-2007-vba-building-a-listbox-with-selection-choices-from- another-list-box - 你接受了答案,但在我看來,當你應該使用子表單時,你再一次嘗試使用列表框。 – 2010-05-31 18:54:09

+0

@Remou:Type = ValueList,Row Source =「」 – Justin 2010-06-02 01:55:04

回答

1

我不明白你要完成的任務。但是,我懷疑你的UPDATE語句需要一個WHERE子句。 ('WHERE OrderID = X',X用您正在編輯的行的OrderID替換)

我想你可以創建一個字典對象,其值最初設置爲False。

Dim dict As Object 
Set dict = CreateObject("Scripting.Dictionary") 
dict.Add "DeptA", False 
dict.Add "DeptB", False 
' .. etc. ' 

然後通過列表框中的項目,將字典值更改爲True。

dict(myval) = True 

最後,根據字典值構建您的UPDATE語句。

但是,這一切似乎對我來說太多的工作。所以現在我想知道你的表格結構。 tblMain是否與此類似?:

OrderID DeptA DeptB DeptC DeptD 
------- ----- ----- ----- ----- 
127  True False False True 

如果是這樣,請考慮關於Dept信息的相關表。

OrderID Which_Department 
------- ---------------- 
127  DeptA 
127  DeptD 

管理這條規則的經驗法則是「列很貴,行很便宜」。

編輯:似乎我有兩套物品:SetA是所有可能的物品; SetB是SetA的一個子集。您希望爲SetB中的每個項目生成一個True,並且不在SetB中爲每個SetA項目生成一個False。當SetB替代字典(字典對象)和lstResults替換SetB時,這是否正確?

我試圖建議的是加載字典與所有可能的「DeptX」鍵並將它們分配爲False。然後重複您的lstResults並將其中的每一個(在字典)更改爲True。之後,從字典建立您的SQL語句。

Dim varKeys As Variant 
Dim i As Integer 
Dim strFragment As String 

varKeys = dict.keys() 
For i = LBound(varKeys) To UBound(varKeys) 
    strFragment = strFragment & ", " & varKeys(i) & " = " & dict(varKeys(i)) 
Next i 
strFragment = Mid(strFragment, 3) 
sql = sql & strFragment & "WHERECLAUSE" 
+0

我詢問行源的原因是我懷疑從前面的問題,這個列表框是用值構建的,所以它應該很容易足以簡單地捕獲行源,特別是如果dept表類似於您的示例:WHERE which_department IN(「&Replace(Replace(x.RowSource,」;「,」,「),」「」「,」'「 )&「)」'或者其他約 – Fionnuala 2010-06-01 07:03:12

+0

@Remou AFAICT列表框包含要更新爲True的部門,如果DeptA爲True,但現在不在列表框中,它應該設置爲False,我喜歡你的RowSource但我懷疑它仍然會涉及太多的工作OTOH,我懷疑我不明白Justin在想什麼...... – HansUp 2010-06-01 17:18:38

+0

@Both guys ....不是我認爲你有它,而是我正在使用該技術來自最後一個問題,但因爲我想學習如何做到這一點,不是因爲我認爲這是最好的方法(我真的不知道)...所以我相信你們,當你告訴我這些時,我仍然想知道如何去做(而不是我將在生產中使用它)。 @Hans ...我不知道最後一點關於列昂貴和行便宜...但一旦你想到它是很有道理的。 – Justin 2010-06-02 01:46:55