如何在10x10矩阵vba excel中找到每列的最小值

时间:2012-08-04 08:20:35

标签: excel-vba vba excel

我需要一些帮助才能找到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

这段代码效果很好但如果我想改变矩阵的维度会导致问题。

4 个答案:

答案 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