Lọc duy nhất ? (1 người xem)

Liên hệ QC

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

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,895
Được thích
1,219
Xin chào tất cả các bạn,
Thời gian trước O.Thơ có tìm hiểu trên diễn đàn phương pháp sử dụng code để lọc duy nhất.
Cụ thể O.Thơ muốn lọc dữ liệu từ cột C đến cột I dữ liệu duy nhất được đưa vào cột J.
Và O.Thơ đã sử dụng bình thường nhưng đến thời điểm này thì code bị lỗi.
O.Thơ không biết xử lý thế nào nên gửi nên đây để nhờ các bạn giúp đỡ.


Rất mong nhận được sự trợ giúp của các bạn,
Trân trọng cảm ơn.
 

File đính kèm

Xin chào tất cả các bạn,
Thời gian trước O.Thơ có tìm hiểu trên diễn đàn phương pháp sử dụng code để lọc duy nhất.
Cụ thể O.Thơ muốn lọc dữ liệu từ cột C đến cột I dữ liệu duy nhất được đưa vào cột J.
Và O.Thơ đã sử dụng bình thường nhưng đến thời điểm này thì code bị lỗi.
O.Thơ không biết xử lý thế nào nên gửi nên đây để nhờ các bạn giúp đỡ.


Rất mong nhận được sự trợ giúp của các bạn,
Trân trọng cảm ơn.

Bạn xem file đính kèm.
 

File đính kèm

Upvote 0
Xin chào tất cả các bạn,
Thời gian trước O.Thơ có tìm hiểu trên diễn đàn phương pháp sử dụng code để lọc duy nhất.
Cụ thể O.Thơ muốn lọc dữ liệu từ cột C đến cột I dữ liệu duy nhất được đưa vào cột J.
Và O.Thơ đã sử dụng bình thường nhưng đến thời điểm này thì code bị lỗi.
O.Thơ không biết xử lý thế nào nên gửi nên đây để nhờ các bạn giúp đỡ.


Rất mong nhận được sự trợ giúp của các bạn,
Trân trọng cảm ơn.

Bạn thử chạy Sub này:
PHP:
Sub GPE()
Dim sArr(), dArr(), I As Long, J As Long, K As Long, R As Long, Tem As String
R = ActiveCell.SpecialCells(xlLastCell).Row
sArr = Range("A5:I" & R).Value
ReDim dArr(1 To UBound(sArr) * 7, 1 To 1)
With CreateObject("Scripting.Dictionary")
For I = 1 To UBound(sArr)
    For J = 1 To UBound(sArr, 2)
        If sArr(I, J) <> Empty Then
            Tem = sArr(I, J)
            If Not .Exists(Tem) Then
                K = K + 1
                .Add Tem, ""
                dArr(K, 1) = Tem
            End If
        End If
    Next J
Next I
End With
Range("J5:J10000").ClearContents
Range("J5").Resize(K) = dArr
End Sub
 
Upvote 0
Xin chào tất cả các bạn,
Thời gian trước O.Thơ có tìm hiểu trên diễn đàn phương pháp sử dụng code để lọc duy nhất.
Cụ thể O.Thơ muốn lọc dữ liệu từ cột C đến cột I dữ liệu duy nhất được đưa vào cột J.
Và O.Thơ đã sử dụng bình thường nhưng đến thời điểm này thì code bị lỗi.
O.Thơ không biết xử lý thế nào nên gửi nên đây để nhờ các bạn giúp đỡ.


Rất mong nhận được sự trợ giúp của các bạn,
Trân trọng cảm ơn.
Hàm Transpose không thể sử lý một chuỗi >255 ký tự, do vậy báo lỗi nhé bạn.
(trong file của bạn có một ô[H1437] có 266 ký tự, xoá thử ô này đi thì sub chạy bình thường.
 
Lần chỉnh sửa cuối:
Upvote 0
Ahihi,kết quả OK rồi ạ.
Oanh Thơ xin cảm ơn các bạn nhiều nhé.

ôi,bùn ghê nút cảm ơn ẩn đâu mất rồi (T_T)!
 
Upvote 0
Xin chào tất cả các bạn,
Thời gian trước O.Thơ có tìm hiểu trên diễn đàn phương pháp sử dụng code để lọc duy nhất.
Cụ thể O.Thơ muốn lọc dữ liệu từ cột C đến cột I dữ liệu duy nhất được đưa vào cột J.
Và O.Thơ đã sử dụng bình thường nhưng đến thời điểm này thì code bị lỗi.
O.Thơ không biết xử lý thế nào nên gửi nên đây để nhờ các bạn giúp đỡ.


Rất mong nhận được sự trợ giúp của các bạn,
Trân trọng cảm ơn.

Nếu dữ liệu của bạn khá đặc biệt thì không nên dùng hàm Transpose mà nên viết hàm riêng (nguyên nhân thì bài 4 đã nói rõ)
Mã:
Function ArrayTo2D(ByVal Arr)
  If IsArray(Arr) Then
    ReDim aRet(LBound(Arr) To UBound(Arr), 1 To 1)
    Dim n As Long
    For n = LBound(Arr) To UBound(Arr)
      aRet(n, 1) = Arr(n)
    Next
    ArrayTo2D = aRet
  End If
End Function
Thêm hàm trên vào module của bạn rồi sửa lại đoạn:
Mã:
If IsArray(Arr) Then .Range("J3").Resize(UBound(Arr) + 1).Value = [COLOR=#ff0000]WorksheetFunction.Transpose(Arr)[/COLOR]
Thành:
Mã:
If IsArray(Arr) Then .Range("J3").Resize(UBound(Arr) + 1).Value = [COLOR=#ff0000]ArrayTo2D(Arr)[/COLOR]
là xong
 
Upvote 0
Nếu dữ liệu của bạn khá đặc biệt thì không nên dùng hàm Transpose mà nên viết hàm riêng (nguyên nhân thì bài 4 đã nói rõ)
Mã:
Function ArrayTo2D(ByVal Arr)
  If IsArray(Arr) Then
    ReDim aRet(LBound(Arr) To UBound(Arr), 1 To 1)
    Dim n As Long
    For n = LBound(Arr) To UBound(Arr)
      aRet(n, 1) = Arr(n)
    Next
    ArrayTo2D = aRet
  End If
End Function
Thêm hàm trên vào module của bạn rồi sửa lại đoạn:
Mã:
If IsArray(Arr) Then .Range("J3").Resize(UBound(Arr) + 1).Value = [COLOR=#ff0000]WorksheetFunction.Transpose(Arr)[/COLOR]
Thành:
Mã:
If IsArray(Arr) Then .Range("J3").Resize(UBound(Arr) + 1).Value = [COLOR=#ff0000]ArrayTo2D(Arr)[/COLOR]
là xong

Yeap ^^ !!

Tôi đã làm theo sự chỉ dẫn của bạn --> kết quả cũng đúng ý tôi rồi... hihi
Ngưỡng mộ bạn đã đâu hôm nay mới được bạn trực tiếp chỉ dẫn... quả thực là danh bất hư truyền!
Rất mong thời gian sau này được bạn giúp đỡ nhiều hơn nữa -\\/.

Xin cảm ơn bạn và diễn đàn nhiều nhiều!
Chúc mọi người một năm mới sức khỏe dồi dào, mọi việc tốt đẹp.
O.Thơ
 
Upvote 0
Yeap ^^ !!

Tôi đã làm theo sự chỉ dẫn của bạn --> kết quả cũng đúng ý tôi rồi... hihi
Ngưỡng mộ bạn đã đâu hôm nay mới được bạn trực tiếp chỉ dẫn... quả thực là danh bất hư truyền!
Rất mong thời gian sau này được bạn giúp đỡ nhiều hơn nữa -\\/.

Xin cảm ơn bạn và diễn đàn nhiều nhiều!
Chúc mọi người một năm mới sức khỏe dồi dào, mọi việc tốt đẹp.
O.Thơ
Ôi! Giúp được người đẹp là niềm vinh hạnh của "kẻ hèn" này
Ẹc... Ẹc...
 
Upvote 0
Lọc theo điều kiện?

Xin chào các bạn,

Nhờ các bạn giúp đỡ tôi trường hợp trong file đính kèm này với ạ.
 

File đính kèm

Upvote 0
Xin chào các bạn,

Nhờ các bạn giúp đỡ tôi trường hợp trong file đính kèm này với ạ.
Hoặc 1:
Mã:
Sub FArray()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim tmp() As Variant, z As Long, r As Long, KQ() As Variant, j As Long, k As Long, kk As Long
Const dk As String = "0-TK"
With Sheet1
    z = .Range("B" & .Rows.Count).End(xlUp).Row
    tmp = .Range("B5:BI" & z): z = UBound(tmp, 1): kk = UBound(tmp, 2)
End With
ReDim KQ(1 To z, 1 To kk)
For r = 1 To z
    If tmp(r, kk) = dk Then
        j = j + 1
        For k = 1 To kk
            KQ(j, k) = tmp(r, k)
        Next k
    End If
Next r
If j Then
    With Sheet2
    .Range("E6").Resize(65000, 60).ClearContents
    .Range("E6").Offset(0, 11).Resize(j, 1).NumberFormat = "dd/mm/yyyy"
    .Range("E6").Resize(j, kk) = KQ
    .Range("E6").Offset(j, 0) = "=SUM(E6:E" & j + 5 & ")"
    .Range("E6").Offset(j, 0).Resize(1, kk - 1).FillRight
    .Range("E6").Offset(j, 11).ClearContents
    End With
End If
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
Hoặc 2:
Mã:
Sub AFilter()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim z As Long
Const dk As String = "0-TK"
With Sheet1
    .AutoFilterMode = False
    z = .Range("B" & .Rows.Count).End(xlUp).Row
    .Range("BI4:BI" & z).AutoFilter Field:=1, Criteria1:=dk
    If .Range("B4:B" & z).SpecialCells(xlCellTypeVisible).Count > 1 Then
        Sheet2.Range("E6").Resize(65000, 60).ClearContents
        .Range("B5:BI" & z).SpecialCells(xlCellTypeVisible).Copy
    Else
        Exit Sub
    End If
End With
Sheet2.Select
With Sheet2
    .Range("E6").PasteSpecial Paste:=xlPasteValues
    .Range("E6").Select
    z = .Range("E" & .Rows.Count).End(xlUp).Row + 1
    .Range("E6").Offset(0, 11).Resize(z - 6, 1).NumberFormat = "dd/mm/yyyy"
    .Range("E" & z) = "=SUM(E6:E" & z - 1 & ")"
    .Range("E" & z).Resize(1, 59).FillRight
    .Range("E" & z).Offset(0, 11).ClearContents
End With
sheet1.AutoFilterMode = False
Application.CutCopyMode = False
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Hoặc 1:
Mã:
Sub FArray()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim tmp() As Variant, z As Long, r As Long, KQ() As Variant, j As Long, k As Long, kk As Long
Const dk As String = "0-TK"
With Sheet1
    z = .Range("B" & .Rows.Count).End(xlUp).Row
    tmp = .Range("B5:BI" & z): [COLOR=#ff0000][B]z = UBound(tmp, 1): kk = UBound(tmp, 2)[/B][/COLOR]
End With
[COLOR=#ff0000][B]ReDim KQ(1 To z, 1 To kk)[/B][/COLOR]
For r = 1 To z
    If tmp(r, kk) = dk Then
        j = j + 1
        For k = 1 To kk
            KQ(j, k) = tmp(r, k)
        Next k
    End If
Next r
If j Then
    With Sheet2
    .Range("E6").Resize(65000, 60).ClearContents
    .Range("E6").Offset(0, 11).Resize(j, 1).NumberFormat = "dd/mm/yyyy"
    .Range("E6").Resize(j, [SIZE=3][COLOR=#ff0000][B]kk[/B][/COLOR][/SIZE]) = KQ
    .Range("E6").Offset(j, 0) = "=SUM(E6:E" & j + 5 & ")"
    .Range("E6").Offset(j, 0).Resize(1, kk - 1).FillRight
    .Range("E6").Offset(j, 11).ClearContents
    End With
End If
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub

[/code]
Khai báo hay thế ...sáng tạo đó
 
Lần chỉnh sửa cuối:
Upvote 0
Hoặc 1:
Mã:
Sub FArray()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim tmp() As Variant, z As Long, r As Long, KQ() As Variant, j As Long, k As Long, kk As Long
Const dk As String = "0-TK"
With Sheet1
    z = .Range("B" & .Rows.Count).End(xlUp).Row
    tmp = .Range("B5:BI" & z): z = UBound(tmp, 1): kk = UBound(tmp, 2)
End With
ReDim KQ(1 To z, 1 To kk)
For r = 1 To z
    If tmp(r, kk) = dk Then
        j = j + 1
        For k = 1 To kk
            KQ(j, k) = tmp(r, k)
        Next k
    End If
Next r
If j Then
    With Sheet2
    .Range("E6").Resize(65000, 60).ClearContents
    .Range("E6").Offset(0, 11).Resize(j, 1).NumberFormat = "dd/mm/yyyy"
    .Range("E6").Resize(j, kk) = KQ
    .Range("E6").Offset(j, 0) = "=SUM(E6:E" & j + 5 & ")"
    .Range("E6").Offset(j, 0).Resize(1, kk - 1).FillRight
    .Range("E6").Offset(j, 11).ClearContents
    End With
End If
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
Hoặc 2:
Mã:
Sub AFilter()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim z As Long
Const dk As String = "0-TK"
With Sheet1
    .AutoFilterMode = False
    z = .Range("B" & .Rows.Count).End(xlUp).Row
    .Range("BI4:BI" & z).AutoFilter Field:=1, Criteria1:=dk
    If .Range("B4:B" & z).SpecialCells(xlCellTypeVisible).Count > 1 Then
        Sheet2.Range("E6").Resize(65000, 60).ClearContents
        .Range("B5:BI" & z).SpecialCells(xlCellTypeVisible).Copy
    Else
        Exit Sub
    End If
End With
Sheet2.Select
With Sheet2
    .Range("E6").PasteSpecial Paste:=xlPasteValues
    .Range("E6").Select
    z = .Range("E" & .Rows.Count).End(xlUp).Row + 1
    .Range("E6").Offset(0, 11).Resize(z - 6, 1).NumberFormat = "dd/mm/yyyy"
    .Range("E" & z) = "=SUM(E6:E" & z - 1 & ")"
    .Range("E" & z).Resize(1, 59).FillRight
    .Range("E" & z).Offset(0, 11).ClearContents
End With
sheet1.AutoFilterMode = False
Application.CutCopyMode = False
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub

xin cảm ơn befaint rất nhiều, cả 2 cách đều OK bạn ah.
Cách 2 tốc độ nhanh hơn cách 1 nhiều, hihi. :-=
 
Upvote 0
@befaint:
Code số 1 của bạn có đến 7 biến dùng tên đơn giản mà không có giải thích, và không theo đường lối tên biến nào cả. Loại code này về sau rất khó sửa.
Theo lệ chung (*), nếu code đơn giản thì người ta có thể dùng i, j, k để làm số đếm. Nhưng nếu có mòi phức tạp một chút (code có đến 7 biến là phức tạp) thì ngừoi ta đặt tên cho dễ đọc. Ví dụ i thì gọi là cot, j gọi là dng, k là soDng, z và kk là cotMx và dngMx chẳng hạn.

Điểm thứ hai, điểm này quan trọng hơn, là bạn dùng một biến tên là tmp. Có lẽ do từ temporary (tạm). Loại tên này chỉ nên dùng cho biến có giá trị trong vòng 2 hay 3 dòng thôi. Sau 2-3 dòng, biến thay đổi thành tmp khác. Hầu hết các trường hợp, tên tmp được dùng để tạm chứa cái gì đó rồi chuyển đi lập tức. Điển hình là code hoán đổi trị:
tmp = a: a = b : b = tmp ' hoán đổi a và b

Điểm thứ 3, thường thì hằng (Const) ngừoi ta đặt tên dài một chút, và dùng tên hoa, ví dụ DIEUKIEN. Nhưng quan trọng hơn là nên đặt chúng ở đầu code, ngay sau dòng khai báo sub, function. Vì hằng thường là những thông số quyết định hoặc hở trợ cho cách làm việc của hàm. Khi đọc code, ngừoi ta thấy ngay là code này có những thông số gì, và khi cần thay đổi, khong phải tìm kiếm xa xôi.

(*) lệ chứ không phải luật.
 
Upvote 0
@befaint:
Code số 1 của bạn có đến 7 biến dùng tên đơn giản mà không có giải thích, và không theo đường lối tên biến nào cả. Loại code này về sau rất khó sửa.
Theo lệ chung (*), nếu code đơn giản thì người ta có thể dùng i, j, k để làm số đếm. Nhưng nếu có mòi phức tạp một chút (code có đến 7 biến là phức tạp) thì ngừoi ta đặt tên cho dễ đọc. Ví dụ i thì gọi là cot, j gọi là dng, k là soDng, z và kk là cotMx và dngMx chẳng hạn.

Điểm thứ hai, điểm này quan trọng hơn, là bạn dùng một biến tên là tmp. Có lẽ do từ temporary (tạm). Loại tên này chỉ nên dùng cho biến có giá trị trong vòng 2 hay 3 dòng thôi. Sau 2-3 dòng, biến thay đổi thành tmp khác. Hầu hết các trường hợp, tên tmp được dùng để tạm chứa cái gì đó rồi chuyển đi lập tức. Điển hình là code hoán đổi trị:
tmp = a: a = b : b = tmp ' hoán đổi a và b

Điểm thứ 3, thường thì hằng (Const) ngừoi ta đặt tên dài một chút, và dùng tên hoa, ví dụ DIEUKIEN. Nhưng quan trọng hơn là nên đặt chúng ở đầu code, ngay sau dòng khai báo sub, function. Vì hằng thường là những thông số quyết định hoặc hở trợ cho cách làm việc của hàm. Khi đọc code, ngừoi ta thấy ngay là code này có những thông số gì, và khi cần thay đổi, khong phải tìm kiếm xa xôi.

(*) lệ chứ không phải luật.

Cảm ơn anh. Em sẽ điều chỉnh dần.

Chúc anh ngày vui!
 
Upvote 0
@befaint:
Code số 1 của bạn có đến 7 biến dùng tên đơn giản mà không có giải thích, và không theo đường lối tên biến nào cả. Loại code này về sau rất khó sửa.
Theo lệ chung (*), nếu code đơn giản thì người ta có thể dùng i, j, k để làm số đếm. Nhưng nếu có mòi phức tạp một chút (code có đến 7 biến là phức tạp) thì ngừoi ta đặt tên cho dễ đọc. Ví dụ i thì gọi là cot, j gọi là dng, k là soDng, z và kk là cotMx và dngMx chẳng hạn.

Điểm thứ hai, điểm này quan trọng hơn, là bạn dùng một biến tên là tmp. Có lẽ do từ temporary (tạm). Loại tên này chỉ nên dùng cho biến có giá trị trong vòng 2 hay 3 dòng thôi. Sau 2-3 dòng, biến thay đổi thành tmp khác. Hầu hết các trường hợp, tên tmp được dùng để tạm chứa cái gì đó rồi chuyển đi lập tức. Điển hình là code hoán đổi trị:
tmp = a: a = b : b = tmp ' hoán đổi a và b

Điểm thứ 3, thường thì hằng (Const) ngừoi ta đặt tên dài một chút, và dùng tên hoa, ví dụ DIEUKIEN. Nhưng quan trọng hơn là nên đặt chúng ở đầu code, ngay sau dòng khai báo sub, function. Vì hằng thường là những thông số quyết định hoặc hở trợ cho cách làm việc của hàm. Khi đọc code, ngừoi ta thấy ngay là code này có những thông số gì, và khi cần thay đổi, khong phải tìm kiếm xa xôi.

(*) lệ chứ không phải luật.

Hi, cảm ơn VetMini đã tham gia góp ý ạ
Đúng như bạn đã nhận xét ạ,code với tôi không có coment ở mỗi dòng đúng là rất khó khăn cho những người không hiểu biết về code như tôi ạ.
Cứ mỗi lần sửa sửa hay thêm bớt cái gì,tôi không biết phải tự sửa code thế nào nên lại đưa lên đây để hỏi. (T_T)

Cảm ơn anh. Em sẽ điều chỉnh dần.

Chúc anh ngày vui!

befaint ơi ,lúc nào bạn điều chỉnh gì thì điều chỉnh trong chủ đề này bạn nhé.
Hi cảm ơn bạn nhiều.
 
Upvote 0
Xin chào các bạn,
Tôi đang vướng mắc về vấn lọc dữ liệu theo điều kiện (cụ thể nêu trong sheet3 của file kèm), tôi đã loay hoay suốt hàng giờ đồng mà không biết code như thế nào.
Nên up lên đây nhờ các bạn giúp đỡ các bạn giúp đỡ cho ạ:
Hic, do hết dung lượng đưa file trực tiếp lên diễn đàn,vì vậy Oanh Thơ gửi file vào đây ạ: (T_T)
https://secufiles.com/4Lm8/loc_(1).xlsb

Phiền các bạn xem và giúp đỡ cho ạ.
 
Upvote 0
Web KT

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

Back
Top Bottom