2014-03-31 87 views
1

我試圖通過將列表框對象傳遞給子函數來填充列表框,但是每當我運行它時,我都會遇到類型不匹配錯誤。我將MAIN.BoxY1對象傳遞給函數FillListBox,其中MAIN是列表框所在工作表的代碼名稱,BoxY1是我的列表框名稱(ActiveX)。當我改變FillListBox函數爲每個實例包含MAIN.BoxY1而不是MyBox時,它將正常工作。將列表框傳遞給另一個函數的正確方法是什麼?VBA傳遞列表框到函數

Sub FillListBox(MyBox As ListBox, DataList As Variant) 
    MyBox.MultiSelect = 1 
    For j = 1 To NumOutputs 
     MyBox.AddItem DataList(j) 
    Next j 
End Sub 

Sub BoxY1_Fill() 
    FillListBox MAIN.BoxY1, TheData 
End Sub 

+1

不是一個完美的解決方案,但您是否嘗試接受該參數作爲Object而不是Listbox? Sub FillListBox(MyBox作爲對象,DataList作爲變體)?另外,也許指定你通過引用而不是按值傳遞它? Sub FillListBox(ByRef MyBox as Object,DataList as variant)? – Acantud

+0

確實有效;感謝您的建議,雖然我仍然不明白爲什麼ListBox對象沒有,但也許我會找出一天。 – teepee

+0

很高興幫助 - 下面的答案看起來不錯,這是我不知道的信息 - 將有興趣看看是否修復它,我也遇到類似的問題 – Acantud

回答

5

有兩種類型在Excel列表框:在「內置」類型和ActiveX版。根據所處理的類型,您需要設置不同的功能參數:

Sub Testing() 
    test1 Sheet1.ListBox1       ' <<ActiveX Listbox 
    test2 Sheet1.ListBoxes("ListBox2")    ' <<Forms Listbox 
    test2 Sheet1.Shapes("ListBox2").OLEFormat.Object ' <<Forms Listbox (avoiding 
                ' deprecated 'Listboxes') 
End Sub 

'ActiveX listbox 
Function test1(lb As msforms.ListBox) 
    Debug.Print lb.ListCount 
End Function 

'Forms listbox 
Function test2(lb As ListBox) 
    Debug.Print lb.ListCount 
End Function 
+0

謝謝你。我確實使用ActiveX。使用另一個有什麼優勢? – teepee

+0

取決於您需要的功能。我似乎有更多的ActiveX呈現問題,所以往往避免在工作表上的那些... –

+0

現在你提到它,我已經有突出顯示的渲染問題。我用ActiveX去了,因爲它很容易給它一個代號。用excel表單列表框可以做到這一點嗎?即我怎麼會把它命名爲'BoxY1'? – teepee