Board logo

標題: [發問] 找出最大值對應的row, column [打印本頁]

作者: acdx    時間: 2019-2-21 10:21     標題: 找出最大值對應的row, column

我想找一個範圍內最大值,並找到所對應橫列/縱列的值
如範例中最大值為18.66423, 對應衡列值為400, 縱列值為25, 我的程式如下
    Col = Range("B15").End(xlToRight).Column
    Rw = Range("B15").End(xlDown).Row
    Range("H11") = Application.Max(Range(Cells(16, 2), Cells(Rw, Col)))
    For j = 16 To Rw
          For k = 2 To Col
          MAXV = Range("H11").Value
            If Cells(j, k) = MAXV Then
              Range("I11") = Cells(j, 1).Value
              Range("J11") = Cells(15, k).Value
              GoTo 5
            End If
          Next k
    Next j
Msgbox (MAXV,  Range("I11"), Range("J11"))
我利用loop去找對應最大值的橫/縱列值, 但是當這個範圍非常大時,可能是1500*1500的陣列, 執行時間則會變長, 是否有其他更有效率方法可以做?
[attach]30117[/attach]
作者: stillfish00    時間: 2019-2-21 17:29

本帖最後由 stillfish00 於 2019-2-21 17:42 編輯

回復 1# acdx
不要在大範圍的loop內頻繁地存取儲存格
  1. Sub Solution()
  2.     Dim maxv As Double, ar, headers(0 to 1)
  3.     maxv = 0
  4.     ar = [B16].CurrentRegion.Value
  5.     For i = 2 To UBound(ar)
  6.         For j = 2 To UBound(ar, 2)
  7.             If ar(i, j) > maxv Then
  8.                 maxv = ar(i, j)
  9.                 headers(0) = ar(i, 1)
  10.                 headers(1) = ar(1, j)
  11.             End If
  12.         Next
  13.     Next
  14.     'Range("H11") = maxv
  15.     'Range("I11") = headers(0)
  16.     'Range("J11") = headers(1)
  17.     Debug.Print maxv, headers(0), headers(1)
  18. End Sub
複製代碼

作者: acdx    時間: 2019-2-21 18:28

回復 2# stillfish00

這樣跟我原本方式差不多, 當範圍大時loop須跑的項數就多了,不知道有沒有更快的方式?
ar = [B16].CurrentRegion.Value這寫法我倒是沒想過, 多學一招 謝謝
作者: 准提部林    時間: 2019-2-22 11:05

最大數值最多有幾個???
若只要找出一個, 用RANGE.FIND即可, 不須迴圈,
上傳大略樣本資料的檔案, 才好處理~~
作者: acdx    時間: 2019-2-22 14:44

回復 4# 准提部林
[attach]30130[/attach]
範圍是變動的, 每次遇到的範圍可能會不一樣
作者: 准提部林    時間: 2019-2-22 16:39

回復 5# acdx

先試試~~
Sub TEST()
Dim R&, C&, Mx, xF As Range
R = Cells(Rows.Count, 1).End(xlUp).Row
C = Cells(15, Columns.Count).End(xlToLeft).Column
With Range([B16], Cells(R, C))
     Mx = Application.Max(.Cells)
     Set xF = .Find(Mx, Lookat:=xlWhole)
     Range("I11") = Cells(xF.Row, 1).Value
     Range("J11") = Cells(15, xF.Column).Value
End With
End Sub
作者: Hsieh    時間: 2019-2-22 16:48

回復 5# acdx
  1. Sub ex()
  2. Dim A As Range, Rng As Range, C As Range
  3. Set A = Range([B16], [B16].End(xlDown))
  4. Set Rng = Range(A, A.End(xlToRight))
  5. Set C = Rng.Find(Application.Max(Rng))
  6. r = Rng(1).Row
  7. k = Rng(1).Column
  8. MsgBox C.Offset(r - C.Row - 1, 0)
  9. MsgBox C.Offset(, k - C.Column - 1)
  10. End Sub
複製代碼





歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)