Tặng các bạn thủ tục SORT với rất nhiều cột trong bảng tính (1 người xem)

Liên hệ QC

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

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
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:

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:
Nhân chủ đề về sort. Các anh chị cho tội hỏi một chút:
- Bình thường khi ta muốn sort thì vùng dữ liệu phải không có dòng trống; mới sort được, Vậy với dữ liệu có nhiều vùng cần sort mà mỗi vùng lại có dòng trống xen vào thì làm thế nao?
- Làm sao để xác định được từng vùng chứa dữ liệu được ngăn cách bởi những dòng trống đó, sau đó sort theo vùng (Không được xóa dòng trống)
Xin cảm ơn các anh chị!.
 
Upvote 0
Nhân chủ đề về sort. Các anh chị cho tội hỏi một chút:
- Bình thường khi ta muốn sort thì vùng dữ liệu phải không có dòng trống; mới sort được, Vậy với dữ liệu có nhiều vùng cần sort mà mỗi vùng lại có dòng trống xen vào thì làm thế nao?
- Làm sao để xác định được từng vùng chứa dữ liệu được ngăn cách bởi những dòng trống đó, sau đó sort theo vùng (Không được xóa dòng trống)
Xin cảm ơn các anh chị!.
Nói j thì nói cũng phải có file bạn ạ.
vấn đề là muốn sort thế nào thôi? Nếu coi các dòng trống là phần ngăn cách thì bạn cứ Set các range khác nhau rồi sort theo từng range (như kiểu bạn record macro: chọn vùng 1 -> sort, chọn vùng 2 -> sort...). Tôi có cảm giác là được. Bạn thử xem sao.
 
Upvote 0
Nói j thì nói cũng phải có file bạn ạ.
vấn đề là muốn sort thế nào thôi? Nếu coi các dòng trống là phần ngăn cách thì bạn cứ Set các range khác nhau rồi sort theo từng range (như kiểu bạn record macro: chọn vùng 1 -> sort, chọn vùng 2 -> sort...). Tôi có cảm giác là được. Bạn thử xem sao.
- Nếu các vùng của mình cố định thì việc đó không không khó. Nhưng vùng danh sách của mình không cố định. Thì việc mình chọn được vùng sort là khó.
- Cái bí của em là chưa biết cách chọn vùng dữ liệu ngăn cách bới các dòng trống để sort.
- Mong các anh chi xem giúp
 

File đính kèm

Upvote 0
Bạn thử code vui sau nhé:
Mã:
Option Explicit
Sub Sort_GPE()
Dim j As Long, k As Long, F As Long
Dim Z As Long, Y As Long, i As Long
j = Sheet1.Range("B65000").End(3).Row
Z = Sheet1.Range("B6").End(4).Row
Sheet1.Range("B6:F" & Z).Sort Sheet1.Range("C3:C" & Z), xlAscending
    For i = 0 To j Step k
        k = Sheet1.Range("B" & k + 2).End(4).Row
        If k = j Then Exit Sub
        'On Error Resume Next
        F = Sheet1.Range("B" & k + 2).End(4).Row
        Sheet1.Range("B" & k + 2 & ":F" & F).Sort Sheet1.Range("C" & k + 2 & ":C" & F), xlAscending
    Next i
End Sub
- Cảm ơn Anh nhiều nha!. Đúng ý tôi cần.
 
Upvote 0
Web KT

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

Back
Top Bottom