Tối ưu code xác định những giá trị lớn nhất?

Liên hệ QC

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia
13/6/06
Bài viết
7,181
Được thích
24,625
Tôi có 1 số giá trị khác nhau không theo quy luật và đã tạo vòng lặp để duyệt qua xác định được giá trị lớn nhất. Tuy nhiên giá trị lớn nhất có thể trùng nhau và ta phải xác định những địa chỉ ô chứa giá trị lớn nhất. Nếu dùng thêm 1 vòng lặp nữa thì được nhưng tôi không muốn. ;;;;;;;;;;;
Bác nào có cao kiến chỉ cần 1 vòng lặp mà xác định được những địa chỉ ô chứa giá trị lớn nhất?

Xin cám ơn!
 
Em không biết có thể làm hết tất cả được không nhưng 1 cột thôi thì không cần dùng hàm lặp vẫn có thể lấy được thứ tự lớn nhất. Vậy nếu bác có nhiều cột thì chỉ cần thêm 1 hàm lặp vào thôi! Đây là công thức đơn giản để lấy vị trí ô trong 1 cột. Bác thử thêm vòng lặp cho cột xem thế nào:
Mã:
Function thu(cel As Range) thu = Cells(Application.WorksheetFunction.Match(Application.WorksheetFunction.Max(cel), cel, 0), cel.Column).Address(0, 0) End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Cái này không sử dụng được vì đây là mảng nằm tứ tung trong các sheet bác ạ.
 
Upvote 0
Nếu vậy thì, em chưa nghĩ ra bác, ạ! Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi thử thuật toán này, nghe chừng cũng ổn. File mẫu đây (không phải kiểu bài toán đang thực hiện).

Các bác cho ý kiến nhé.
 

File đính kèm

Upvote 0
Tôi có 1 số giá trị khác nhau không theo quy luật và đã tạo vòng lặp để duyệt qua xác định được giá trị lớn nhất. Tuy nhiên giá trị lớn nhất có thể trùng nhau và ta phải xác định những địa chỉ ô chứa giá trị lớn nhất. Nếu dùng thêm 1 vòng lặp nữa thì được nhưng tôi không muốn. ;;;;;;;;;;;
Bác nào có cao kiến chỉ cần 1 vòng lặp mà xác định được những địa chỉ ô chứa giá trị lớn nhất?

Xin cám ơn!
Nếu chỉ dùng 1 vòng lặp e rằng phải dùng đến hàm Max của Excel. Anh thử tham khảo đoạn code sau:
Mã:
Public Sub Lonnhat_2()
Dim Vung As Range, Max_value As Single
Dim Diachi_max As String, O_giatri As Range
    
Set Vung = Union(Range("B1:B10"), Range("C1:C5")) '....
Max_value = WorksheetFunction.Max(Vung)
For Each O_giatri In Vung
    If Not IsEmpty(O_giatri) And IsNumeric(O_giatri) And O_giatri >= Max_value Then
        Diachi_max = Diachi_max & ", " & O_giatri.Address
    End If
Next O_giatri
Diachi_max = Mid$(Diachi_max, 3)
MsgBox Diachi_max
End Sub
 
Upvote 0
Trong bài toán cụ thể (ví dụ ở trên cho dễ hiểu thôi), Vung có thể gồm nhiều ô rải rác ở các sheet, số lượng không cụ thể (phụ thuộc vào người nhập) nên không thể dùng WorksheetFunction hay chức năng khác của Excel.

Thủ tục dưới sử dụng 2 điều kiện if và nhãn Tiep để thực hiện, quan trọng là vẫn trong 1 vòng lặp thôi, tôi thấy cũng ổn rồi:

PHP:
Sub Lonhat()
    Dim Vung As Range, Max_value As Single
    Dim Diachi_max As String, O_giatri As Range
    Dim Tiep
    
    Max_value = 0
    Set Vung = Range("B1:B10")
    
    For Each O_giatri In Vung
        If O_giatri > Max_value Then
            Max_value = O_giatri
            Diachi_max = O_giatri.Address
            GoTo Tiep
        End If
        If O_giatri = Max_value Then
            Diachi_max = Diachi_max & " , " & O_giatri.Address
        End If
Tiep:
    Next
        MsgBox Max_value & " , " & Diachi_max
    Set Vung = Nothing
End Sub
 
Upvote 0
Trong bài toán cụ thể (ví dụ ở trên cho dễ hiểu thôi), Vung có thể gồm nhiều ô rải rác ở các sheet, số lượng không cụ thể (phụ thuộc vào người nhập) nên không thể dùng WorksheetFunction hay chức năng khác của Excel.

Thủ tục dưới sử dụng 2 điều kiện if và nhãn Tiep để thực hiện, quan trọng là vẫn trong 1 vòng lặp thôi, tôi thấy cũng ổn rồi:

THế này cho nó gọn

PHP:
Sub Lonhat()
    Dim Vung As Range, Max_value As Single
    Dim Diachi_max As String, O_giatri As Range
    Dim Tiep
    
    Max_value = 0
    Set Vung = Range("B1:B10")
    
    For Each O_giatri In Vung
        If O_giatri > Max_value Then
            Max_value = O_giatri
            Diachi_max = ""
        End If
        If O_giatri = Max_value Then Diachi_max = Diachi_max & " , " & O_giatri.Address
    Next
        MsgBox Max_value & " , " & Diachi_max
    Set Vung = Nothing
End Sub
 
Upvote 0
Trong bài toán cụ thể (ví dụ ở trên cho dễ hiểu thôi), Vung có thể gồm nhiều ô rải rác ở các sheet, số lượng không cụ thể (phụ thuộc vào người nhập) nên không thể dùng WorksheetFunction hay chức năng khác của Excel.

Thủ tục dưới sử dụng 2 điều kiện if và nhãn Tiep để thực hiện, quan trọng là vẫn trong 1 vòng lặp thôi, tôi thấy cũng ổn rồi:

PHP:
Sub Lonhat()
    Dim Vung As Range, Max_value As Single
    Dim Diachi_max As String, O_giatri As Range
    Dim Tiep
    
    Max_value = 0
    Set Vung = Range("B1:B10")
    
    For Each O_giatri In Vung
        If O_giatri > Max_value Then
            Max_value = O_giatri
            Diachi_max = O_giatri.Address
            GoTo Tiep
        End If
        If O_giatri = Max_value Then
            Diachi_max = Diachi_max & " , " & O_giatri.Address
        End If
Tiep:
    Next
        MsgBox Max_value & " , " & Diachi_max
    Set Vung = Nothing
End Sub

Của bác mới chỉ là 1 vùng, VD có 10 vùng ở 10 sheet khác nhau thì bác làm thế nào ??? Dùng Union hay là chạy từng vùng ???

Các vùng của bác có khi nào >1 cột không ??

Thân!
 
Upvote 0
Vậy bác có cách nào nạp dữ liệu của tất cả các ô ở các vùng riêng biệt ấy vào trong 1 mãng ảo được không. Và nhớ thêm cả tên của ô tương ứng với vùng dữ liệu nạp vào trong mãng ảo đó. Rồi ta so sánh trong mãng đó lấy ra giá trị lớn nhất đồng thời cắt đi giá trị đó để chỉ còn lại tên của ô đó thôi! (Một chút ý kiến nhỏ - Không biết có khả thi không?)
 
Lần chỉnh sửa cuối:
Upvote 0
Thực ra nó đâu quá phức tạp nên chỉ cần duyệt từng ô trong vùng bằng for ... next thôi, không cần Union cho phức tạp thêm. Của anh Tiger gọn nhưng vẫn bị thừa cái đo đỏ.

Lonnhat.jpg
 
Upvote 0
Thủ tục này tìm số lớn nhất của 3 vùng trong 1 sheet. Số vùng có thể thay đổi bằng Set Vung
Dùng hàm Max tìm số lớn nhất và phương thức Find để tìm địa chỉ ô có số lớn nhất.
Mã:
Sub SoMax()
Dim Vung As Range, myMax As Single, nMax As Single
Dim diachi As String, diachi1 As String
myMax = 0
Set Vung = Range("A5:C17,C12:F20,E3:G10")
Vung.Select
nMax = Application.WorksheetFunction.Max(Vung)
If nMax = 0 Then
  MsgBox "Vung chon khong co so"
Else
  Do
    Selection.Find(What:=nMax, After:=ActiveCell).Activate
    If ActiveCell.Address = diachi1 Then Exit Do
    diachi = diachi & ", " & ActiveCell.Address(0, 0)
    If diachi1 = "" Then diachi1 = ActiveCell.Address
  Loop
  MsgBox nMax & diachi
End If
Set Vung = Nothing
End Sub
 

File đính kèm

Upvote 0
Thủ tục này tìm số lớn nhất của 3 vùng trong 1 sheet. Số vùng có thể thay đổi bằng Set Vung
Dùng hàm Max tìm số lớn nhất và phương thức Find để tìm địa chỉ ô có số lớn nhất.

Cảm ơn bác, em cũng đã nghĩ đến điều này, tuy nhiên còn đang tìm hiểu về việc liệu Find có hỗ trợ tìm kiếm kiểu ">8" hay không !!! Và tìm chưa thấy.

Nếu các vùng ở nhiều Sheet khác nhau thì sao nhỉ ?? Hay là tìm max của mỗi vùng, sau đó so sánh các Max của các vùng với nhau ???

Thân!
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom