Hỏi: Lọc Giá Trị Max - Min Theo Điều Kiện Cho Trước?? (8 người xem)

  • Thread starter Thread starter nad582
  • Ngày gửi Ngày gửi
Liên hệ QC

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

nad582

Thành viên thường trực
Tham gia
7/6/11
Bài viết
317
Được thích
48
Chào các a(c) trong GPE, e có vấn đề sau, mong a(c) giúp đỡ?
Vấn đề như sau:
Cột B e có "tên 1", cột R e có "tên 2", cột I là giá trị "M"
Đối với 1 tên của cột "tên 1" thì có 3 tên ứng với cột "Tên 2", như vậy tìm giá trị nhỏ nhất - lớn nhất ứng với 3 tên của côt "tên 2".
Ví dụ:
Ở cột "tên 1" có 1 tên là D13 ứng với cột "tên 2" là 3 tên "D1315 - D1320 - D1315" và ứng với cột "tên 2" có giá trị "M". Vậy tìm:
giá trị nhỏ nhất ứng với tên "D1315",
giá trị lớn nhất ứng với tên "D1320",
giá trị nhỏ nhất ứng với tên "D1315",
Những giá trị tìm được thì tô màu đỏ!!
....................................................
Nếu cho hình dung được e sẽ trình bày rõ hơn!! a(c) xem trong file đính kèm!! Chân thành cảm ơn nhiều!!
 

File đính kèm

Chào các a(c) trong GPE, e có vấn đề sau, mong a(c) giúp đỡ?
Vấn đề như sau:
Cột B e có "tên 1", cột R e có "tên 2", cột I là giá trị "M"
Đối với 1 tên của cột "tên 1" thì có 3 tên ứng với cột "Tên 2", như vậy tìm giá trị nhỏ nhất - lớn nhất ứng với 3 tên của côt "tên 2".
Ví dụ:
Ở cột "tên 1" có 1 tên là D13 ứng với cột "tên 2" là 3 tên "D1315 - D1320 - D1315" và ứng với cột "tên 2" có giá trị "M". Vậy tìm:
giá trị nhỏ nhất ứng với tên "D1315",
giá trị lớn nhất ứng với tên "D1320",
giá trị nhỏ nhất ứng với tên "D1315",
Những giá trị tìm được thì tô màu đỏ!!
....................................................
Nếu cho hình dung được e sẽ trình bày rõ hơn!! a(c) xem trong file đính kèm!! Chân thành cảm ơn nhiều!!

nếu đã được sắp xếp như trong bài thì thử
Mã:
Sub LocGiaTriNhoNhat()
Dim debai, kq(1 To 60000, 1 To 17) As Variant, i, k As Long, ten2 As String
With Sheets("debai")
    debai = .Range(.[b14], .[b14].End(4)).Resize(, 17).Value
End With

For i = 1 To UBound(debai)
    If debai(i, 17) = ten2 Then
        If kq(k, 8) > debai(i, 8) Then kq(k, 8) = debai(i, 8)
    Else
        k = k + 1
        kq(k, 1) = debai(i, 1)
        kq(k, 8) = debai(i, 8)
        kq(k, 17) = Right(debai(i, 17), 3)
        ten2 = debai(i, 17)
    End If
Next i

If k Then
    With Sheets("ketqua")
    .[a14:g60000].ClearContents
    .[b14].Resize(k, 17) = kq
    End With
End If
End Sub

nếu chưa được sắp xếp thì phải xài dictionary
 
Upvote 0
nếu đã được sắp xếp như trong bài thì thử
Mã:
Sub LocGiaTriNhoNhat()
Dim debai, kq(1 To 60000, 1 To 17) As Variant, i, k As Long, ten2 As String
With Sheets("debai")
    debai = .Range(.[b14], .[b14].End(4)).Resize(, 17).Value
End With

For i = 1 To UBound(debai)
    If debai(i, 17) = ten2 Then
        If kq(k, 8) > debai(i, 8) Then kq(k, 8) = debai(i, 8)
    Else
        k = k + 1
        kq(k, 1) = debai(i, 1)
        kq(k, 8) = debai(i, 8)
        kq(k, 17) = Right(debai(i, 17), 3)
        ten2 = debai(i, 17)
    End If
