Lọc giá trị lớn nhất hoặc nhỏ nhất ở cột này ứng tên ở cột khác!!

Liên hệ QC

nad582

Thành viên thường trực
Tham gia
7/6/11
Bài viết
317
Được thích
48
Mình có vấn đề như zầy:
Các bạn viết "code vba" hộ mình với: lọc giá trị lớn nhất ở cột "D" ứng với tên cột "A" sau đó tô đậm tên cột "A".
EX: COT1 0 COMB23 739,421 -19,83 5,5999 -57,1075
Lọc giá trị lớn nhất ở cột "F" ứng với tên cột "A" sau đó tô đậm tên cột "A".
EX: COT1 0 COMB7 -691,951 -3,214 30,8178 -5,2642
Lọc giá trị lớn nhỏ nhất ở cột "F" ứng với tên cột "A" sau đó tô đậm tên cột "A".
EX: COT1 0 COMB8 -522,396 16,298 -44,8684 52,65
Lọc giá trị lớn nhất ở cột "G" ứng với tên cột "A" sau đó tô đậm tên cột "A".
EX: COT1 0 COMB8 -522,396 16,298 -44,8684 52,65
Lọc giá trị lớn nhỏ nhất ở cột "G" ứng với tên cột "A" sau đó tô đậm tên cột "A".
EX: COT1 0 COMB9 -647,916 -21,04 24,6386 -61,8338
Lưu Ý: giá trị cột "D" là trị tuyệt đối, các cột còn lại là phân biệt dấu.Các tên cột khác cũng như zậy
Xin các bạn viết hộ mình nhé xin cảm ơn nhiều.
 
Lần chỉnh sửa cuối:
Mình có vấn đề như zầy:
Các bạn viết "code vba" hộ mình với: lọc giá trị lớn nhất ở cột "D" ứng với tên cột "A" sau đó tô đậm tên cột "A".
EX: COT1 0 COMB23 739,421 -19,83 5,5999 -57,1075
Lọc giá trị lớn nhất ở cột "F" ứng với tên cột "A" sau đó tô đậm tên cột "A".
EX: COT1 0 COMB7 -691,951 -3,214 30,8178 -5,2642
Lọc giá trị lớn nhỏ nhất ở cột "F" ứng với tên cột "A" sau đó tô đậm tên cột "A".
EX: COT1 0 COMB8 -522,396 16,298 -44,8684 52,65
Lọc giá trị lớn nhất ở cột "G" ứng với tên cột "A" sau đó tô đậm tên cột "A".
EX: COT1 0 COMB8 -522,396 16,298 -44,8684 52,65
Lọc giá trị lớn nhỏ nhất ở cột "G" ứng với tên cột "A" sau đó tô đậm tên cột "A".
EX: COT1 0 COMB9 -647,916 -21,04 24,6386 -61,8338
Lưu Ý: giá trị cột "D" là trị tuyệt đối, các cột còn lại là phân biệt dấu.Các tên cột khác cũng như zậy
Xin các bạn viết hộ mình nhé xin cảm ơn nhiều.
Dựa vào cấu trúc dữ liệu trong file của bạn, thử Code này cho cái CommandButton của bạn xem kết quả có đúng không?
PHP:
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Dim Rng As Range, Cll As Range
Set Rng = Range([B4], [B65000].End(xlUp))
[A4:G65000].Interior.ColorIndex = 0
For Each Cll In Rng
    If Cll.Value = 0 Then
        Cll.Offset(, -1).Resize(, 7).Interior.ColorIndex = 6
    End If
Next
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Bạn hiểu lầm ý của mình rồi: ý mình là tìm giá trị lớn nhất của nội lực P ứng với COT1 rồi tô đậm "COT1";
tìm giá trị lớn nhất của nội lực M2 ứng với COT1 rồi tô đậm "COT1";
tìm giá trị nhỏ nhất của nội lực M2 ứng với COT1 rồi tô đậm "COT1";
tìm giá trị lớn nhất của nội lực M3 ứng với COT1 rồi tô đậm "COT1";
tìm giá trị nhỏ nhất của nội lực M2 ứng với COT1 rồi tô đậm "COT1"_mình có ví dụ ở file đính kèm rồi đó!!! - bạn thử xem bảng nội lực!!!! Thank you very much@@@
 
Upvote 0
Bạn hiểu lầm ý của mình rồi: ý mình là tìm giá trị lớn nhất của nội lực P ứng với COT1 rồi tô đậm "COT1";
tìm giá trị lớn nhất của nội lực M2 ứng với COT1 rồi tô đậm "COT1";
tìm giá trị nhỏ nhất của nội lực M2 ứng với COT1 rồi tô đậm "COT1";
tìm giá trị lớn nhất của nội lực M3 ứng với COT1 rồi tô đậm "COT1";
tìm giá trị nhỏ nhất của nội lực M2 ứng với COT1 rồi tô đậm "COT1"_mình có ví dụ ở file đính kèm rồi đó!!! - bạn thử xem bảng nội lực!!!! Thank you very much@@@
Không cùng ngành nghề, chẳng hiểu nội lực là gì (toàn tên tiếng Anh).
Nếu không đúng thì nhờ các bạn khác giúp vậy.
 
Upvote 0
Mình có vấn đề như zầy:
Các bạn viết "code vba" hộ mình với: lọc giá trị lớn nhất ở cột "D" ứng với tên cột "A" sau đó tô đậm tên cột "A".
EX: COT1 0 COMB23 739,421 -19,83 5,5999 -57,1075
Lọc giá trị lớn nhất ở cột "F" ứng với tên cột "A" sau đó tô đậm tên cột "A".
EX: COT1 0 COMB7 -691,951 -3,214 30,8178 -5,2642
Lọc giá trị lớn nhỏ nhất ở cột "F" ứng với tên cột "A" sau đó tô đậm tên cột "A".
EX: COT1 0 COMB8 -522,396 16,298 -44,8684 52,65
Lọc giá trị lớn nhất ở cột "G" ứng với tên cột "A" sau đó tô đậm tên cột "A".
EX: COT1 0 COMB8 -522,396 16,298 -44,8684 52,65
Lọc giá trị lớn nhỏ nhất ở cột "G" ứng với tên cột "A" sau đó tô đậm tên cột "A".
EX: COT1 0 COMB9 -647,916 -21,04 24,6386 -61,8338
Lưu Ý: giá trị cột "D" là trị tuyệt đối, các cột còn lại là phân biệt dấu.Các tên cột khác cũng như zậy
Xin các bạn viết hộ mình nhé xin cảm ơn nhiều.
Yêu cầu đâu tiên:
Mã:
[B]COT1          [/B]0          [COLOR=#0000cd]COMB23[/COLOR]            [B][COLOR=#ff0000]739,421[/COLOR][/B]        [COLOR=#0000cd]-19,83              5,5999               -57,1075[/COLOR]
Thì tôi hiểu rằng còn số màu đỏ là số cần tìm (tìm MAX cột D với điều kiện cột A = "COT1") và các giá trị màu xanh "tự theo" giá trị lọc màu đỏ
Nhưng...
Từ yêu cầu thứ 2 trở đi tôi cóc hiểu gì cả
Mã:
[B]COT1          [/B]0          COMB7            -691,951        -3,214             30,8178              -5,2642[COLOR=#0000cd][/COLOR]
Chẳng biết mấy con số này được tính thế nào mà ra nữa
Bạn nói rõ chút đi
 
Upvote 0
Yêu cầu đâu tiên:
Mã:
[B]COT1          [/B]0          [COLOR=#0000cd]COMB23[/COLOR]            [B][COLOR=#ff0000]739,421[/COLOR][/B]        [COLOR=#0000cd]-19,83              5,5999               -57,1075[/COLOR]
Thì tôi hiểu rằng còn số màu đỏ là số cần tìm (tìm MAX cột D với điều kiện cột A = "COT1") và các giá trị màu xanh "tự theo" giá trị lọc màu đỏ
Nhưng...
Từ yêu cầu thứ 2 trở đi tôi cóc hiểu gì cả
Mã:
[B]COT1          [/B]0          COMB7            -691,951        -3,214             30,8178              -5,2642
Chẳng biết mấy con số này được tính thế nào mà ra nữa
Bạn nói rõ chút đi
Hình như là thế này:
Cột thứ 2:
MAX của cột F với điều kiện cột A = "COT1", tức là số 30,8178, các cột còn lại chạy theo nó
Cột thứ 3:
MIN của cột F với điều kiện cột A = "COT1", tức là số -44.8684, các cột còn lại chạy theo nó
........
Lúc trước có làm một bài.....y chang bài này (nhưng hình như nhiều điều kiện hơn thì phải) trên diễn đàn rồi, lâu quá nên hổng tìm ra nó
Híc
 
Upvote 0
Bạn ơi: yêu cầu thứ 2 cũng giống như yêu cầu 1 vậy (tìm MAX cột F với điều kiện cột A = "COT1") và các giá trị màu xanh "tự theo"
yêu cầu thứ 3 (tìm MIN cột F với điều kiện cột A = "COT1") và các giá trị màu xanh "tự theo"
yêu cầu thứ 4 (tìm Max cột G với điều kiện cột A = "COT1") và các giá trị màu xanh "tự theo"
yêu cầu thứ 5 (tìm Min cột G với điều kiện cột A = "COT1") và các giá trị màu xanh "tự theo"
Nhưng giá trị (loc) tìm được lại bôi đen tương ứng ở cột A (nếu ko được thì chỉ bôi đen giá trị lọc cũng được)
Cảm ơn bạn rất nhìều!!!!! Chúc bạn khỏe!!!
 
Upvote 0
Bạn ơi: yêu cầu thứ 2 cũng giống như yêu cầu 1 vậy (tìm MAX cột F với điều kiện cột A = "COT1") và các giá trị màu xanh "tự theo"
yêu cầu thứ 3 (tìm MIN cột F với điều kiện cột A = "COT1") và các giá trị màu xanh "tự theo"
yêu cầu thứ 4 (tìm Max cột G với điều kiện cột A = "COT1") và các giá trị màu xanh "tự theo"
yêu cầu thứ 5 (tìm Min cột G với điều kiện cột A = "COT1") và các giá trị màu xanh "tự theo"
Nhưng giá trị (loc) tìm được lại bôi đen tương ứng ở cột A (nếu ko được thì chỉ bôi đen giá trị lọc cũng được)
Cảm ơn bạn rất nhìều!!!!! Chúc bạn khỏe!!!

Gửi bạn hàm này:
Mã:
Function MinMaxIf(ByVal Criteria_Range As Range, ByVal Criteria, _
              ByVal Return_Range As Range, _
              Optional ByVal Absolute As Boolean = False, _
              Optional ByVal MinMax As Boolean = False)
  Dim lR As Long, lC As Long
  Dim dtmpMax As Double, dtmpVal As Double
  Dim tmpCrit, tmpRet
  Dim atmpCrit, atmpRet
  Dim bComp As Boolean, bChk As Boolean
  'On Error Resume Next
  bComp = (InStr("<>=", Left(Criteria, 1)) > 0)
  With Criteria_Range
    atmpCrit = .Value
    atmpRet = Return_Range.Resize(.Rows.Count, .Columns.Count).Value
  End With
  If IsArray(atmpCrit) Then
    For lR = 1 To UBound(atmpCrit, 1)
      For lC = 1 To UBound(atmpCrit, 2)
        tmpCrit = atmpCrit(lR, lC)
        tmpRet = CDbl(atmpRet(lR, lC))
        If bComp And Criteria <> "" Then
          dtmpVal = CDbl(tmpCrit)
          If Evaluate(dtmpVal & Criteria) Then
            If Not bChk Then dtmpMax = tmpRet
            bChk = True: GoTo Stp1
          End If
        Else
          If (Left(Criteria, 1) = "!") Then
            If Not (UCase(tmpCrit) Like UCase(Mid(Criteria, 2, Len(Criteria)))) Then
              If Not bChk Then dtmpMax = tmpRet
              bChk = True: GoTo Stp1
            End If
          Else
            If (UCase(tmpCrit) Like UCase(Criteria)) Then
              If Not bChk Then dtmpMax = tmpRet
              bChk = True: GoTo Stp1
            End If
          End If
        End If
        GoTo Stp2
Stp1:
        If Absolute Then
          If IIf(MinMax, Abs(dtmpMax) < Abs(tmpRet), Abs(dtmpMax) > Abs(tmpRet)) Then dtmpMax = tmpRet
        Else
          If IIf(MinMax, dtmpMax < tmpRet, dtmpMax > tmpRet) Then dtmpMax = tmpRet
        End If
Stp2:
      Next
    Next
    MinMaxIf = dtmpMax
  End If
End Function
Hàm này gộp cả MIN có điều kiện và MAX có điều kiện vào làm một
Cú pháp
Mã:
=MinMaxIf(Vùng điều kiện, điều kiện, Vùng tính MINMAX,  Có xét theo trị tuyệt đối hay không, Tìm MIN hay MAX)
Ví dụ:
1> Muốn tìm giá trị MAX ở cột D theo điều kiện "COT1" ở cột A và xét giá trị tuyệt đối. Ta có công thức:
Mã:
=MinMaxIf($A$4:$A$4419, $I6,D$4:D$4419, [COLOR=#0000cd][B]TRUE[/B][/COLOR], [COLOR=#ff0000][B]TRUE[/B][/COLOR])
2> Muốn tìm giá trị MAX ở cột F theo điều kiện "COT1" ở cột A và không xét giá trị tuyệt đối. Ta có công thức:
Mã:
=MinMaxIf($A$4:$A$4419, $I10, F$4:F$4419, [COLOR=#0000cd][B]FALSE[/B][/COLOR], [B][COLOR=#ff0000]TRUE[/COLOR][/B])
3> Muốn tìm giá trị MIN ở cột F theo điều kiện "COT1" ở cột A và không xét giá trị tuyệt đối. Ta có công thức:
Mã:
=MinMaxIf($A$4:$A$4419, $I14,F$4:F$4419, [B][COLOR=#0000cd]FALSE[/COLOR][/B] ,[COLOR=#ff0000][B]FALSE[/B][/COLOR])
vân vân
Lưu ý:
1> Hàm này cho phép tìm theo ký tự đại diện giống như SUMIF hay COUNTIF. Ví dụ:
=MinMaxIf($A$1:$A$20,"*C", $C$1:$C$20, FALSE, TRUE) là tìm giá trị MAX tại C1:C20 (không xét giá trị tuyệt đối) theo điều kiện chuổi ở A1:A20 có ký tự cuối cùng là "C"
2> Hàm này cho phép biến Criteria chứa toán tử so sánh. Ví dụ:
=MinMaxIf($A$1:$A$20,">5", $C$1:$C$20, FALSE, TRUE) là tìm giá trị MAX tại C1:C20 (không xét giá trị tuyệt đối) theo điều kiện giá trị A1:A20 >5
--------------------
Bài toán này có phần "tự theo" (như đã nói ở trên) có thể dùng hàm LOOKUP để tìm, khỏi viết code. Còn viết tô đậm cột A khi tìm thấy, có thể dùng Conditional Formating để làm
 

File đính kèm

  • MinMaxIF.rar
    261 KB · Đọc: 115
Upvote 0
Thanks bạn rất nhiều!!! chúc bạn vui khỏe.......
Nhưng mà: mình muốn click vào nút "CommandButton" thì tự động nó sẽ tự chọn (lọc) cho mình
và còn nữa vậy tên "COT2, COT3 ...." tiếp theo thì cũng phải lọc luôn chứ!!!
mong bạn giúp đỡ!!!!!
 
Upvote 0
Thanks bạn rất nhiều!!! chúc bạn vui khỏe.......
Nhưng mà: mình muốn click vào nút "CommandButton" thì tự động nó sẽ tự chọn (lọc) cho mình
và còn nữa vậy tên "COT2, COT3 ...." tiếp theo thì cũng phải lọc luôn chứ!!!
mong bạn giúp đỡ!!!!!

Hàm chính đã viết rồi, phần còn lại bạn tự nghiên cứu đi chứ ---> Chỉ là For.. Next bình thường thôi mà
 
Upvote 0
bạn ơi VBA mình mới biết đến à; trước giờ mình chỉ dùng hàm không à, lỡ giúp rùi thì bạn giúp thêm lần nữa nha!!! không thì chắc không ngủ được quá đang trong tuần căng thẳng bạn ơi!!**~****~****~**
 
Upvote 0
bạn ơi VBA mình mới biết đến à; trước giờ mình chỉ dùng hàm không à, lỡ giúp rùi thì bạn giúp thêm lần nữa nha!!! không thì chắc không ngủ được quá đang trong tuần căng thẳng bạn ơi!!**~****~****~**
Định viết cho bạn hàm dạng tổng quát, còn như bạn muốn 1 sub chạy cho trường hợp của bạn thôi thì.. dễ ợt! Để anh Ba Tê làm cho
Ẹc... Ẹc...
 
Upvote 0
mọi chuyện nhờ bạn giúp vậy!!!!
cám ơn bạn nhìu lắm!!!mong bạn sớm hồi đáp!! hix @#!^%
 
Upvote 0
Thanks bạn rất nhiều!!! chúc bạn vui khỏe.......
Nhưng mà: mình muốn click vào nút "CommandButton" thì tự động nó sẽ tự chọn (lọc) cho mình
và còn nữa vậy tên "COT2, COT3 ...." tiếp theo thì cũng phải lọc luôn chứ!!!
mong bạn giúp đỡ!!!!!

Bạn viết "Thanks" thì nhiều mà hình như chẳng biết cái nút "Thanks" nằm ở đâu?
-----------

Thử với Sub này.
PHP:
Public Sub ToTiTe()
Dim Rng(), Arr(), I As Long, K As Long, CotA As String, CotD As Double, CotF As Double, CotG As Double
Dim Dic As Object, KQ(), Tem As String, P As Double, J As Long, N As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    Rng = .Range(.[A4], .[A65000].End(xlUp)).Resize(, 7).Value
End With
ReDim Arr(1 To UBound(Rng, 1), 1 To 7)
ReDim KQ(1 To UBound(Rng, 1), 1 To 7)
    For I = 1 To UBound(Rng, 1)
            Tem = Rng(I, 1)
        If Not Dic.Exists(Tem) Then
            K = K + 1
            Dic.Add (Tem), K
            Arr(K, 1) = Rng(I, 1): Arr(K, 2) = Rng(I, 4)
            Arr(K, 3) = Rng(I, 6): Arr(K, 4) = Rng(I, 6)
            Arr(K, 5) = Rng(I, 7): Arr(K, 6) = Rng(I, 7)
                P = Abs(Rng(I, 4))
        Else
            If Abs(Rng(I, 4)) > P Then
                Arr(Dic.Item(Tem), 2) = Rng(I, 4)
                P = Abs(Rng(I, 4))
            End If
            If Rng(I, 6) > Arr(Dic.Item(Tem), 3) Then Arr(Dic.Item(Tem), 3) = Rng(I, 6)
            If Rng(I, 6) < Arr(Dic.Item(Tem), 4) Then Arr(Dic.Item(Tem), 4) = Rng(I, 6)
            If Rng(I, 7) > Arr(Dic.Item(Tem), 5) Then Arr(Dic.Item(Tem), 5) = Rng(I, 7)
            If Rng(I, 7) < Arr(Dic.Item(Tem), 6) Then Arr(Dic.Item(Tem), 6) = Rng(I, 7)
        End If
    Next I
For I = 1 To UBound(Rng, 1)
CotA = Rng(I, 1)
    If Rng(I, 4) = Arr(Dic.Item(CotA), 2) Or _
         Rng(I, 6) <> "" And (Rng(I, 6) = Arr(Dic.Item(CotA), 3) Or Rng(I, 6) = Arr(Dic.Item(CotA), 4)) Or _
         Rng(I, 7) <> "" And (Rng(I, 7) = Arr(Dic.Item(CotA), 5) Or Rng(I, 7) = Arr(Dic.Item(CotA), 6)) Then
        N = N + 1
        For J = 1 To 7
            KQ(N, J) = Rng(I, J)
        Next J
    End If
Next I
With Sheets("GPE")
[A4:G65000].ClearContents
[A4].Resize(N, 7).Value = KQ
End With
Set Dic = Nothing
End Sub

Bấm thí vào cái nút bên sheet GPE xem sao.

--------------
Định viết cho bạn hàm dạng tổng quát, còn như bạn muốn 1 sub chạy cho trường hợp của bạn thôi thì.. dễ ợt! Để anh Ba Tê làm cho
Ẹc... Ẹc...
Sao "bỏ của chạy lấy người dzậy Chời"?
 

File đính kèm

  • TON_TEN.rar
    163.4 KB · Đọc: 52
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom