2016-05-13 94 views
2

不確定如何短語我的問題 - 所以我很抱歉,如果它似乎有點模糊。我似乎還有其他的方法,比如檢查多個組合框等,但沒有特別涉及到我正在尋找的東西,不確定我是否試圖做一些不可能的事情。Excel VBA - 檢查combolist值並添加(如果尚未添加)

我想要做的是檢查我的組合框,看看一個值是否已經存在,如果沒有,並添加它。

工作簿打開並調用UserForm1.show - 這會觸發Userform初始化設置一些文本框默認值(空和設置像autosize等)這很好,在這個過程中我稱之爲個人函數DrpDwn_init - 想法是DrpDwn_init在組合框中選中並設置值。我可以調用該函數,甚至可以添加值,但我無法弄清楚如何檢查值是否已經存在。

我目前所面對的是以下幾點:

Public Function DrpDwn_Init() 

Dim Templates() As String 
Templates = Split("Stuff 1*Stuff 2", "*") 

For i = 0 To UBound(Templates) 
If Templates(i) <> UserForm1.DrpDwn_Templates.List(i) Then 
    MsgBox "Does Not match" 
Else 
    MsgBox "Does Match" 
End If 
Next i 

End Function 

也使用

For i = 0 To UBound(Templates) 
If CStr(Templates(i)) <> UserForm1.DrpDwn_Templates.List(i) Then 

For i = 0 To UBound(Templates) 
If Templates(i) <> CStr(UserForm1.DrpDwn_Templates.List(i)) Then 

For i = 0 To UBound(Templates) 
If CStr(Templates(i)) <> CStr(UserForm1.DrpDwn_Templates.List(i)) Then 

以及使用「UserForm1.DrpDwn_Templates.ListIndex(I)

我嘗試已經嘗試過很多方法,有時我得到的唯一錯誤是,突然Userform1.show變得不可接受!?即使我從來沒有碰過這部分代碼,我真的無法弄清楚如何循環訪問數組,檢查每個數組索引項以查看它是否存在於組合框中,並根據它是否是否執行任務。

真的希望有人輪在這裏可以幫助我搞清楚了這一點 (順便說一句,我已經檢查了我的所有代碼引用函數等是正確的,如果我在這裏做錯別字我道歉。)

回答

2

你AREN」 t每次循環下拉框中的所有項目。考慮有以下幾種下面的示例

表1

Apples 
Pears 

表2

Oranges 
Apples 

你需要做的檢查:

Apples = Oranges (FALSE) 
Apples = Apples (TRUE) 
Pears = Oranges (FALSE) 
Pears = Apples (FALSE) 

那麼簡單循環這裏我有點兒像

For i = 1 to 2 
    For j = 1 to 2 
     if list1(i) = list2(j) then 
      inList = TRUE 
     End if 
    Next j 
    If inList = TRUE then 
     MsgBox "Found in the list" 
    End if 
Next i 

修訂下面的代碼應與單個用戶窗體,並在該用戶窗體(分別爲UserForm1和ComboBox1)的組合框

Sub test() 

Dim i As Integer, j As Integer 
Dim inList As Boolean 
Dim vListItems As Variant, vTestItems As Variant, vItem As Variant 

vListItems = Array("Apple", "Orange") 
vTestItems = Array("Pear", "Apple") 

'populate ComboBox1 
For Each vItem In vListItems 
    UserForm1.ComboBox1.AddItem vItem 
Next vItem 

For i = 0 To UBound(vTestItems) 
    inList = False 
    'check if item is in your dropdown list already 
    For j = 0 To UserForm1.ComboBox1.ListCount - 1 
     If vTestItems(i) = UserForm1.ComboBox1.List(j) Then 
      inList = True 
     End If 
    Next j 
    'insert into list if not found 
    If inList = False Then 
     UserForm1.ComboBox1.AddItem vTestItems(i) 
    End If 
Next i 

UserForm1.Show 

End Sub 
+0

我沒有意識到我需要循環瀏覽下拉菜單中的所有選項 - 我認爲這在事後看來是有道理的 - 代碼看起來很合理 - 我可以跟隨它發生的事情。 *按下輸入換行符 - 衛生署* 我已經嘗試了代碼,但我得到: 「運行時錯誤‘13’: 類型不匹配」 強調了: 對於j = 0到UserForm1.DrpDwn_Templates。 ListCount –

+0

這可能是因爲.ListCount返回一個長整數,而i/j是一個整數。您可能想要將i/j聲明爲Long /查看是否可以找到更好的方法來獲取列表框中的項目總數,或者使用'cInt()'將表達式轉換爲整數 – CallumDA

+0

我剛剛嘗試過做同樣的事情,但是: 'Dim m as int' 'm = UserForm1.DrpDwn_Templates.ListCount' 這也給類型不匹配? 加入'MsgBox UserForm1.DrpDwn_Templates.ListCount' 這顯示在一個msgbox中的列表計數 - 但然後由於某種原因拋出類型不匹配後,我確定MsgBox - 這真是莫名其妙,這似乎應該是一個相當簡單努力 –

0

我嘗試這樣做,我就開始工作工作。犯規滿足您的需求,變型,但讓你更接近計算出來

Private Sub UserForm_Activate() 
    ComboBox1.Clear 
    StuffArray(0) = "Stuff" 
    StuffArray(1) = "Another thing" 
    For i = LBound(StuffArray, 1) To UBound(StuffArray, 1) 
     With ComboBox1 
      .AddItem StuffArray(i) 
     End With 
    Next i 

    Dim Thing As String 
    Thing = ThisWorkbook.Sheets("Sheet3").Range("u9").Value 
    For i = LBound(StuffArray, 1) To UBound(StuffArray, 1) 
     If Thing <> StuffArray(i) Then 
      With ComboBox1 
       .AddItem Thing 
      End With 
     ElseIf Thing = StuffArray(i) Then 
     End If 
     Next 
End Sub 

編輯 - 原來,這增加了原來的兩倍,但多數民衆贊成一個簡單的辦法:P

enter image description here

+0

原諒我 - 我曾使用 'Dim Templates()as string' 'Templates = Split(「Stuff * andStuff」,「*」)' 因爲我的印象是這個DID不使用變體數據類型 - 糾正我,如果我錯了,但變種使用更多的內存比絕對必要的權利?因此我使用拆分方法。 –

+0

正確。在我發佈之前,我也沒有讀過CallumDA33的答案(因爲他在我打字的時候發帖)。我沒有嘗試過,但可能比我更適合INF。我覺得我花了幾分鐘的時間Im無論如何張貼它LOL –