2016-02-29 95 views
2

我想在另一個陣列應用WorksheetFunction.Small這樣:WorksheetFunction.Small:如何定義數組

ReDim ArrSmall(Iterations, 20) 

For l = 1 To Iterations 
For k = 1 To 20 
ArrSmall(l, k) = WorksheetFunction.Small(ArrResult(l, k), l) 
Next k 
Next l 

我知道這個部分:ArrResult(l,k),是錯誤的,因爲它要求一個範圍,而不是一個單一的我輸入的號碼。但是,我不確定如何在代碼中定義範圍。

這是可能的或我必須輸出的值在一個TempSheet,然後回到一個數組?我認爲一個解決方案是調用整個數組的列,但我不知道如何。

編輯:

我設法寫一個啞代碼不正是我想要什麼,但怪異的部分是,當我申請相同的,以我的原代碼,所有的值被弄混(它確實彌補值據我所知)。請參閱以下代碼:

Sub test() 

ReDim ArrTest(10, 1) 
ReDim ArrSmall(10, 1) 

ArrTest = Range("A1:A10") 
For i = 1 To 10 
ArrSmall(i, 1) = WorksheetFunction.Small(ArrTest, i) 
Cells(i, 2) = ArrTest(i, 1) 
Cells(i, 3) = ArrSmall(i, 1) 
Next i 

嘗試在新循環前清除整個數組。也許這可以修復它...

+0

我正在研究'Application.Index'現在,也許是一個解決方案。 –

+0

「Small」函數的第一個參數可以是一維數組或範圍。行參數爲'0'的'Index'函數會返回一個完整的'列'(或者你的數組的單個向量,但以這種方式使用索引可能比創建一維數組要慢 - 如果速度慢,你需要測試 –

+0

'ArrSmall(l,k)= WorksheetFunction.Small(Application.Index(ArrResult,0,k),l)'我現在有這個,但它仍然返回1004錯誤 –

回答

2

如果您希望從A1:T20中獲取每列的最小值(與Min相同),那麼您可以使用TRANPOSE(使用列而不是行)然後INDEX來分隔每一列,即

IF測試是爲了避免將SMALL應用到空數組(否則會導致錯誤結果)。

Sub B() 
Dim ArrSmall(1 To 1, 1 To 20) 
Dim lngCnt As Long 
Dim ArrResult 

ArrResult = Application.Transpose([a1:t20].Value2) 

For lngCnt = 1 To UBound(ArrResult, 2) 
If Application.Count(Application.Index(ArrResult, lngCnt)) > 0 Then _ 
    ArrSmall(1, lngCnt) = WorksheetFunction.Small(Application.Index(ArrResult, lngCnt), 1) 
Next 
End Sub 
+0

我是沒有尋找每列的最小值我正在尋找從一個多維數組中的所有列從最小到最大的因爲我認爲這是不可能一次完成這一切我試圖提取每個單獨的列應用「WorksheetFunction 。小「,然後將它們添加到一個新的陣列(似乎很單調,但我暈以後再創建它們的CDF)。我已經想出瞭如何做到這一點,但結果包含錯誤。出於某種原因,「小型」值(在ArrSmall中)與ArrResult中的實際值不同。我正在嘗試重新創建錯誤。 –