VBA code tìm giá trị lớn nhất (4 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

tuananhdlk

Thành viên mới
Tham gia
17/6/13
Bài viết
9
Được thích
0
Dear các bạn!
hiện tại mình có 1 đoạn code tìm giá trị lớn nhất theo tên từng đối tượng, giờ mình muốn thêm điều kiện cho hàm này mà chưa có hướng xử lý, bạn nào giúp mình với. Sau đây là đoạn code và file excel đính kèm.

Public Function FINDMAX(X, x1, ar1, ar2)
With WorksheetFunction
nb = .Match(X, ar1, 0)
ne = nb + .CountIf(ar1, X)
maxY = ar2(nb)
For i = nb To ne
If ar2(i) > maxY Then
maxY = ar2(i)
End If
Next
FINDMAX = maxY
End With
End Function

các bạn xem tại O4, hàm này sẽ tìm giá trị max theo tên ở cột A:A và số liệu ở cột E:E, giờ mình muốn khống chế thêm 1 điều kiện dò tìm nữa là với giá trị X ở cột D:D, giá trị X này có điều kiện là X1<X<X2, với x1,x2 là các giá trị tham chiếu trong các ô dữ liệu do mình đặt ra, X1,x2 là các giá trị thay đổi trong 1 khoảng nhất định.

Bạn nào rành về vba thì giúp mình với nhé.
THanks!
 

File đính kèm

Hàm của bạn không sử dụng tham số x1 à? Theo mình để tìm max theo điều kiện bằng công thức cũng được, nếu dữ liệu lớn bạn không muốn dùng công thức mảng thì trong code cũng không nên dùng worksheet function.
 
Upvote 0
Bạn xem & kiểm trong file

Thú thực fong cách viết Code của bạn không mấy thiện cảm với mình!

Cũng đã định không can dự đến, nhưng do ngày cuối tuần cũng hơi bị rãnh rỗi
 

File đính kèm

Upvote 0
cám ơn bạn nhiều, bạn giải thích giùm mình đoạn code này sao là: Rws = CSDL.Rows.Count + 9 vậy, cái này người khác viết mình đang nghiên cứu để chỉnh lại mà mình mới nghiên cứu vba nên chưa biết bắt đầu từ đâu.
 
Upvote 0
cám ơn bạn nhiều, bạn giải thích giùm mình đoạn code này sao là: Rws = CSDL.Rows.Count + 9 vậy, cái này người khác viết mình đang nghiên cứu để chỉnh lại mà mình mới nghiên cứu vba nên chưa biết bắt đầu từ đâu.
Ý nghĩa của nólà lấy số dòng của CSDL cộng thêm với 9 gán vào biến Rws
 
Upvote 0
Thực ra bài toán này ta hoàn toàn có thể làm với hàm =DMAX()
Nhưng nhiều người cho là fải thiết kế vùng chuẩn rườm rà;
Nhưng với chút kiến thức VBA ta có thể hoàn toàn tự động hóa công việc
Sau khi xong việc, ta xóa bỏ vùng chuẩn do macro tạo ra cũng được.
 
Upvote 0
Thực ra bài toán này ta hoàn toàn có thể làm với hàm =DMAX()
Nhưng nhiều người cho là fải thiết kế vùng chuẩn rườm rà;
Nhưng với chút kiến thức VBA ta có thể hoàn toàn tự động hóa công việc
Sau khi xong việc, ta xóa bỏ vùng chuẩn do macro tạo ra cũng được.
Dạng bài này có trong topic "Bài tập vba giành cho người mới bắt đầu" của thầy thì phải.
 
Upvote 0
Thì Chàng Chuột thử bắt đầu xem sao!

Chúc thành công & sức khỏe!
 
Upvote 0
Sao bạn không đến topic bạn đã lập ra mà hỏi tiếp?
http://www.giaiphapexcel.com/forum/showthread.php?94012-VBA-code-t%C3%ACm-gi%C3%A1-tr%E1%BB%8B-l%E1%BB%9Bn-nh%E1%BA%A5t&p=586399#post586399
}}}}}
Ở bài đó cú fáp hàm tại [O4] là =FindMAXInt(A3:E2333,J4,L1,N1,5)

Mà tham trị cung cấp cho hàm thông qua [J4] cần fải có trong cột [A] của vùng cần khao sát hay tìm kiếm;

Chỉ riêng khoảng đó bạn đã sai rồi!


dear ban!
Giờ mình muốn chuyển tham tri tìm kiếm sang cột cuối cùng cột L trong sheer force thì làm như thế nào vậy, bạn có thể chỉ giùm mình phương án, mình mới bắt đầu nghiên cứu vba mà hiện giờ mình thử nhiều cách mà vẫn chưa ra. Đây là file đính kèm.
 

File đính kèm

Upvote 0
/(hông biết bạn tính giá trị MAX cho cột nào, nên mình tính cho [V3]

Nếu chưa đúng thì bạn tìm cách đổi lại
 

File đính kèm

Upvote 0
Nếu chưa đúng thì bạn tìm cách đổi lại

cám ơn bạn rất nhiều, với cách tìm giá trị max như trong đoạn code vba này mình thấy nó còn 1 nhược điểm nữa là khi toàn bộ giá trị là số âm thì cách này không thể tìm ra giá trị max. Nó sẽ trả về số 0. Không biết có thể khắc phục được trường hợp này không vậy bạn.

Cám ơn bạn rất nhiều.
 
Upvote 0
À, vậy cần thêm 1 câu lệnh như dưới đây

PHP:
Option Explicit
Function FindIntMAX(CSDL As Range, Beam, Min_ As Double, Max_ As Double, Optional Col As Byte = 8)
 Dim tMax As Double, Rws As Long, J As Long
 Dim Rng As Range, sRng As Range
 
 Rws = CSDL.Rows.Count + 9
 Set Rng = CSDL(CSDL.Columns.Count).Resize(Rws)
 tMax = Application.WorksheetFunction.Min(Columns("G:G"))       '<=|'
 Set sRng = Rng.Find(Beam, , xlValues, xlWhole)
 If sRng Is Nothing Then
    FindIntMAX = "Nothing":             Exit Function
 Else
    Set Rng = sRng.Offset(, -8).Resize(Rws - sRng.Row, 9)
    ReDim Arr(1 To Rng.Rows.Count, 1 To 9)
    Arr() = Rng.Value
    For J = 1 To Rws
        If Arr(J, 9) <> Beam Then Exit For
        If Arr(J, 1) > Min_ And Arr(J, 1) < Max_ Then
            
            If Arr(J, 4) > tMax Then tMax = Arr(J, 4)
        End If
    Next J
 End If
 FindIntMAX = tMax
End Function
.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
PHP:
Option Explicit
Function FindIntMAX(CSDL As Range, Beam, Min_ As Double, Max_ As Double, Optional Col As Byte = 8)
 Dim tMax As Double, Rws As Long, J As Long
 Dim Rng As Range, sRng As Range
 
 Rws = CSDL.Rows.Count + 9
 Set Rng = CSDL(CSDL.Columns.Count).Resize(Rws)
 tMax = Application.WorksheetFunction.Min(Columns("G:G"))       '<=|'
 Set sRng = Rng.Find(Beam, , xlValues, xlWhole)
 If sRng Is Nothing Then
    FindIntMAX = "Nothing":             Exit Function
 Else
    Set Rng = sRng.Offset(, -8).Resize(Rws - sRng.Row, 9)
    ReDim Arr(1 To Rng.Rows.Count, 1 To 9)
    Arr() = Rng.Value
    For J = 1 To Rws
        If Arr(J, 9) <> Beam Then Exit For
        If Arr(J, 1) > Min_ And Arr(J, 1) < Max_ Then
            
            If Arr(J, 4) > tMax Then tMax = Arr(J, 4)
        End If
    Next J
 End If
 FindIntMAX = tMax
End Function
.
cám ơn bạn, nhưng với đoạn code này thì ta sẽ mặc định là tìm giá trị max tại cột G:G. Mình có thể làm sao cho cột G: thành 1 biến động, có thể tìm giá trị max cho cột mà mình muốn không, tức là tìm giá trị mã theo Optional Col ở ngay trong hàm đó bạn, optional col nay sẽ tìm max theo từng cột mà mình muốn,

cám ơn bạn.
 
Upvote 0
cám ơn bạn, nhưng với đoạn code này thì ta sẽ mặc định là tìm giá trị max tại cột G:G. Mình có thể làm sao cho cột G: thành 1 biến động, có thể tìm giá trị max cho cột mà mình muốn không, tức là tìm giá trị mã theo Optional Col ở ngay trong hàm đó bạn, optional col nay sẽ tìm max theo từng cột mà mình muốn,

cám ơn bạn.
Thế thì phải dùng hàm tự tạo thôi!
 
Upvote 0
Hàm tự tạo của bạn đây

PHP:
Option Explicit
Function FindIntMAX(CSDL As Range, Beam, Min As Double, Max As Double, Optional Col As Byte = 4) '<=|'
 Dim tMax As Double, Rws As Long, J As Long
 Dim Rng As Range, sRng As Range
 
 Rws = CSDL.Rows.Count + 9
 
 Set Rng = CSDL(CSDL.Columns.Count).Resize(Rws)
 tMax = -99999999                                           '<=|'
 MsgBox tMax
 Set sRng = Rng.Find(Beam, , xlValues, xlWhole)
 If sRng Is Nothing Then
    FindIntMAX = "Nothing":             Exit Function
 Else
    Set Rng = sRng.Offset(, -8).Resize(Rws - sRng.Row, 9)
    ReDim Arr(1 To Rng.Rows.Count, 1 To 9)
    Arr() = Rng.Value
    For J = 1 To Rws
        If Arr(J, 9) <> Beam Then Exit For
        If Arr(J, 1) > Min And Arr(J, 1) < Max Then _
            If Arr(J, Col) > tMax Then tMax = Arr(J, Col)       '<=|'
    Next J
 End If
 FindIntMAX = tMax
End Function
 
Upvote 0
PHP:
Option Explicit
Function FindIntMAX(CSDL As Range, Beam, Min As Double, Max As Double, Optional Col As Byte = 4) '<=|'
 Dim tMax As Double, Rws As Long, J As Long
 Dim Rng As Range, sRng As Range
 
 Rws = CSDL.Rows.Count + 9
 
 Set Rng = CSDL(CSDL.Columns.Count).Resize(Rws)
 tMax = -99999999                                           '<=|'
 MsgBox tMax
 Set sRng = Rng.Find(Beam, , xlValues, xlWhole)
 If sRng Is Nothing Then
    FindIntMAX = "Nothing":             Exit Function
 Else
    Set Rng = sRng.Offset(, -8).Resize(Rws - sRng.Row, 9)
    ReDim Arr(1 To Rng.Rows.Count, 1 To 9)
    Arr() = Rng.Value
    For J = 1 To Rws
        If Arr(J, 9) <> Beam Then Exit For
        If Arr(J, 1) > Min And Arr(J, 1) < Max Then _
            If Arr(J, Col) > tMax Then tMax = Arr(J, Col)       '<=|'
    Next J
 End If
 FindIntMAX = tMax
End Function

Cám ơn bạn, với đoạn code như trên, mình thấy rằng nó sẽ chỉ tìm được max của 1 mảng cùng tên liên tục, tức là khi tên các đối tượng truy tìm max nằm không theo thứ tự thì nó không tìm ra được giá trị max, có cách nào có thể khắc phục được lỗi này không, cám ơn bạn.
 

File đính kèm

Upvote 0
Hi các bạn, có thế giải thích giúp mình 2 dòng code này được không:

Set Rng = CSDL(CSDL.Columns.Count).Resize(Rws)

Set sRng = Rng.Find(Beam, , xlValues, xlWhole

Cảm ơn các bạn
 
Upvote 0
Web KT

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

Back
Top Bottom