返回列表 上一主題 發帖

[發問] 找出最大值對應的row, column

[發問] 找出最大值對應的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的陣列, 執行時間則會變長, 是否有其他更有效率方法可以做?

本帖最後由 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
複製代碼
表達不清、題意不明確、沒附檔案格式、沒有討論問題的態度~~~~~~以上愛莫能助。

TOP

回復 2# stillfish00

這樣跟我原本方式差不多, 當範圍大時loop須跑的項數就多了,不知道有沒有更快的方式?
ar = [B16].CurrentRegion.Value這寫法我倒是沒想過, 多學一招 謝謝

TOP

最大數值最多有幾個???
若只要找出一個, 用RANGE.FIND即可, 不須迴圈,
上傳大略樣本資料的檔案, 才好處理~~

TOP

回復 4# 准提部林
findMax.zip (95.63 KB)
範圍是變動的, 每次遇到的範圍可能會不一樣

TOP

回復 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

TOP

回復 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
複製代碼
學海無涯_不恥下問

TOP

        靜思自在 : 好事要提得起,是非要放得下,成就別人即是成就自己。
返回列表 上一主題