Excel VBA:在多维数组中获得最小1维度
工作,我需要调整一些预先写好的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。这些应该被排除在最低限度之外。所以我需要最小>零。你能解释一下吗?
它可能是超级简单。但我似乎无法让它工作。
非常感谢!
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
返工和测试它。这应该足以帮助您适应您的需求。
这并没有解决你问题的第二部分有关排除零,但...
给定一个2-d阵列(例如,你可能会使用Value
工作表区域获得),你可以使用应用程序的.index得到一个数组的“切片”:
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
如果数组大小过大,您会发现它非常慢。它使用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
希望这有助于!
https:// stackoverflow。com/questions/7031416/return-index-of-an-array-excel-vba/7031744#7031744 –