Next i

If k Then
    With Sheets("ketqua")
    .[a14:g60000].ClearContents
    .[b14].Resize(k, 17) = kq
    End With
End If
End Sub

nếu chưa được sắp xếp thì phải xài dictionary
Cảm ơn bài của a, nhưng ở #1 là yêu cầu: tìm giá trị nhỏ nhất - lớn nhất. Còn kết quả bài a chỉ tìm giá trị nhỏ nhất ak!!
xem giúp em:
Vấn đề như sau:
Cột B e có "tên 1", cột R e có "tên 2", cột I là giá trị "M"
Đối với 1 tên của cột "tên 1" thì có 3 tên ứng với cột "Tên 2", như vậy tìm giá trị nhỏ nhất - lớn nhất ứng với 3 tên của côt "tên 2".
Ví dụ:
Ở cột "tên 1" có 1 tênD13 ứng với cột "tên 2" là 3 tên "D1315 - D1320 - D1315"ứng với cột "tên 2" có giá trị "M". Vậy tìm:
giá trị nhỏ nhất ứng với tên "D1315",
giá trị lớn nhất ứng với tên "D1320",
giá trị nhỏ nhất ứng với tên "D1315",
Những giá trị tìm được thì tô màu đỏ, "như trong sheet debai"!!
Mong các a(c) giúp đỡ!!
 
Upvote 0
như vậy là
đoạn đầu tìm min
giữa tìm max
cuối tìm min?
Vâng đúng rồi ak!!
Nhưng số dòng có thể thay đổi chứ nó không có định như vậy vì có dữ liệu nhiều và dữ liệu ít!
Mặc dù số dòng thay đổi nhưng cái dạng nó vẫn giữ nguyên như vậy!!
Mong a(c) giúp dùm!!!
 
Upvote 0
Vâng đúng rồi ak!!
Nhưng số dòng có thể thay đổi chứ nó không có định như vậy vì có dữ liệu nhiều và dữ liệu ít!
Mặc dù số dòng thay đổi nhưng cái dạng nó vẫn giữ nguyên như vậy!!
Mong a(c) giúp dùm!!!

thôi thì cứ thử cái này
Mã:
Sub LocGiaTriNhoNhat()
Dim debai, kq(1 To 60000, 1 To 17) As Variant, cnt, i, k As Long, ten2 As String
With Sheets("debai")
    debai = .Range(.[b14], .[b14].End(4)).Resize(, 17).Value
End With

For i = 1 To UBound(debai)
If cnt = 3 Then cnt = 0
    If debai(i, 17) = ten2 Then
        If cnt <> 2 And kq(k, 8) > debai(i, 8) Then kq(k, 8) = debai(i, 8)
        If cnt = 2 And kq(k, 8) < debai(i, 8) Then kq(k, 8) = debai(i, 8)
    Else
        k = k + 1
        kq(k, 1) = debai(i, 1)
        kq(k, 8) = debai(i, 8)
        kq(k, 17) = Right(debai(i, 17), 3)
        ten2 = debai(i, 17)
        cnt = cnt + 1
    End If
Next i

If k Then
    With Sheets("ketqua")
    .[a14:g60000].ClearContents
    .[b14].Resize(k, 17) = kq
    End With
End If
End Sub
 
Upvote 0
thôi thì cứ thử cái này
Mã:
Sub LocGiaTriNhoNhat()
Dim debai, kq(1 To 60000, 1 To 17) As Variant, cnt, i, k As Long, ten2 As String
With Sheets("debai")
    debai = .Range(.[b14], .[b14].End(4)).Resize(, 17).Value
End With

For i = 1 To UBound(debai)
If cnt = 3 Then cnt = 0
    If debai(i, 17) = ten2 Then
        If cnt <> 2 And kq(k, 8) > debai(i, 8) Then kq(k, 8) = debai(i, 8)
        If cnt = 2 And kq(k, 8) < debai(i, 8) Then kq(k, 8) = debai(i, 8)
    Else
        k = k + 1
        kq(k, 1) = debai(i, 1)
        kq(k, 8) = debai(i, 8)
        kq(k, 17) = Right(debai(i, 17), 3)
        ten2 = debai(i, 17)
        cnt = cnt + 1
    End If
Next i

If k Then
    With Sheets("ketqua")
    .[a14:g60000].ClearContents
    .[b14].Resize(k, 17) = kq
    End With
End If
End Sub
a xem lại giúp, nó vẫn ko giống với kết quả em đánh dấu màu đỏ ở "sheet debai"!! vẫn là tìm ra min thôi!!
chân thành cảm ơn!!
 
Upvote 0
Với dữ liệu y như trong bài thì thử code này:
Mã:
Public Sub ToTe()
    Dim Vung, I, Kq, Wf, A, iHang, M
        Set Vung = Range([B14], [B50000].End(xlUp)).Resize(, 17)
        Set Wf = Application.WorksheetFunction
        iHang = Vung.Rows.Count / 6
        ReDim Kq(1 To iHang, 1 To Vung.Columns.Count)
            For I = 1 To Vung.Rows.Count Step 6
                M = M + 1
                Kq(M, 1) = Vung(I, 1): Kq(M, 17) = Right(Vung(I, 1), 1) & Vung(I, 16)
                    If Right(Vung(I, 17), 1) = "5" Then
                        A = Wf.Min(Vung(I, 8).Resize(6))
                    Else
                        A = Wf.Max(Vung(I, 8).Resize(6))
                    End If
                Kq(M, 8) = A
            Next I
    Sheets("ketqua").[B14:R50000].ClearContents
    Sheets("ketqua").[B14].Resize(iHang, 17) = Kq
End Sub
Nếu khác thì......."tèo"
 
Upvote 0
Fải xài đủ kiểu ăn chơi mới được Cò Già thân mến!
 

File đính kèm

Upvote 0
Cảm ơn bài của a(c), kết quả đều đúng với ý đồ của e, nhưng đới với bài #8 thì đúng hơn vì em kiểm tra khi thêm dữ liệu khác vào (số dòng thay đổi) thì nó vẫn đúng!!
Nhưng ở bài #1 là tìm ra kết quả Min - Max - Min rồi tô màu đỏ tại sheet "debai" luôn, sheet "ketqua" là chỉ để so sánh kết quả thôi ạ
Mong a(c) giúp đỡ!!
 
Upvote 0
Cảm ơn bài của a(c), kết quả đều đúng với ý đồ của e, nhưng đới với bài #8 thì đúng hơn vì em kiểm tra khi thêm dữ liệu khác vào (số dòng thay đổi) thì nó vẫn đúng!!
Nhưng ở bài #1 là tìm ra kết quả Min - Max - Min rồi tô màu đỏ tại sheet "debai" luôn, sheet "ketqua" là chỉ để so sánh kết quả thôi ạ
Mong a(c) giúp đỡ!!

tưởng dể ăn nhảy dzô...........làm té khói......hichic
mượn code bài #8, làm thử
Mã:
Sub LocGiaTriNhoNhat()
Dim sarr, arr, debai, tam(1 To 60000, 1 To 1) As Variant, cnt, i, j, k As Long, ten2 As String, rng As Range
With Sheets("debai")
    Set rng = .Range(.[b14], .[b14].End(4))
    sarr = rng.Offset(, 7).Value
    arr = rng.Offset(, 7).Value
    debai = rng.Resize(, 17).Value

For i = 1 To UBound(debai)
If cnt = 3 Then cnt = 0
    If debai(i, 17) = ten2 Then
        If cnt < 2 And tam(k, 1) > debai(i, 8) Then arr(j, 1) = tam(k, 1): tam(k, 1) = debai(i, 8): arr(i, 1) = "": j = i
        If cnt = 2 And tam(k, 1) < debai(i, 8) Then arr(j, 1) = tam(k, 1): tam(k, 1) = debai(i, 8): arr(i, 1) = "": j = i ': MsgBox i
    Else
        k = k + 1: j = i
        tam(k, 1) = debai(i, 8)
        arr(i, 1) = ""
        ten2 = debai(i, 17)
        cnt = cnt + 1
    End If
Next i

If k Then
With .[i14].Resize(UBound(debai))
    .Clear
    .Value = arr
    .SpecialCells(4).Font.Color = vbRed
    .Value = sarr
   .Borders.Weight = xlThin
End With
End If
    End With
End Sub
 
Upvote 0
tưởng dể ăn nhảy dzô...........làm té khói......hichic
mượn code bài #8, làm thử
Mã:
Sub LocGiaTriNhoNhat()
Dim sarr, arr, debai, tam(1 To 60000, 1 To 1) As Variant, cnt, i, j, k As Long, ten2 As String, rng As Range
With Sheets("debai")
    Set rng = .Range(.[b14], .[b14].End(4))
    sarr = rng.Offset(, 7).Value
    arr = rng.Offset(, 7).Value
    debai = rng.Resize(, 17).Value

For i = 1 To UBound(debai)
If cnt = 3 Then cnt = 0
    If debai(i, 17) = ten2 Then
        If cnt < 2 And tam(k, 1) > debai(i, 8) Then arr(j, 1) = tam(k, 1): tam(k, 1) = debai(i, 8): arr(i, 1) = "": j = i
        If cnt = 2 And tam(k, 1) < debai(i, 8) Then arr(j, 1) = tam(k, 1): tam(k, 1) = debai(i, 8): arr(i, 1) = "": j = i ': MsgBox i
    Else
        k = k + 1: j = i
        tam(k, 1) = debai(i, 8)
        arr(i, 1) = ""
        ten2 = debai(i, 17)
        cnt = cnt + 1
    End If
Next i

If k Then
With .[i14].Resize(UBound(debai))
    .Clear
    .Value = arr
    .SpecialCells(4).Font.Color = vbRed
    .Value = sarr
   .Borders.Weight = xlThin
End With
End If
    End With
End Sub
Chân thành cảm ơn bài của a, nó đúng với yêu cầu của em!
Ngoài cách trên, có thể làm cách khác ngắn gọn hơn cho em dẽ hiểu hơn được hok (hoặc cách xử lý khác hơn), vì e mới tiếp cận đến với VBA!! e muốn học hỏi thêm nhiều cách!!
cảm ơn rất nhiều!!
 
Upvote 0
tôi nghĩ giải pháp là như vậy (nhưng chưa làm...hihihih)
1- tạo ra một cột số tt (để trả lại nguyên trạng sau khi sort, nếu trong số liệu ban đã có thì khỏi phải tạo)
2-sort theo ưu tiên cột B, ưu tiên 2 cột R, ưu tiên 3 cột I (cột I từ nhỏ đến lớn)
3- dùng vòng lặp như trên, ô đâu tiên tô màu đỏ, khi biến cnt=2 thì ko tô, vòng cuối thì resize lên trên một ô (tức là cái max của nhóm trên), tô màu đỏ cho 2 ô này
4 sau khi kết thúc vòng lặp, sort lại theo cột số tt để trả lại nguyên trạng
 
Upvote 0
Chân thành cảm ơn bài của a, nó đúng với yêu cầu của em!
Ngoài cách trên, có thể làm cách khác ngắn gọn hơn cho em dẽ hiểu hơn được hok (hoặc cách xử lý khác hơn), vì e mới tiếp cận đến với VBA!! e muốn học hỏi thêm nhiều cách!!
cảm ơn rất nhiều!!
Mã:
Sub locminmax()
Dim r, s, x, y
Set s = Sheets("debai").[I13]
x = [I:Q].Columns.Count
y = [I:R].Columns.Count
Do While s.Offset(1, y - 1) <> ""
    Set s = s.Offset(1)
    Minmax = s
    r = s.Row
    Rows(r).Font.Color = vbRed
    Do While s.Offset(1, y - 1) = s.Offset(, y - 1)
        Set s = s.Offset(1)
        If s < Minmax And s.Offset(, x - 1) = 15 Or _
        s > Minmax And s.Offset(, x - 1) = 20 Then
            Minmax = s
            s.EntireRow.Font.Color = vbRed
            Rows(r).Font.Color = vbBlack
            r = s.Row
        End If
    Loop
Loop
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom