2017-07-19 179 views
0

工作,我需要調整一些預先寫好的VBA代碼。但我更像一個初學者,因此對我來說這非常具有挑戰性。Excel VBA:在多維數組中獲得最小1維度

該代碼創建一個稱爲目標的二維數組。它跨越(可變數量的)KPI,並且每個KPI的值爲10年(固定編號)。例如:

KPI 1 year_1 year_2 ... year_10
KPI 2 year_1 year_2 ... year_10
...... .... ... ....... 。... ... ... ... ...
KPIň year_1 year_2 ... year_10

我現在需要計算每KPI線最小(一維數組) 。

我的醜工作代碼:
WorksheetFunction.Min(Targets(k, 0), Targets(k , 1), Targets(k, 2), Targets(k, 3), Targets(k , 4), Targets(k , 5), Targets(k, 6), Targets(k, 7), Targets(k, 8), Targets(k , 9))

其中K爲指導,以正確的KPI。

我該如何讓它工作,使它基本上佔用了整條生產線,而無需將代碼指向每個特定的單元格? (例如目標(k,:)或目標(k,0到9))

獎勵問題:這些數組中的某些值爲零,因爲它們是tbd。這些應該被排除在最低限度之外。所以我需要最小>零。你能解釋一下嗎?

它可能是超級簡單。但我似乎無法讓它工作。

非常感謝!

+0

https:// stackoverflow。com/questions/7031416/return-index-of-an-array-excel-vba/7031744#7031744 –

回答

0
Private Sub this() 
    Dim Targets As Variant 
    Dim minValuePerRow As String 
    minValuePerRow = "" 
    Targets = ThisWorkbook.Sheets("Sheet3").UsedRange 
    For i = LBound(Targets, 1) To UBound(Targets, 1) 
     For j = LBound(Targets, 2) To UBound(Targets, 2) 
      If (Targets(i, j) <> 0 Or Targets(i, j) <> "") And minValuePerRow = "" Then minValuePerRow = Targets(i, j) 
      If Targets(i, j) <> 0 And Targets(i, j) < minValuePerRow Then 
       minValuePerRow = Targets(i, j) 
      End If 
     Next j 
     Debug.Print ; i 
     Debug.Print ; minValuePerRow 
     minValuePerRow = "" 
    Next i 
End Sub 

EDIT

返工和測試它。這應該足以幫助您適應您的需求。

+0

雖然這個工作,它有一個O(n^2)的時間。嘗試實施不同的排序(如quicksort或mergesort)以顯着加快流程。 – Jsleshem

+0

@Jsleshem我不會因爲這麼簡單的事情而變得複雜。他確實說過他正在使用陣列...... –

+0

公平,我明白 – Jsleshem

0

這並沒有解決你問題的第二部分有關排除零,但...

給定一個2-d陣列(例如,你可能會使用Value工作表區域獲得),你可以使用應用程序的.index得到一個數組的「切片」:

enter image description here

Sub Tester() 

    Dim arr, slice 
    arr = Range("A1:C3").Value 

    'get a "row" 
    slice = Application.Index(arr, 1, 0) 
    Debug.Print Join(slice, "-") '>> 1-2-3 

    'get a "column" (note use of Transpose here) 
    slice = Application.Transpose(Application.Index(arr, 0, 1)) 
    Debug.Print Join(slice, "-") '>> 1-4-7 
    'col 2... 
    slice = Application.Transpose(Application.Index(arr, 0, 2)) 
    Debug.Print Join(slice, "-") '>> 2-5-8 

    Debug.Print Application.Min(slice) '>> 2 


End Sub 

值得關注的是這種方法的性能是怎麼樣的壞,但:Return Index of an Element in an Array Excel VBA

0

如果數組大小過大,您會發現它非常慢。它使用Evaluate方法返回每行的最小值。但是,您會注意到我已經包含了一個使這些目標值可用於評估方法的函數。另外,您會注意到目標是在模塊級別聲明的。

Dim Targets As Variant 

Public Function Values() As Variant 
    Values = Targets 
End Function 

Sub test() 
    Dim i As Long 

    Targets = Range("A1:J10").Value 

    For i = LBound(Targets, 1) To UBound(Targets) 
     Debug.Print Application.Evaluate("MIN(IF(INDEX(Values()," & i & ",0)>0,INDEX(Values()," & i & ",0)))") 
    Next i 
End Sub 

希望這有助於!