我需要一些帮助才能找到10x10矩阵每列的最小值。 我的矩阵没有显示在电子表格中,所以我不能使用worksheetfunction.min(cells(1,j),cells(10,j))。
另外,我想将包含最小值的单元格旁边的单元格替换为空白。
谢谢你的帮助
干杯
for j=1 to n
worst=application.worksheetfunction.min(c(1,j),c(2,j),c(3,j),c(4,j),c(5,j),c(6,j),c(7,j),c(8,j),c(9,j),c(10,j))
next j
这段代码效果很好但如果我想改变矩阵的维度会导致问题。
答案 0 :(得分:1)
UBound(c, 2)
将为您提供数组中的列数。
所以你的代码看起来像这样(从Doc Brown的答案建立):
For j = LBound(c, 2) To UBound(c, 2) ' columns
worst = c(1, j)
For i = LBound(c) To UBound(c) ' rows
If c(i, j) < worst Then
worst = c(i, j)
End If
Next i
' do something with 'worst' here
Next j
答案 1 :(得分:0)
示例VBA代码(未经测试,只是出于我的想法):
for j=1 to n
worst=c(1,j)
for i = 2 to 10 ' replace 10 by any other value you like
if c(i,j)< worst then worst=c(i,j)
next i
next j
答案 2 :(得分:0)
第一个回答
这是我的第一个答案。我没有仔细阅读你的问题,也没有注意到你想要每列的最低要求。我已经离开了这个答案,因为它可能仍然有价值。
某些工作表函数适用于数组。请尝试以下代码。
最初,Test2中的最小值为1,并且例程在两个不同的位置找到该值。我从数组中删除了1,最后添加了51。例程然后找到2。
我还没有计划这个例程,但如果它不比VBA快,我会很惊讶。
Option Explicit
Sub Try()
Dim InxT11 As Long
Dim InxT12 As Long
Dim InxT2 As Long
Dim Test1(1 To 10, 1 To 5) As Long
Dim Test2() As Variant
Test2 = Array(5, 20, 27, 30, 45, 50, 4, 15, 32, 33, 47, 49, 3, 11, 12, _
21, 34, 40, 2, 10, 13, 18, 19, 24, 25, 26, 36, 42, 43, 44, _
6, 7, 17, 31, 39, 41, 8, 9, 14, 16, 22, 23, 28, 29, 35, 37, _
38, 46, 48, 51)
InxT2 = LBound(Test2)
For InxT11 = LBound(Test1, 1) To UBound(Test1, 1)
For InxT12 = LBound(Test1, 2) To UBound(Test1, 2)
Test1(InxT11, InxT12) = Test2(InxT2)
InxT2 = InxT2 + 1
Next
Next
Debug.Print WorksheetFunction.Min(Test1)
End Sub
第二个回答
对于这个答案,我使用了一个参差不齐或锯齿状的阵列。对于不规则的数组,每行可以具有不同数量的列。我的所有行都是相同的长度,但它们可能有不同的长度,代码没有重大变化。
我已将Test
定义为固定大小的变体数组。它可以很容易动态。
变体或变体数组的元素可以是数组。我已将Test
的每个元素设置为五元素数组。
循环显示每行的最小值为字符串:5 4 3 2 13 26 6 8 22 37。
您要求每列的最小值,但我想不出可以实现这一目标的方法(VBA循环除外)。如果您喜欢这种方法,则必须将列设为第一维,将行设为第二维。
注意:访问不规则数组元素的语法不同。它是:
Debug.Print Test(InxD1)(InxD2)
希望这会有所帮助。
Option Explicit
Sub Try2()
Dim InxT As Long
Dim Test(1 To 10) As Variant
Test(1) = Array(5, 20, 27, 30, 45)
Test(2) = Array(50, 4, 15, 32, 33)
Test(3) = Array(47, 49, 3, 11, 12)
Test(4) = Array(21, 34, 40, 2, 10)
Test(5) = Array(13, 18, 19, 24, 25)
Test(6) = Array(26, 36, 42, 43, 44)
Test(7) = Array(6, 7, 17, 31, 39)
Test(8) = Array(41, 8, 9, 14, 16)
Test(9) = Array(22, 23, 28, 29, 35)
Test(10) = Array(37, 38, 46, 48, 51)
For InxT = LBound(Test) To UBound(Test)
Debug.Print WorksheetFunction.Min(Test(InxT)) & " ";
Next
Debug.Print
Debug.Print Test(1)(2)
End Sub
答案 3 :(得分:0)
以下是一些实际时间,这样您就可以看到为什么“避免循环”并不总是您正在寻找的胜利:
Sub Tester()
Const NUM_REPS As Long = 10000
Dim arr(1 To 10, 1 To 10)
Dim r As Integer, c As Integer, t, l As Long, v, worst
For r = 1 To 10
For c = 1 To 10
arr(r, c) = Rnd() * 10
Next c
Next r
'worst (~5-6 sec)
t = Timer
For l = 1 To NUM_REPS
worst = arr(1, 1)
For c = 1 To 10
v = Application.Min(Application.Index(arr, 0, c))
If v < worst Then worst = v
Next c
Next l
Debug.Print worst, Timer - t
'better (0.4sec)
t = Timer
For l = 1 To NUM_REPS
worst = Application.Min(arr)
Next l
Debug.Print worst, Timer - t
'###best### (~0.05 sec)
t = Timer
worst = arr(1, 1)
For l = 1 To NUM_REPS
For r = 1 To 10
For c = 1 To 10
v = arr(r, c)
If v < worst Then worst = v
Next c
Next r
Next l
Debug.Print worst, Timer - t
End Sub