HỎI VỀ: TÌM GÍA TRỊ nhỏ nhất, lớn nhất 1 điều kiện? (1 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ó bảng dữ liệu sau, nhờ a(c) giúp e viết code:
2014-07-15_08-55-12.jpg
Trường hợp 1:
ở cột C là các giá trị khoảng cách, ứng với cột C là các cột E, F, G câu hỏi đặt ra là tìm giá trị:
- Nhỏ nhất ở cột E
- Nhỏ nhất ở cột F
- Lớn nhất ở cột F
- Nhỏ nhất ở cột G
- Lớn nhất ở cột G
Ghi chú: chỉ sử dụng cột: C, E, F và G
và kết quả của ví dụ là:
2014-07-15_09-05-36.jpg
E chân thành cảm ơn!!
 

File đính kèm

Lần chỉnh sửa cuối:
Chào các a(c) trong GPE, e có bảng dữ liệu sau, nhờ a(c) giúp e viết code:

Trường hợp 1:
ở cột C là các giá trị khoảng cách, ứng với cột C là các cột E, F, G câu hỏi đặt ra là tìm giá trị:
- Nhỏ nhất ở cột E
- Nhỏ nhất ở cột F
- Lớn nhất ở cột F
- Nhỏ nhất ở cột G
- Lớn nhất ở cột G
Ghi chú: chỉ sử dụng cột: C, E, F và G
và kết quả của ví dụ là:

E chân thành cảm ơn!!

như vậy ứng với mỗi C sẽ có 5 giá trị thôi chứ?
ví dụ C5 ở cột C
- tìm giá trị nhỏ nhất cột E
- Nhỏ nhất ở cột F
- Lớn nhất ở cột F
- Nhỏ nhất ở cột G
- Lớn nhất ở cột G
tổng cộng là 5 phải không, sao kết quả của bạn ra đến 9?
 
Upvote 0
như vậy ứng với mỗi C sẽ có 5 giá trị thôi chứ?
ví dụ C5 ở cột C
- tìm giá trị nhỏ nhất cột E
- Nhỏ nhất ở cột F
- Lớn nhất ở cột F
- Nhỏ nhất ở cột G
- Lớn nhất ở cột G
tổng cộng là 5 phải không, sao kết quả của bạn ra đến 9?
Chào a, ở đây e chỉ sử dụng cột C (tức là cột "Location") nên ko liên quan gì đến cột B cả (ví dụ C5), như vậy mình chỉ tìm giá trị dựa vào cột C thôi ạ...
thêm 1 ý nữa là: có thể những giá trị vừa tìm sẽ trùng nhau (nằm cùng 1 dòng)
e cảm ơn!!
 
Lần chỉnh sửa cuối:
Upvote 0
Chào a, ở đây e chỉ sử dụng cột C (tức là cột "Location") nên ko liên quan gì đến cột B cả (ví dụ C5), như vậy mình chỉ tìm giá trị dựa vào cột C thôi ạ...
thêm 1 ý nữa là: có thể những giá trị vừa tìm sẽ trùng nhau (nằm cùng 1 dòng)
e cảm ơn!!

tôi hiểu sai ý bạn
srry
 
Lần chỉnh sửa cuối:
Upvote 0
ý tôi nói là cột B, bạn thử xem vậy đã đúng chưa
Mã:
Sub test()

Dim Ng As Variant, kq(), i, j, k As Long, d As Object
Ng = Sheet1.[a14:H10000].Value
ReDim kq(1 To UBound(Ng), 1 To 8)
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(Ng)
    If Not IsEmpty(Ng(i, 2)) And Not d.exists(Ng(i, 2)) Then d.Add Ng(i, 2), ""
Next i

k = 1
For Each v In d.keys
E_min = Ng(1, 5): E_dong = 1
F_min = Ng(1, 6): Fmin_dong = 1
F_max = Ng(1, 6): Fmax_dong = 1
G_min = Ng(1, 7): Gmin_dong = 1
G_max = Ng(1, 7): Gmax_dong = 1
For i = 2 To UBound(Ng)
    If Ng(i, 2) = v Then
        If Ng(i, 5) < E_min Then E_min = Ng(i, 5): E_dong = i
        If Ng(i, 6) < F_min Then F_min = Ng(i, 6): Fmin_dong = i
        If Ng(i, 6) > F_max Then F_max = Ng(i, 6): Fmax_dong = i
        If Ng(i, 7) < F_min Then G_min = Ng(i, 7): Gmin_dong = i
        If Ng(i, 7) > F_max Then G_max = Ng(i, 7): Gmax_dong = i
    End If
 Next i
 For j = 1 To 8
        kq(k, j) = Ng(E_dong, j)
        kq(k + 1, j) = Ng(Fmin_dong, j)
        kq(k + 2, j) = Ng(Fmax_dong, j)
        kq(k + 3, j) = Ng(Gmin_dong, j)
        kq(k + 4, j) = Ng(Gmax_dong, j)
Next j
        k = k + 5
Next v
Sheet2.[a14:H10000].ClearContents
If k Then Sheet2.[a14].Resize(k, 8).Value = kq

End Sub
có thể câu hỏi của em a(c) chưa rõ, ở đây là e tìm giá trị ở cột E, F, G dựa vào vị trí ở cột C
đối với các giá trị vừa tìm được có thể sẽ nằm chung 1 dòng.
ví dụ:
như bài #1 thì ở vị trí 0,00 (cột C) đầu tiên sẽ tìm ra 5 giá trị tương ứng (cột E, F, G) nhưng vì có thể một số giá trị nằm trùng nhau trên 1 dòng nên kết quả chỉ còn 4 dòng.
tương tự các vị trí phía dưới cũng vậy, tương ứng với từng vị trí sẽ tìm ra các giá trị như câu hỏi bài #1

về code của a :
thì kết quả của anh
2014-07-15_08-55-12.jpg
còn kết quả của em:
2014-07-15_09-05-36.jpg
vậy nhờ a sửa lại giúp em...e chân thành cảm ơn...
 
Upvote 0
có thể câu hỏi của em a(c) chưa rõ, ở đây là e tìm giá trị ở cột E, F, G dựa vào vị trí ở cột C
đối với các giá trị vừa tìm được có thể sẽ nằm chung 1 dòng.
ví dụ:
như bài #1 thì ở vị trí 0,00 (cột C) đầu tiên sẽ tìm ra 5 giá trị tương ứng (cột E, F, G) nhưng vì có thể một số giá trị nằm trùng nhau trên 1 dòng nên kết quả chỉ còn 4 dòng.
tương tự các vị trí phía dưới cũng vậy, tương ứng với từng vị trí sẽ tìm ra các giá trị như câu hỏi bài #1

về code của a :
thì kết quả của anh
View attachment 125485
còn kết quả của em:
View attachment 125486
vậy nhờ a sửa lại giúp em...e chân thành cảm ơn...
Thêm cái vụ cùng dòng có cả min cái này và max cái khác thì chỉ lấy 1 dòng, hic.
Thử chạy thử cái này coi sao, thấy nó lằng nhằng quá hổng biết trúng hông.
[GPECODE=vb]Public Sub MaxMin()
Dim Dic As Object, N As Long, M As Long, R As Long, Tem As String
Dim sArr(), dArr(), Arr(), I As Long, J As Long, K As Long, K2 As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("debai")
sArr = .Range(.[A14], .[H65536].End(xlUp)).Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 9)
For N = 1 To UBound(sArr, 1) Step 9
K = K + 1
R = K
For I = N To N + 4
For J = 1 To 8
dArr(R, J) = sArr(I, J) 'Gan du lieu 5 dong dau tien
Next J
R = R + 1
Next I
R = K
For I = N To N + 8
If sArr(I, 5) < dArr(R, 5) Then
For J = 1 To 8
dArr(R, J) = sArr(I, J) ' MIN N
Next J
End If
If sArr(I, 6) < dArr(R + 1, 6) Then
For J = 1 To 8
dArr(R + 1, J) = sArr(I, J) 'MIN M2
Next J
End If
If sArr(I, 6) > dArr(R + 2, 6) Then
For J = 1 To 8
dArr(R + 2, J) = sArr(I, J) 'MAX M2
Next J
End If
If sArr(I, 7) < dArr(R + 3, 7) Then
For J = 1 To 8
dArr(R + 3, J) = sArr(I, J) 'MIN M3
Next J
End If
If sArr(I, 7) > dArr(R + 4, 7) Then
For J = 1 To 8
dArr(R + 4, J) = sArr(I, J) 'MAX M3
Next J
End If
Next I
K = K + 4
Next N
'---------------Xoa Trung dong
ReDim Arr(1 To K, 1 To 8)
For N = 1 To K Step 5
Dic.RemoveAll
For I = N To N + 4
Tem = dArr(I, 4)
If Not Dic.Exists(Tem) Then
K2 = K2 + 1
Dic.Add Tem, Empty
For J = 1 To 8
Arr(K2, J) = dArr(I, J)
Next J
End If
Next I
Next N
With Sheets("ketqua")
.[A14:H10000].ClearContents
.[A14].Resize(K2, 8) = Arr
End With
Set Dic = Nothing
End Sub


