2016-03-04 31 views
3

我有一個函數用於返回從單列數據列表創建的數組。我一直在使用這個函數的返回值,本質上它是一個僞全局變量(LINENAMES_ARRAY),我將它傳遞給了許多函數。那些功能比對它做檢查如If Len(Join(LINENAMES_ARRAY)) = 0 Then或通過For Each陳述的項目。下面是代碼:當範圍只包含一個值時,函數將不會返回數組

Function LINENAMES_ARRAY() As Variant 
    'returns an array of all items in the main sheet linenames column 
     LINENAMES_ARRAY = Application.Transpose(MAIN.Range(_ 
     MAIN.Cells(MAIN_HEAD_COUNT + 1, MAIN_LINENAMES_COLUMN), _ 
     MAIN.Cells(LINENAMES_COUNT + 1, MAIN_LINENAMES_COLUMN))) 
    End Function 

我最近無意中發現了其中的一個,你 - 不要看的,它的免耕,你看到的,它的問題,同時使用一個新的項目工作簿,其中如果陣列碰巧只有一個元素,一切都失敗了。顯然在這種情況下,這將返回一個單一的值,所以Join()也將失敗For Each __ in LINENAMES_ARRAY也會。爲什麼不把它當作1x1數組而不是自由值呢?我已經開始通過在被調用的地方重寫函數來減輕問題,檢查它是否是數組,然後執行其他過程。事情是這樣:

For j = 1 To LINENAMES_COUNT 
    LINES_BOX.AddItem lineNames(j) 
Next j 

改爲:

If Not IsArray(LINENAMES_ARRAY) Then 
    myListBox.AddItem CStr(LINENAMES_ARRAY) 
Else 
    For j = 1 To LINENAMES_COUNT 
     LINES_BOX.AddItem LINENAMES_ARRAY(j) 
    Next j 
End If 

然而這個變凌亂,並且增加了許多額外的檢查,以我的代碼,我寧願在LINENAMES_ARRAY函數來處理。有沒有辦法返回1x1數組?或者其他解決方法?

回答

6

如果將數組創建爲單個元素數組並以數組方式填充該數組,則該數組可以具有單個元素。從VBE的Immediate window

Option Explicit 

Dim MAIN_HEAD_COUNT As Long 
Dim LINENAMES_COUNT As Long 
Dim MAIN_LINENAMES_COLUMN As Long 
Dim MAIN As Worksheet 

Sub stuff() 
    Dim arr As Variant 
    Set MAIN = Worksheets("Sheet1") 
    MAIN_LINENAMES_COLUMN = 2 
    MAIN_HEAD_COUNT = 2 
    LINENAMES_COUNT = 2 

    arr = LINENAMES_ARRAY() 
    Debug.Print IsArray(arr) 
    Debug.Print LBound(arr) & ":" & UBound(arr) 
End Sub 

Function LINENAMES_ARRAY() As Variant 
    Dim a As Long, tmp() As Variant 
    ReDim tmp(0 To LINENAMES_COUNT - MAIN_HEAD_COUNT) 
    For a = 0 To LINENAMES_COUNT - MAIN_HEAD_COUNT 
     tmp(a) = MAIN.Range(MAIN.Cells(MAIN_HEAD_COUNT + 1, MAIN_LINENAMES_COLUMN), _ 
          MAIN.Cells(LINENAMES_COUNT + 1, MAIN_LINENAMES_COLUMN)).Cells(a).Value2 
    Next a 
    'returns an array of all items in the main sheet linenames column 
    LINENAMES_ARRAY = tmp 
End Function 

結果:

True 
0:0 
+2

Jeeped釘它。您只創建Variant,然後讓VBA決定數據類型究竟是什麼(因此Variant)。 VBA決定只有一個元素的值不是一個數組,並且可能將其轉換爲一個String。如果您專門創建了一個數組,那麼將該函數的返回值設置爲該數組,它將是一個數組,即使它只有一個元素。 – Tim

+0

謝謝,這很好。如果沒有循環,這也是不可能的?我寧願只分配一個全範圍來代替,除非速度差異很小。 – teepee

+0

@teepee - 如果存在多個值,則可以將該函數重寫爲批量裝入值,但也必須將該單個元素數組創建爲1至1,而不是0至0.從多個裝入數組工作表上的單元格總是創建一個二維數組,即使第二個等級只有1到1 var =範圍(B2:B5)爲1到4,1到1. var =範圍(C3:F3)爲1到1,1到4.目前正在構建的數組基於零和一個維度。你不必轉置它。如果有幾千條,這將是值得的,但我不認爲這是事實。 – Jeeped

相關問題