2012-08-04 48 views
0

我需要在我的10×10矩陣中的每一列找到最小值一些幫助。 我的矩陣沒有顯示在電子表格中,所以我不能使用worksheetfunction.min(單元格(1,j),單元格(10,j))。矩陣VBA如何找到一個10×10的每一列的最小值練成

而且,我想更換旁邊包含最小值爲空白單元格的單元格。

感謝你的幫助

乾杯

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

此代碼的工作很好,但如果我想改變我的矩陣維它會導致問題。

+1

爲了得到更好的幫助,你應該解釋[你嘗試了什麼](http://whathaveyoutried.com)和你被卡住的地方,例如通過顯示不能按預期工作的代碼。 – assylias 2012-08-04 08:22:25

+0

'我的矩陣不顯示在電子表格中 - 這是什麼意思?即使單元格被隱藏,「Cells」屬性也可以訪問每個工作表上的每個單元格。 '我想將包含最小值的單元格旁邊的單元格替換爲空白。'我們需要查看樣例輸入和預期輸出。 – JimmyPena 2012-08-04 11:17:35

+1

您是否嘗試過使用'Application.Min(c)' - 是否有效? – 2012-08-05 18:56:48

回答

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 
+0

有沒有辦法做到沒有循環?感謝您的回覆:) – user1525225 2012-08-04 10:04:42

+0

@ user1525225:在純粹的VBA?我不這麼認爲。爲什麼? – 2012-08-04 10:08:55

+0

,因爲當我將這個代碼與worksheetfunction.min進行比較時,使用循環運行我的模擬需要更長的時間。 – user1525225 2012-08-04 10:13:18

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 
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 
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 
相關問題