[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Thêm cái vụ cùng dòng có cả min cái này và max cái khác thì chỉ lấy 1 dòng, hic.
Thử chạy thử cái này coi sao, thấy nó lằng nhằng quá hổng biết trúng hông.
[GPECODE=vb]Public Sub MaxMin()
Dim Dic As Object, N As Long, M As Long, R As Long, Tem As String
Dim sArr(), dArr(), Arr(), I As Long, J As Long, K As Long, K2 As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("debai")
sArr = .Range(.[A14], .[H65536].End(xlUp)).Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 9)
For N = 1 To UBound(sArr, 1) Step 9
K = K + 1
R = K
For I = N To N + 4
For J = 1 To 8
dArr(R, J) = sArr(I, J) 'Gan du lieu 5 dong dau tien
Next J
R = R + 1
Next I
R = K
For I = N To N + 8
If sArr(I, 5) < dArr(R, 5) Then
For J = 1 To 8
dArr(R, J) = sArr(I, J) ' MIN N
Next J
End If
If sArr(I, 6) < dArr(R + 1, 6) Then
For J = 1 To 8
dArr(R + 1, J) = sArr(I, J) 'MIN M2
Next J
End If
If sArr(I, 6) > dArr(R + 2, 6) Then
For J = 1 To 8
dArr(R + 2, J) = sArr(I, J) 'MAX M2
Next J
End If
If sArr(I, 7) < dArr(R + 3, 7) Then
For J = 1 To 8
dArr(R + 3, J) = sArr(I, J) 'MIN M3
Next J
End If
If sArr(I, 7) > dArr(R + 4, 7) Then
For J = 1 To 8
dArr(R + 4, J) = sArr(I, J) 'MAX M3
Next J
End If
Next I
K = K + 4
Next N
'---------------Xoa Trung dong
ReDim Arr(1 To K, 1 To 8)
For N = 1 To K Step 5
Dic.RemoveAll
For I = N To N + 4
Tem = dArr(I, 4)
If Not Dic.Exists(Tem) Then
K2 = K2 + 1
Dic.Add Tem, Empty
For J = 1 To 8
Arr(K2, J) = dArr(I, J)
Next J
End If
Next I
Next N
With Sheets("ketqua")
.[A14:H10000].ClearContents
.[A14].Resize(K2, 8) = Arr
End With
Set Dic = Nothing
End Sub


