- Tham gia
- 17/8/08
- Bài viết
- 8,662
- Được thích
- 16,720
- Giới tính
- Nam
Tôi viết cái này dựa theo ghi lại Macro việc SORT nhiều cột. Thủ tục này chỉ thực hiện trên Excel 2007 trở về sau.
Thủ tục chính:
Với SortType và Header, mặc định là False nếu ta không ghi gì vào đó, có nghĩa là: SortType = False tức Sort từ nhỏ tới lớn và ngược lại, SortType = True là Sort từ lớn đến nhỏ. Còn Header = False tức không có tiêu đề cột và ngược lại Còn Header = True là có tiêu đề cột (để tránh việc sort luôn cái tiêu đề).
Thủ tục chính để thực hiện:
Như thế, tên sheet ta ghi dạng chuỗi, tên cột ghi bằng chuỗi có cấu trúc như màu cam ("E,F,G,H,I"), cột nào ưu tiên trước thì để trước dần dần cho tới sau. Cách nhau bằng dầu phẩy (,) có khoảng trắng cũng được, không cũng được.
Số cột và tên cột cần sắp xếp phải phù hợp vùng cần sắp xếp, chứ không thể vùng sắp xếp có 7 cột mà cột cần sắp xếp lại vượt quá 7, đồng thời tên cột không có cột A trong vùng sắp xếp lại đặt điều kiện có cột A trong đó cũng không được.
Xem cải tiến ở bài #9 của topic này:
http://www.giaiphapexcel.com/forum/showthread.php?109381-Tặng-các-bạn-thủ-tục-SORT-với-rất-nhiều-cột-trong-bảng-tính&p=684244#post684244
Thủ tục chính:
Mã:
Sub MultiSort(ByVal SheetName As String, _
ByVal SortRange As Range, _
ByVal ColumnName As String, _
Optional ByVal SortType As Boolean, _
Optional ByVal Header As Boolean)
Dim splArr
Dim c As Long
Dim WS As Worksheet
ColumnName = UCase(Replace(ColumnName, " ", ""))
splArr = Split(ColumnName, ",")
Set WS = Worksheets(SheetName)
WS.Sort.SortFields.Clear
For c = 0 To UBound(splArr)
WS.Sort.SortFields.Add _
Key:=Range(splArr(c) & 1), _
SortOn:=xlSortOnValues, _
Order:=IIf(SortType, xlDescending, xlAscending), _
DataOption:=xlSortNormal
Next
With WS.Sort
.SetRange SortRange
.Header = IIf(Header, xlYes, xlNo)
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Với SortType và Header, mặc định là False nếu ta không ghi gì vào đó, có nghĩa là: SortType = False tức Sort từ nhỏ tới lớn và ngược lại, SortType = True là Sort từ lớn đến nhỏ. Còn Header = False tức không có tiêu đề cột và ngược lại Còn Header = True là có tiêu đề cột (để tránh việc sort luôn cái tiêu đề).
Thủ tục chính để thực hiện:
Mã:
Sub Test()
MultiSort "Sheet1", Range("D8:I18"), "E,F,G,H,I", True, True
End Sub
Như thế, tên sheet ta ghi dạng chuỗi, tên cột ghi bằng chuỗi có cấu trúc như màu cam ("E,F,G,H,I"), cột nào ưu tiên trước thì để trước dần dần cho tới sau. Cách nhau bằng dầu phẩy (,) có khoảng trắng cũng được, không cũng được.
Số cột và tên cột cần sắp xếp phải phù hợp vùng cần sắp xếp, chứ không thể vùng sắp xếp có 7 cột mà cột cần sắp xếp lại vượt quá 7, đồng thời tên cột không có cột A trong vùng sắp xếp lại đặt điều kiện có cột A trong đó cũng không được.
Xem cải tiến ở bài #9 của topic này:
http://www.giaiphapexcel.com/forum/showthread.php?109381-Tặng-các-bạn-thủ-tục-SORT-với-rất-nhiều-cột-trong-bảng-tính&p=684244#post684244
File đính kèm
Lần chỉnh sửa cuối: