Lọc duy nhất theo điều kiện, đồng thời sắp xếp tăng dần (không dùng cột phụ)
Bài toán của em dữ liệu thật có khoảng 400-500 dòng, yêu cầu bài toán:
– Trích lọc duy nhất (loại bỏ ô trống và số 0);
– Đồng thời với nó là sắp xếp dữ liệu theo thứ tự tăng dầnNhờ các bác giúp đỡ cho.
Theo như yêu cầu của bài, là lọc duy nhất, loại bỏ giá trị rỗng, loại bỏ giá trị 0, sắp xếp tăng dần.
Tương tự ở bài 113 như tôi đã nói ở bài trước, cấu trúc chỉ thay đổi tí xíu:
sSQL = "SELECT DISTINCT" & FieldName & "FROM" & SheetName [COLOR=#ff0000]& _
"WHERE" & FieldName & "<> NULL AND" & FieldName & "<>0"[/COLOR]
Thủ tục bây giờ sẽ như sau:
Sub LocDuyNhat()
Dim FileName As String, SheetName As String, FieldName As String, _
AppPath As String, sSQL As String, ObjRcs As Object
AppPath = ThisWorkbook.Path
FileName = "LocDuyNhat.xlsm"
SheetName = " [Sheet1$] "
FieldName = " "
If ExcelConnect(AppPath, FileName) = False Then
MsgBox "Không kêt nôi", vbOKOnly + vbExclamation, "Thông báo"
GoTo ExitSub
Else
sSQL = "SELECT DISTINCT" & FieldName & "FROM" & SheetName & _
"WHERE" & FieldName & "<> NULL AND" & FieldName & "<>0"
Set ObjRcs = CreateObject("ADODB.Recordset")
On Error GoTo SheetFieldNameErr
ObjConnect.Open
ObjRcs.Open sSQL, ObjConnect, 0, 1, 1
If ObjRcs.EOF Then
MsgBox "Không có dieu kien này", vbOKOnly + vbInformation, "THÔNG BÁO"
GoTo ExitSub
Else
Sheet1.Range("C2:C1048576").ClearContents
Sheet1.Range("C2").CopyFromRecordset ObjRcs
End If
End If
ExitSub:
Set ObjRcs = Nothing
If Not ObjConnect Is Nothing Then
If (ObjConnect.State And adStateOpen) = adStateOpen Then ObjConnect.Close
Set ObjConnect = Nothing
End If
Exit Sub
SheetFieldNameErr:
MsgBox "Ten Sheet hoac ten Tieu de cot chua dung, xin kiem tra lai!", vbCritical, "THÔNG BÁO"
Resume ExitSub
End Sub
Cũng nói thêm, nếu bạn muốn sắp xếp ngược lại thì câu lệnh SQL sẽ thêm ORDER BY (ASC|DESC) nha bạn:
sSQL = "SELECT DISTINCT" & FieldName & _
"FROM" & SheetName & _
"WHERE" & FieldName & "<> NULL AND" & FieldName & "<>[COLOR=#0000cd]0 " & _[/COLOR]
[COLOR=#0000cd]"ORDER BY" & FieldName & "DESC"[/COLOR]
Mặc định của nó là sắp xếp tăng dần nên không cần thêm ASC đâu.
www.giaiphapexcel.com/diendan/threads/l%E1%BB%8Dc-duy-nh%E1%BA%A5t-theo-%C4%91i%E1%BB%81u-ki%E1%BB%87n-%C4%91%E1%BB%93ng-th%E1%BB%9Di-s%E1%BA%AFp-x%E1%BA%BFp-t%C4%83ng-d%E1%BA%A7n-kh%C3%B4ng-d%C3%B9ng-c%E1%BB%99t-ph%E1%BB%A5.77121/
Khóa học Power PI – Ứng dung trong Nhân sự
TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...
Xem khóa học
Nếu dữ liệu của bạn là số, giống như trong file ví dụ của bạn thì dùng công thức có thể như thế này. Đặt các Name sau cho tiện: Data=Sheet1!$A$2:$A$13 Ma=SMALL(IF(Data=0,"",Data),ROW(INDIRECT("1:"&COUNTIF(Data,">0")))) Ví dụ ở ô D2 cho công thức trả kết quả như sau: =INDEX(Ma,MATCH(0,COUNTIF($D$1:D1,Ma),0)) và fill xuống. Bạn xem thêm theo file đính kèm.
Một cách dùng công thức theo kiểu dữ liệu trong bài
Công thưc ở :
Thân
Có lẽ chúng ta phải xem lại code về ADO sao cho code viết ở mức tổng quát
Bảng dữ liệu mà tôi thường thấy nhất nó có kiểu thế này:
1355
Tức 5, 6 dòng trên cùng người ta chừa ra để ghi gì đó (tên cty, tiêu đề….) và bên dưới mới là CSDL
Trường hợp này bắt buộc ta phải chỉ chính xác vùng dữ liệu mà ta cần lọc (chứ đâu phải lọc nguyên sheet). Vậy trường hợp này ta tính sao?
Code tổng quát tôi nghĩ phải được viết theo dạng:
Sub/Function Tên Sub/Function(vùng dữ liệu, tiêu đề cần lọc….)
Ít nhất phải thế
Nếu không thì chỉ còn cách:
– Copy vùng dữ liệu ra 1 sheet mới (khi ấy UsedRange của sheet mới chính bằng vùng dữ liệu vừa paste)
– Xong, dùng ADO để lọc (khi ấy ta không cần quan tâm đến vùng dữ liệu nằm ở đâu)
Ẹc… Ẹc… rườm rà quá!
Xem file đính kèm. Nhấn Ctrl-F3 xem Name mình đặt nhé.
P/S: mình muốn add nick mình cho thành 11 người cám ơn bạn mà không được.__–__
Gửi các bạn file mẫu tham khảo: Sort dạng Text hay số cho mảng có 1 hay nhiều cột.