[/GPECODE]
đối với bài này code của anh bate thì ok, nhưng không biết có tổng quát chưa mà e đưa dữ liệu khác vào(dulieudubi) vẫn có cấu trúc giống với cái cũ nhưng nó lại báo lỗi, a có thể xem lại giúp em nhé.!!
 

File đính kèm

Upvote 0
đối với bài này code của anh bate thì ok, nhưng không biết có tổng quát chưa mà e đưa dữ liệu khác vào(dulieudubi) vẫn có cấu trúc giống với cái cũ nhưng nó lại báo lỗi, a có thể xem lại giúp em nhé.!!
Dĩ nhiên là nó không tổng quá vì bạn có nói là dữ liệu thật của bạn ra sao đâu?
Tôi nhìn thấy mỗi loại chỉ có 9 dòng từ COMB1-COMB9 nên cho chạy mỗi lần 9 dòng.
Dữ liệu trong sheet thì từ TH1-TH39, sao đúng được.
Muốn tổng quát thì bạn phải báo là có lúc 9 dòng, lúc 10 dòng ... nói chung là không có quy luật gì cả.
 
Upvote 0
Dĩ nhiên là nó không tổng quá vì bạn có nói là dữ liệu thật của bạn ra sao đâu?
Tôi nhìn thấy mỗi loại chỉ có 9 dòng từ COMB1-COMB9 nên cho chạy mỗi lần 9 dòng.
Dữ liệu trong sheet thì từ TH1-TH39, sao đúng được.
Muốn tổng quát thì bạn phải báo là có lúc 9 dòng, lúc 10 dòng ... nói chung là không có quy luật gì cả.
thì ra a dựa thêm cột D nữa, nói chung là e cũng có nêu ở bài 1# là chỉ sử dụng cột C, E, F và G thôi...các cột khác ko cần sử dụng(vì e đã rút gọn câu hỏi lại rồi vì sợ câu hỏi dài quá trình bày các a(c) ko rõ nên bỏ qua các cột khác)...
còn về dữ liệu thật thì nó rất nhiều nên e trích một phần trong đó ra thôi, nhưng về cấu trúc hình dạng thì vẫn giống nhau, có khác thì chỉ là số liệu...
mong các a(c) giúp đỡ...
 
