我有一個函數用於返回從單列數據列表創建的數組。我一直在使用這個函數的返回值,本質上它是一個僞全局變量(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數組?或者其他解決方法?
Jeeped釘它。您只創建Variant,然後讓VBA決定數據類型究竟是什麼(因此Variant)。 VBA決定只有一個元素的值不是一個數組,並且可能將其轉換爲一個String。如果您專門創建了一個數組,那麼將該函數的返回值設置爲該數組,它將是一個數組,即使它只有一個元素。 – Tim
謝謝,這很好。如果沒有循環,這也是不可能的?我寧願只分配一個全範圍來代替,除非速度差異很小。 – teepee
@teepee - 如果存在多個值,則可以將該函數重寫爲批量裝入值,但也必須將該單個元素數組創建爲1至1,而不是0至0.從多個裝入數組工作表上的單元格總是創建一個二維數組,即使第二個等級只有1到1 var =範圍(B2:B5)爲1到4,1到1. var =範圍(C3:F3)爲1到1,1到4.目前正在構建的數組基於零和一個維度。你不必轉置它。如果有幾千條,這將是值得的,但我不認爲這是事實。 – Jeeped