2017-07-19 177 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 

希望这有助于!