Upvote 0
thì ra a dựa thêm cột D nữa, nói chung là e cũng có nêu ở bài 1# là chỉ sử dụng cột C, E, F và G thôi...các cột khác ko cần sử dụng(vì e đã rút gọn câu hỏi lại rồi vì sợ câu hỏi dài quá trình bày các a(c) ko rõ nên bỏ qua các cột khác)...
còn về dữ liệu thật thì nó rất nhiều nên e trích một phần trong đó ra thôi, nhưng về cấu trúc hình dạng thì vẫn giống nhau, có khác thì chỉ là số liệu...
mong các a(c) giúp đỡ...
Bạn nói chỉ sử dụng cột C và E,F,G lại càng không hiểu.
Tất cả cột C là 0.00 thì xem là 1 loại để tính min, max cho các cột khác sao? Nó có tổng quát chưa?
C5 - 0.00 và C6 - 0.00 đều coi như 1? không cần xem cột B, cột D là gì? Như trong sheet "debai".
 
Upvote 0
Bài này mình chỉ cần dựa vào 1 cột C, bảm đảm code ngắn gọn, không chơi Dic luôn... Anh Ba Tê đang nóng... ka ka

***************************
Thử code này nha, chứ nói không thì anh Ba Tê cầm ly hoài đâu có chịu uống
Nếu chủ thớt la lên OK thứ 3 ly nha
PHP:
Sub loc()
Dim Data(), Res(), I, J, K, N, X, Emin, Fmin, Fmax, Gmin, Gmax, Des
Data = Sheet1.Range(Sheet1.[A14], Sheet1.[H65536].End(3).Offset(1)).Value
ReDim Res(1 To UBound(Data), 1 To 8)
Set Des = Sheet2.[A14]
Sheet2.Rows("14:1000").Clear
I = 1: N = 1
Do
Fmax = -10000000: Gmax = -10000000
Emin = 10000000: Fmin = 10000000: Gmin = 10000000
   Do
   Emin = IIf(Data(I, 5) > Emin, Emin, Data(I, 5))
   Fmin = IIf(Data(I, 6) > Fmin, Fmin, Data(I, 6))
   Fmax = IIf(Data(I, 6) < Fmax, Fmax, Data(I, 6))
   Gmin = IIf(Data(I, 7) > Gmin, Gmin, Data(I, 7))
   Gmax = IIf(Data(I, 7) < Gmax, Gmax, Data(I, 7))
   I = I + 1:
   Loop Until Data(I, 3) <> Data(I - 1, 3)
   For J = N To I - 1
      If Data(J, 5) = Emin Or Data(J, 6) = Fmin Or _
      Data(J, 6) = Fmax Or Data(J, 7) = Gmin Or Data(J, 7) = Gmax Then
         K = K + 1
         For X = 1 To 8
            Res(K, X) = Data(J, X)
         Next
      End If
   Next
   N = J
Loop Until I >= UBound(Data) - 1
Des.Resize(K, 8) = Res
Sheet1.[A14:H14].Copy
Des.Resize(K, 8).PasteSpecial 4
End Sub
PS: Khuyến mãi luôn cái đinh dạng cho vùng kết quả
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn nói chỉ sử dụng cột C và E,F,G lại càng không hiểu.
Tất cả cột C là 0.00 thì xem là 1 loại để tính min, max cho các cột khác sao? Nó có tổng quát chưa?
C5 - 0.00 và C6 - 0.00 đều coi như 1? không cần xem cột B, cột D là gì? Như trong sheet "debai".
Tất nhiện là ko phải rồi, nếu như các vị trí(Ví dụ: 0,00 hay 3,60 hay số khác) nó liên tục thì a xem nó 1 loại còn nó có cách khoảng thì anh xem nó là loại khác (ví dụ xem như tên khác nhau, nói chung xem nó như là tên khác)...
như vậy vì các vị trí đó có cách khoảng thì mình xem nó là nhiều loại khác nhau(ví dụ có thể xem nó có tên khác nhau), vậy có thể dựa vào nó mà tìm ra các giá trị!!
như vậy a(c) hiểu ý e ko ạ!! hì hì
(sửa lại: a bate bớt nóng!!, mong a thông cảm!!)
 
Upvote 0
Bài này mình chỉ cần dựa vào 1 cột C, bảm đảm code ngắn gọn, không chơi Dic luôn... Anh Ba Tê đang nóng... ka ka

***************************
Thử code này nha, chứ nói không thì anh Ba Tê cầm ly hoài đâu có chịu uống
Nếu chủ thớt la lên OK thứ 3 ly nha
PHP:
Sub loc()
Dim Data(), Res(), I, J, K, N, X, Emin, Fmin, Fmax, Gmin, Gmax, Des
Data = Sheet1.Range(Sheet1.[A14], Sheet1.[H65536].End(3).Offset(1)).Value
ReDim Res(1 To UBound(Data), 1 To 8)
Set Des = Sheet2.[A14]
Sheet2.Rows("14:1000").Clear
I = 1: N = 1
Do
Fmax = -10000000: Gmax = -10000000
Emin = 10000000: Fmin = 10000000: Gmin = 10000000
   Do
   Emin = IIf(Data(I, 5) > Emin, Emin, Data(I, 5))
   Fmin = IIf(Data(I, 6) > Fmin, Fmin, Data(I, 6))
   Fmax = IIf(Data(I, 6) < Fmax, Fmax, Data(I, 6))
   Gmin = IIf(Data(I, 7) > Gmin, Gmin, Data(I, 7))
   Gmax = IIf(Data(I, 7) < Gmax, Gmax, Data(I, 7))
   I = I + 1:
   Loop Until Data(I, 3) <> Data(I - 1, 3)
   For J = N To I - 1
      If Data(J, 5) = Emin Or Data(J, 6) = Fmin Or _
      Data(J, 6) = Fmax Or Data(J, 7) = Gmin Or Data(J, 7) = Gmax Then
         K = K + 1
         For X = 1 To 8
            Res(K, X) = Data(J, X)
         Next
      End If
   Next
   N = J
Loop Until I >= UBound(Data) - 1
Des.Resize(K, 8) = Res
Sheet1.[A14:H14].Copy
Des.Resize(K, 8).PasteSpecial 4
End Sub
PS: Khuyến mãi luôn cái đinh dạng cho vùng kết quả
OK rất tốt a ạ, mong rằng a bate làm phát 3 ly!!
cho e hỏi thêm ý: nếu như cột F có giá trị bằng 0 thì sao hả anh,
ý e là nếu cột F bằng 0 thì có tìm được giá trị:
- Nhỏ nhất ở cột E
- Nhỏ nhất ở cột G
- Lớn nhất ở cột G
cảm ơn..!!
 
Lần chỉnh sửa cuối:
Upvote 0
OK rất tốt a ạ, mong rằng a bate làm phát 3 ly!!
cho e hỏi thêm ý: nếu như cột F có giá trị bằng 0 thì sao hả anh,
ý e là nếu cột F bằng 0 thì có tìm được giá trị:
- Nhỏ nhất ở cột E
- Nhỏ nhất ở cột G
- Lớn nhất ở cột G
cảm ơn..!!

Ai biết, thử đi chứ hỏi gì. Thử rồi mà kết quả tè le thì mới tính tiếp
 
Upvote 0

File đính kèm

Upvote 0
e vừa thửa xong nếu dữ liệu cột F bằng 0 thì nó chỉ copy toàn bộ mà nó ko lọc, anh xem điều chỉnh giúp em.cảm ơn
Nếu như cột F bằng 0 thì kết quả ra muốn thế nào, có thấy nói gì đến dk lọc và cũng không thấy kết quả tạm thì làm gì được
 
