我有一些代碼將表格加載到陣列中,進行一些計算,創建一個新作業表,將更改后的陣列寫入新作業表,并將該新作業表保存為 CSV。
我需要一個 CSV,因為這是目標系統接受的唯一格式。
我想知道是否可以直接將陣列寫入 CSV 跳過 2 個步驟。
通過我的研究,我從
我想不通的是,當我在觀察視窗中觀察 MyArray 時,它按照預期的方式填充,所以我無法弄清楚這個錯誤。任何幫助表示贊賞
uj5u.com熱心網友回復:
您需要了解VBA 中aVariant和Array of Variant
AVariant變數之間的區別可以容納任何東西,包括陣列。陣列始終是陣列:
Dim v1 as Variant
v1 = 3 ' Now v1 holds an Integer
Redim v1(1 to 10) ' ...and now it holds an array of Variant
v1(1) = 3 ' The first member of v1 now holds an Integer
v1 = "VBA is a miracle" ' Now v1 holds a string (and is no longer an array)
Dim v2() as Variant ' v2 is an array of Variant per declaration
Redim v2(1 to 10) ' Assign 10 members to v2
v2(1) = 3 ' The first member of v1 now holds an Integer
v2 = "VBA is a mystery" ' This is not possible as v2 is an array!
' (Compiler error "Can't assign to an array)
如果你用 parameter 宣告你的 Sub MyArray() As Variant,你是說你的函式需要一個變數陣列作為引數。在您的通話中SaveAsCSV arOut, Application.ActiveWorkbook.Path & "\Demo.csv",您將變數arOut作為引數傳遞。
這個變數很可能被宣告為Variant(而不是變數陣列),因此你會得到第一個編譯器錯誤:變數不是變數陣列。編譯器根本無法知道在運行時,arOut將是一個陣列。它也可以是整數或字串或其他任何東西。
現在您將例程宣告的引數更改為MyArray As Variant并且您的呼叫有效,編譯器不再抱怨,它假定MyArray可以是任何東西。如果你給它分配一個數字或字串,無論如何都會呼叫 Sub(當然它不會作業)。
在例程中,您撰寫UBound(MyArray(), 1). 編譯器再次抱怨,因為MyArray它不是陣列。通過將呼叫更改為UBound(MyArray, 1),編譯器很高興。如果MyArray不包含陣列,您將收到運行時錯誤(型別不匹配)。
因此MyArray as Variant,在函式宣告中使用并在使用時去掉括號可以UBound解決您的問題,每個人都很高興。
有一個小缺點:如前所述,編譯器無法保護您免于使用無效引數呼叫 Sub。作為程式員,您希望編譯器能夠捕獲盡可能多的問題。所以另一種方法是宣告arOut為陣列:
Dim arOut() as Variant
arOut = Range("A1:F10") ' Do whatever magic you need to fill the array.
現在您可以回傳到宣告Public Sub SaveAsCSV(MyArray() As Variant...。使用UBound(myArray(), 1)也會起作用。但是,您可以(并且應該)UBound(myArray, 1)在任何情況下撰寫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/375566.html
