2014-04-07 47 views
0

我目前正在處理一個模塊,它是爲了填充三個ActiveX列表框。每個元素都將使用相同的值進行填充:圖形上軸標題的選擇(X軸,主要Y軸和輔助Y軸)。我有一個名爲「FillBox」的函數,它將ListBox作爲參數並填充它。VBA Excel - 從函數返回一個ListBox的數組

原來我用下面來實現:

Sub FillAllBoxes() 
    FillBox X_BOX 
    FillBox Y1_BOX 
    FillBox Y2_BOX 
End Sub 

我被告知,我不能用一個聯盟來壓縮,因爲MSForms.ListBox對象類型的驗證碼。還有很多其他的子工具在每個盒子上執行重複的操作,所以看起來最好使用某種數組。

到目前爲止,我發現定義這個ListBox數組的唯一方法如下,但我不滿意返回值是Variant的事實,但我似乎無法讓它工作,如果我把它定義爲功能BOX_ARRAY()作爲MSForms.ListBox:

Function BOX_ARRAY() As Variant 
    Dim Temp(1 To 3) As MSForms.ListBox 
    Set Temp(1) = X_BOX 
    Set Temp(2) = Y1_BOX 
    Set Temp(3) = Y2_BOX 
    BOX_ARRAY = THIS_ARRAY 
End Function 

然後我就可以使用這個子,但我需要明確定義的參數FillBox以ByVal,因爲BOX_ARRAY是一個變體。

Sub FillAllBoxes() 
    For j = LBound(BOX_ARRAY) To UBound(BOX_ARRAY) 
     FillBox BOX_ARRAY(j) 
    Next j 
End Sub 

A)有什麼辦法讓函數返回一個不是Variant的數組嗎?

B)明智地堅持我的原始方法只是明確地重複每個列表框的功能,還是值得使用數組進行這種類型的操作?

C)在函數BOX_ARRAY是否有一種方法來定義一個Temp數組,並且只是將返回的數組填充到蝙蝠右邊?

+1

如果你不喜歡'Variant',你可以把它變成'Collection',但是,你永遠不會在VBA中獲得一個強類型的數組/集合,我喜歡你的第一個解決方案,它是最少量的代碼和工作,對嗎? – Brad

+0

它確實有效,但我討厭在代碼,所以我想我會分支到其他領域,希望得到一個更優雅的解決方案。謝謝你的提示。 – teepee

+1

它只是幾乎沒有多餘的。他們的方式,你解決這個'冗餘'是寫*更多*代碼,這不應該是目標,它是清晰可讀的,因爲它傳遞陣列會使事情變得複雜,只有3個列表框,如果你有50個,它會是一個不同的故事 – Brad

回答

0

這裏所說:

有跡象表明,每個盒子上進行反覆操作很多其他潛艇

簡單的列表框傳遞給在列表框進行動作的功能,如:

Sub MyExample() 

EnableListBoxes Array(Me.ListBox1, Me.ListBox2, Me.ListBox3) 

End Sub 

Sub EnableListBoxes(boxes as Variant) 
Dim lbox as variant 

For each lbox in boxes 
    lbox.Enabled = True 
Next 

End Sub 

或者,您可以傳遞整個表單/工作表/無論包含列表框,並遍歷包含它們的集合(例如,UserForm.Controls等)。你需要做一些額外的邏輯來確保你在正確的窗體控件類型上運行,但這樣做相對容易。

我似乎無法得到它的工作,如果我把它定義爲功能BOX_ARRAY()作爲MSForms.ListBox

當然不是,因爲MSForms.ListBox是一個單獨的對象。你不能指望返回一個任何東西的數組到一個函數,該函數被設計爲返回一個對象。

有沒有辦法讓函數返回一個不是Variant的數組?

也許使用子程序並傳遞參數ByRef。如果您直接使用參考而不是本地副本,則無需返回值。參見芯片皮爾遜一些詳細說明/例子:

http://www.cpearson.com/excel/passingandreturningarrays.htm

Sub TestByRef() 
Dim i as Integer 
    i = 1 
    ChangeValue i 

    Debug.Print i 

End Sub 

Sub ChangeValue(ByRef x as Integer) 

    x = 3 

End Sub 

在功能BOX_ARRAY是有沒有解決辦法定義一個臨時數組,只是填充返回數組了蝙蝠的權利?

不是我能想到的。也許使用類模塊和類_Initialize方法,您可以自動分配類properties中的一個。但我認爲最終是相同的方法:創建一個定義返回值的臨時數組。很難說清楚,因爲你沒有提供足夠的代碼(例如,變量在哪裏,甚至是聲明的)?