Upvote 0
Nếu như cột F bằng 0 thì kết quả ra muốn thế nào, có thấy nói gì đến dk lọc và cũng không thấy kết quả tạm thì làm gì được
Đối với bài #13 thì ok rồi nhưng có khi dữ liệu sẽ bị thay đổi (ví dụ như cột F có giá trị bằng 0) vậy trường hợp cột F có giá trị bằng 0 thì nó tìm ra được giá trị:
- Nhỏ nhất ở cột E
- Nhỏ nhất ở cột G
- Lớn nhất ở cột G
2014-07-15_15-33-46.jpg
tóm lại là nếu như dữ liệu bình thường (như bài #1 thì kết quả là bài#13) còn nếu cột F có giá trị bằng 0 thì thì nhờ a giúp cho. cảm ơn..
(hình đính kèm phía dưới có chữ "kết quả" to đùng là hủy bỏ nhe a)
 

File đính kèm

  • 2014-07-15_09-05-36.jpg
    2014-07-15_09-05-36.jpg
    73.9 KB · Đọc: 5
Upvote 0
Đối với bài #13 thì ok rồi nhưng có khi dữ liệu sẽ bị thay đổi (ví dụ như cột F có giá trị bằng 0) vậy trường hợp cột F có giá trị bằng 0 thì nó tìm ra được giá trị:
- Nhỏ nhất ở cột E
- Nhỏ nhất ở cột G
- Lớn nhất ở cột G
View attachment 125498
tóm lại là nếu như dữ liệu bình thường (như bài #1 thì kết quả là bài#13) còn nếu cột F có giá trị bằng 0 thì thì nhờ a giúp cho. cảm ơn..
(hình đính kèm phía dưới có chữ "kết quả" to đùng là hủy bỏ nhe a)

Biến số mình khai báo rất rõ ràng, tìm và bỏ hết những câu lệnh nào liên quan đến Fmin và Fmax, cơ bản là vậy
 
Upvote 0
Chào các a(c) trong GPE, e có bảng dữ liệu sau, nhờ a(c) giúp e viết code:
View attachment 125473
Trường hợp 1:
ở cột C là các giá trị khoảng cách, ứng với cột C là các cột E, F, G câu hỏi đặt ra là tìm giá trị:
- Nhỏ nhất ở cột E
- Nhỏ nhất ở cột F
- Lớn nhất ở cột F
- Nhỏ nhất ở cột G
- Lớn nhất ở cột G
Ghi chú: chỉ sử dụng cột: C, E, F và G
và kết quả của ví dụ là:
View attachment 125474
E chân thành cảm ơn!!

Bạn chạy thử code sau nhé
Mã:
Sub filter()
Dim a(), b(), c As Range, d
Set s = Sheets("debai").UsedRange.Offset(2)
Set d = CreateObject("Scripting.Dictionary")
Set r = s.Columns(3)
w = s.Columns.Count
h = s.Rows.Count
ReDim a(1 To h, 1 To w)
Set c = r.Cells(0)
Do
        Set c = c.Offset(1)
        If c <> c.Offset(-1) Then
            i = i + 1
            ReDim Preserve b(1 To i)
            b(i) = c.Row
        End If
Loop Until c = ""
Do
        j = j + 1
        d.RemoveAll
        For k = 2 To 4
            Set n = r.Offset(b(j) - r.Row, k).Resize(b(j + 1) - b(j))
            Mn = Application.Match(Application.Min(n), n, 0)
            If Not d.Exists(Mn) Then d.Add Mn, ""
            If k > 2 Then
                Mx = Application.Match(Application.Max(n), n, 0)
                If Not d.Exists(Mx) Then d.Add Mx, ""
            End If
        Next
        For Each e In d.Keys
            p = p + 1
            For q = 1 To w
                a(p, q) = s.Cells(e + n.Row - s.Row, q)
            Next
        Next
Loop Until j + 1 = UBound(b)
Sheets.Add
ActiveSheet.[A1].Resize(p, w).Value = a
Set d = Nothing
End Sub
 
Upvote 0
Bạn chạy thử code sau nhé
Mã:
Sub filter()
Dim a(), b(), c As Range, d
Set s = Sheets("debai").UsedRange.Offset(2)
Set d = CreateObject("Scripting.Dictionary")
Set r = s.Columns(3)
w = s.Columns.Count
h = s.Rows.Count
ReDim a(1 To h, 1 To w)
Set c = r.Cells(0)
Do
        Set c = c.Offset(1)
        If c <> c.Offset(-1) Then
            i = i + 1
            ReDim Preserve b(1 To i)
            b(i) = c.Row
        End If
Loop Until c = ""
Do
        j = j + 1
        d.RemoveAll
        For k = 2 To 4
            Set n = r.Offset(b(j) - r.Row, k).Resize(b(j + 1) - b(j))
            Mn = Application.Match(Application.Min(n), n, 0)
            If Not d.Exists(Mn) Then d.Add Mn, ""
            If k > 2 Then
                Mx = Application.Match(Application.Max(n), n, 0)
                If Not d.Exists(Mx) Then d.Add Mx, ""
            End If
        Next
        For Each e In d.Keys
            p = p + 1
            For q = 1 To w
                a(p, q) = s.Cells(e + n.Row - s.Row, q)
            Next
        Next
Loop Until j + 1 = UBound(b)
Sheets.Add
ActiveSheet.[A1].Resize(p, w).Value = a
Set d = Nothing
End Sub
Chào a, vậy có thể thực hiện tại sheet hiện hành ko a (và kết quả là ở ô 14 tại sheet hiện hành sheet debai) sao mỗi lần chạy sub thì lại add thêm 1 sheet mới vậy!!
mong a hiệu chỉnh kết quả tãi sheet hiện hành luôn. cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom