Sắp xếp dữ liệu: Lọc tên theo ABC (alphabet) có lỗi tên Đam đứng trước Diệp

Liên hệ QC

mrhh

Thành viên mới
Tham gia
29/10/19
Bài viết
29
Được thích
8
Như trình bày trên tiêu đề: Em đang lọc dữ liệu sắp xếp tên theo thứ tự alphbet (ABC) trên phần mềm hệ thống từ xưa ai tên có chữ cái D sẽ đứng trước tên có chữ cái Đ, Ví dụ Diệp đứng trên Đam. Vậy mà nay em cho Excel sắp xếp thì lại bị ngược (Đam đứng trước Diep). Em đã tìm GG và đổi Font, bảng mã Unicode đều ko được như ý.
Phiền các anh chị em cao thủ gỡ rối giúp.
Em dùng Office 2019 và 2021.
Cập nhật: Em phát hiện ra trong Excel khi để riêng các kí tự d, đ thì; d sẽ đứng trước đ, còn khi ghép chữ vào thành tên thì d,đ bằng nhau nó sẽ xét tới kí tự liền sau để xếp. Nó cũng không sắp sếp a, ă, â, b c mà là a, â, ă, b,c.
 

File đính kèm

  • File mau.xlsx
    11.8 KB · Đọc: 10
Lần chỉnh sửa cuối:
Như trình bày trên tiêu đề: Em đang lọc dữ liệu sắp xếp tên theo thứ tự alphbet (ABC) trên phần mềm hệ thống từ xưa ai tên có chữ cái D sẽ đứng trước tên có chữ cái Đ, Ví dụ Di đứng trên Đi. Vậy mà nay em cho Excel sắp xếp thì lại bị ngược (Đ đứng trước D). Em đã tìm GG và đổi Font, bảng mã Unicode đều ko được như ý.
Phiền các anh chị em cao thủ gỡ rối giúp.
Em dùng Office 2019 và 2021.
Nó có quan trọng tới mức ấy không bạn?
 
Như trình bày trên tiêu đề: Em đang lọc dữ liệu sắp xếp tên theo thứ tự alphbet (ABC) trên phần mềm hệ thống từ xưa ai tên có chữ cái D sẽ đứng trước tên có chữ cái Đ, Ví dụ Di đứng trên Đi. Vậy mà nay em cho Excel sắp xếp thì lại bị ngược (Đ đứng trước D).
Không phải luôn luôn thế. Nhưng đúng là muốn sắp xếp tiếng Việt thì không thể dùng công cụ có sẵn của Excel. Phải tự viết code thôi.
 
Nó có quan trọng tới mức ấy không bạn?
Vâng em có nhiều danh sách cứ sắp xếp xong lại phải cắt mấy bạn không theo quy luật.
Rõ ràng với em nó là phiền vì nó coi D và Đ là một và nó xét tới chữ sau nó để sắp xếp.
Em phát hiện ra là: Không chỉ nó sắp xếp hết Đ rồi đến D mà nó lộn xộn luôn. Đam, Diên, Diệp, Điệp, Đức, Dương.
Rồi còn Hân đứng trước Hào. Trong khi đó danh sách (thí sinh) thì cứ phải a,ă,â,b,c,d,đ,e,ê
Bài đã được tự động gộp:

Không phải luôn luôn thế. Nhưng đúng là muốn sắp xếp tiếng Việt thì không thể dùng công cụ có sẵn của Excel. Phải tự viết code thôi.
Cảm ơn bác đã góp ý.
 
Vâng em có nhiều danh sách cứ sắp xếp xong lại phải cắt mấy bạn không theo quy luật.
Rõ ràng với em nó là phiền vì nó coi D và Đ là một và nó xét tới chữ sau nó để sắp xếp.
Em phát hiện ra là: Không chỉ nó sắp xếp hết Đ rồi đến D mà nó lộn xộn luôn. Đam, Diên, Diệp, Điệp, Đức, Dương.
Bạn nên đưa ra bộ qui tắc sắp xếp chuẩn theo qui định của tổ chức của bạn thì mới dễ dàng cho những người hỗ trợ code sắp xếp.
Ví dụ:
- Thứ tự sắp xếp các nguyên âm có dấu của tiếng Việt là: Không dấu -> Huyền -> Sắc -> Hỏi -> Ngã -> Nặng
- Nếu là sắp xếp danh sách theo Họ và Tên, thứ tự sắp xếp là: xếp theo Tên -> xếp theo Chữ lót -> xếp theo Họ.
- ....

Screen Shot 2022-01-06 at 21.06.12.png
 
Bạn nên đưa ra bộ qui tắc sắp xếp chuẩn theo qui định của tổ chức của bạn thì mới dễ dàng cho những người hỗ trợ code sắp xếp.
Ví dụ:
- Thứ tự sắp xếp các nguyên âm có dấu của tiếng Việt là: Không dấu -> Huyền -> Sắc -> Hỏi -> Ngã -> Nặng
- Nếu là sắp xếp danh sách theo Họ và Tên, thứ tự sắp xếp là: xếp theo Tên -> xếp theo Chữ lót -> xếp theo Họ.
- ....

View attachment 271188
Cảm ơn bác đã quan tâm. Bác không những hiểu mà còn gọi ra vấn đề em còn thiếu ở khâu trình bày! Đúng là "cao" trình cao bác ạ!
Cụ thể thứ tự sắp xếp là: a, â, ă và thứ tự dấu thanh là huyền, hỏi, ngã, sắc, nặng, có thể là như sau ạ: "0123456789aAàÀảẢãÃáÁạẠăĂằẰẳẲẵẴắẮặẶâÂầẦẩẨẫẪấẤậẬbBcCdDđĐeEèÈẻẺẽẼéÉẹẸêÊềỀểỂễỄếẾệỆfFgGhHiIìÌỉỈĩĨíÍịỊjJkKlLmMnNoOòÒỏỎõÕóÓọỌôÔồỒổỔỗỖốỐộỘơƠờỜởỞỡỠớỚợỢpPqQrRsStTuUùÙủỦũŨúÚụỤưƯừỪửỬữỮứỨựỰvVwWxXyYỳỲỷỶỹỸýÝỵỴzZ"
Kiểu mới xếp giờ là:
1 ưu tiên tên,
2 ưu tiên Họ-đệm,
3. trùng cả tên họ đệm thì ưu tiên ngày sinh trước đứng trước.

Nếu nó là dễ dàng với bác thì bác cho em một file có sẵn mẫu.
sau em chỉ copy 1 cột họ và tên + cột ngày tháng năm sinh vào và nhấn nút để chạy VBA là xong thôi ạ.
Mà nó khó, mất thời gian quá em cũng ngại phiền. Cảm ơn các bác quan tâm đọc tin.
 
Lần chỉnh sửa cuối:
Cảm ơn bác đã quan tâm. Bác không những hiểu mà còn gọi ra vấn đề em còn thiếu ở khâu trình bày! Đúng là "cao" trình cao bác ạ!
Cụ thể thứ tự sắp xếp là: a, â, ă và thứ tự dấu thanh là huyền, hỏi, ngã, sắc, nặng, có thể là như sau ạ: "0123456789aAàÀảẢãÃáÁạẠăĂằẰẳẲẵẴắẮặẶâÂầẦẩẨẫẪấẤậẬbBcCdDđĐeEèÈẻẺẽẼéÉẹẸêÊềỀểỂễỄếẾệỆfFgGhHiIìÌỉỈĩĨíÍịỊjJkKlLmMnNoOòÒỏỎõÕóÓọỌôÔồỒổỔỗỖốỐộỘơƠờỜởỞỡỠớỚợỢpPqQrRsStTuUùÙủỦũŨúÚụỤưƯừỪửỬữỮứỨựỰvVwWxXyYỳỲỷỶỹỸýÝỵỴzZ"
Kiểu mới xếp giờ là:
1 ưu tiên tên,
2 ưu tiên Họ-đệm,
3. trùng cả tên họ đệm thì ưu tiên ngày sinh trước đứng trước.

Nếu nó là dễ dàng với bác thì bác cho em một file có sẵn mẫu.
sau em chỉ copy 1 cột họ và tên + cột ngày tháng năm sinh vào và nhấn nút để chạy VBA là xong thôi ạ.
Mà nó khó, mất thời gian quá em cũng ngại phiền. Cảm ơn các bác quan tâm đọc tin.

:) Tôi chỉ tài lanh tài lẹt có vài ý kiến thôi vì đã gặp trường hợp sắp xếp tên như vậy rồi. Code để xử lý trong Excel với Sheet, Cell thì tôi tệ lắm nên không hỗ trợ bạn được. Cái giải thuật tôi hay làm là:
- Dùng hàm quy chuẩn lại Họ Tên trước khi xử lý: bỏ các dấu cách dư thừa, viết hoa đầu từ.
- Hàm đảo Tên + Họ + Đệm
- Duyệt từng ký tự và áp mã tương ứng ký tự (từ bảng mã đã thiết lập sẵn) thành một chuỗi số --> Sắp xếp theo chuỗi số đó.
Việc tạo bảng mã cũng có mấy cách như hình tôi gửi ở trên hoặc chỉ thuần là các số theo thứ tự, cách nào khác nữa thì tôi chưa biết.
Screen Shot 2022-01-07 at 16.32.36.png

Mã:
Public Function QuyChuanHoTen(Hoten As String) As String
    Dim i As Long, TG As String, Ok As Boolean, s As String
    Hoten = Strings.Trim(Hoten)
    s = Strings.LCase$(Hoten)
    TG = ""
    Ok = True
    For i = 1 To Strings.Len(s)
        If Strings.Mid(s, i, 1) <> " " Then
            If Ok = True Then
                TG = TG + Strings.UCase$(Strings.Mid(s, i, 1))
                Ok = False
            Else
                TG = TG + Strings.Mid(s, i, 1)
            End If
        Else
            Ok = True
            If Strings.Mid(s, i + 1, 1) <> " " Then
                TG = TG + " "
            End If
        End If
    Next
    QuyChuanHoTen = Strings.Trim(TG)
End Function

Mã:
Public Function GhepHoTen(Hoten As String) As String
    Dim Ten As String, Ho As String, TG As String, s As String
    Dim i As Long, j As Long
    s = QuyChuanHoTen(Hoten)
    Ten = ""
    Ho = ""
    For i = Strings.Len(Hoten) To 1 Step -1
        If Strings.Mid(s, i, 1) <> " " Then
            Ten = Strings.Mid(s, i, 1) + Ten
        Else
            j = i
            Exit For
        End If
    Next
    Ho = Strings.Trim(Strings.Left(s, i))
    GhepHoTen = Ten + " " + Ho
End Function

Code cơ bản là vậy nhưng đưa vô phối hợp trong trang tính Excel thì tôi không biết nhé, nhờ các thành viên khác hỗ trợ giùm thôi. :)
 
Cảm ơn bác đã quan tâm. Bác không những hiểu mà còn gọi ra vấn đề em còn thiếu ở khâu trình bày! Đúng là "cao" trình cao bác ạ!
Cụ thể thứ tự sắp xếp là: a, â, ă và thứ tự dấu thanh là huyền, hỏi, ngã, sắc, nặng, có thể là như sau ạ: "0123456789aAàÀảẢãÃáÁạẠăĂằẰẳẲẵẴắẮặẶâÂầẦẩẨẫẪấẤậẬbBcCdDđĐeEèÈẻẺẽẼéÉẹẸêÊềỀểỂễỄếẾệỆfFgGhHiIìÌỉỈĩĨíÍịỊjJkKlLmMnNoOòÒỏỎõÕóÓọỌôÔồỒổỔỗỖốỐộỘơƠờỜởỞỡỠớỚợỢpPqQrRsStTuUùÙủỦũŨúÚụỤưƯừỪửỬữỮứỨựỰvVwWxXyYỳỲỷỶỹỸýÝỵỴzZ"
Kiểu mới xếp giờ là:
1 ưu tiên tên,
2 ưu tiên Họ-đệm,
3. trùng cả tên họ đệm thì ưu tiên ngày sinh trước đứng trước.

Nếu nó là dễ dàng với bác thì bác cho em một file có sẵn mẫu.
sau em chỉ copy 1 cột họ và tên + cột ngày tháng năm sinh vào và nhấn nút để chạy VBA là xong thôi ạ.
Mà nó khó, mất thời gian quá em cũng ngại phiền. Cảm ơn các bác quan tâm đọc tin.
Tạo cho bạn function chuyên xếp thứ tự theo Tên, Họ và Ngày sinh
Dữ liệu ít nhất có 2 dòng và phải nhập chuẩn, nếu không thỏa có thể có lỗi hoặc chạy không đúng
Mã:
Function SortTenHoNgaySinh(ByVal aHoTen, ByVal aNgaySinh, ByVal strSort$) As Variant
'Sort Du Lieu theo Ten, Ho và Ngay Sinh
'Thu tu Uu Tien theo trình tu cua chuoi "strSort"
'aHoTen: Mang Ho ten, co 1 cot Ho va Ten hoac có 2 cot gom 1 cot Ho và 1 cot Ten
'aNgaySinh: Mang ngay Sinh
  Dim i&, r&, j&, j2&, sCol&, S
 
  Set dic = CreateObject("scripting.dictionary")
  sRow = UBound(aHoTen) - LBound(aHoTen) + 1
  sCol = UBound(aHoTen, 2) - LBound(aHoTen, 2) + 1
  ReDim sArr(1 To sRow, 1 To 3)
  ReDim Res(1 To sRow, 1 To 3)
  ReDim aRow(1 To sRow, 1 To 2)
  j = LBound(aHoTen, 2)
  j2 = j + 1
  For i = 1 To sRow
    aRow(i, 1) = i
    r = LBound(aHoTen) + i - 1
    If sCol = 2 Then
      sArr(i, 1) = aHoTen(r, j)
      sArr(i, 2) = aHoTen(r, j2)
      sArr(i, 3) = aNgaySinh(r, 1)
    ElseIf sCol = 1 Then
      S = Split(aHoTen(r, j), " ")
      sArr(i, 2) = S(UBound(S))
      sArr(i, 1) = Mid(aHoTen(r, j), 1, Len(aHoTen(r, j)) - Len(sArr(i, 2)) - 1)
      sArr(i, 3) = aNgaySinh(r, 1)
    End If
  Next i
  strSort = " " & strSort
  For i = 1 To Len(strSort)
    dic.Item(Mid(strSort, i, 1)) = i
  Next i
  Call SortChar(2, 1, 1, sRow)
  Call AddRes
  SortTenHoNgaySinh = Res
End Function

Private Sub SortChar(ByVal j&, ByVal n&, ByVal fRow&, ByVal eRow&)
  Dim S(), i&, r&, k&, k2&, fR&, iChar&
 
  ReDim arr(fRow To eRow, 1 To 2)
  For i = fRow To eRow
    arr(i, 1) = dic.Item(Mid(sArr(aRow(i, 1), j), n, 1))
    arr(i, 2) = fRow
  Next i
  For i = fRow To eRow - 1
    For r = i + 1 To eRow
      If arr(i, 1) > arr(r, 1) Then
        arr(i, 2) = arr(i, 2) + 1
      Else
        arr(r, 2) = arr(r, 2) + 1
      End If
    Next r
  Next i
  tmp = aRow
  For i = fRow To eRow
    aRow(arr(i, 2), 1) = tmp(i, 1)
    aRow(arr(i, 2), 2) = arr(i, 1)
  Next i
  ReDim S(fRow To eRow, 1 To 2)
  tmp = aRow
  k = fRow - 1: k2 = fRow - 1
  For i = fRow To eRow
    If Len(sArr(aRow(i, 1), j)) = n Then
      k = k + 1
      aRow(k, 1) = tmp(i, 1)
      aRow(k, 2) = tmp(i, 2)
    Else
      k2 = k2 + 1
      S(k2, 1) = tmp(i, 1)
      S(k2, 2) = tmp(i, 2)
    End If
  Next i
  If k > fRow Then
    If j = 2 Then
      Call SortChar(1, 1, fRow, k)
    ElseIf j = 1 Then
      Call SortDate(fRow, k)
    End If
  End If
  iChar = Empty: fR = sRow + 1
  If k2 >= fRow Then
    For i = fRow To k2
      k = k + 1
      aRow(k, 1) = S(i, 1)
      aRow(k, 2) = S(i, 2) '*****
      If iChar <> aRow(k, 2) Then
        If fR < k Then
          If j = 2 Then
            Call SortChar(j, n + 1, fR, k - 1)
          ElseIf j = 1 Then
            Call SortDate(fRow, k - 1)
          End If
        End If
        'Call Tam 'oooooo
        fR = k: iChar = aRow(k, 2)
      End If
    Next i
    If fR < k Then
      Call SortChar(j, n + 1, fR, k)
    End If
  End If
End Sub

Private Sub SortDate(ByVal fRow&, ByVal eRow&)
  Dim i&, r&, ngay As Date
  ReDim arr(fRow To eRow)
  For i = fRow To eRow
    arr(i) = fRow
  Next i
  For i = fRow To eRow - 1
    ngay = sArr(aRow(i, 1), 3)
    For r = i + 1 To eRow
      If ngay > sArr(aRow(r, 1), 3) Then
        arr(i) = arr(i) + 1
      Else
        arr(r) = arr(r) + 1
      End If
    Next r
  Next i
  tmp = aRow
  For i = fRow To eRow
    aRow(arr(i), 1) = tmp(i, 1)
  Next i
End Sub

Private Sub AddRes()
  Dim j&, i&
  For i = 1 To sRow
    For j = 1 To 3
      Res(i, j) = sArr(aRow(i, 1), j)
    Next j
  Next i
End Sub
Ví dụ sub gọi function
Mã:
Option Explicit
Dim sArr(), arr(), aRow(), Res(), dic As Object, sRow&, tmp

Sub Main()
  Dim aHoTen(), aNgaySinh(), aKQ, strSort$, eRow&
  With Sheets("Sheet3")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    aHoTen = .Range("A3:A" & eRow).Value
    aNgaySinh = .Range("B3:B" & eRow).Value
    strSort = .Range("E1").Value
    aKQ = SortTenHoNgaySinh(aHoTen, aNgaySinh, strSort)
    .Range("E3").Resize(sRow, 3) = aKQ
  End With
End Sub

Sub Main2()
  Dim aHoTen(), aNgaySinh(), aKQ, strSort$, eRow&
  With Sheets("Sheet4")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    aHoTen = .Range("A3:B" & eRow).Value
    aNgaySinh = .Range("C3:D" & eRow).Value
    strSort = .Range("E1").Value
    aKQ = SortTenHoNgaySinh(aHoTen, aNgaySinh, strSort)
    .Range("E3").Resize(sRow, 3) = aKQ
  End With
End Sub
Xem code vận hành trong file
 

File đính kèm

  • Sort_HoTenNgaySinh.xlsm
    45 KB · Đọc: 53
Mịnh có flie nhiều cột (6 cột): Họ và tên, ngày sinh, lớp, họ tên bó, họ tên mẹ, số điện thoại, muốn sot họ tên hs theo vần a,b,c, mong anh chị giúp đỡ ạ
 

File đính kèm

  • DSSoDienThoaiLienHeHS (1).xlsx
    19.2 KB · Đọc: 9
Lần chỉnh sửa cuối:
Mịnh có flie nhiều cột (6 cột): Họ và tên, ngày sinh, lớp, họ tên bó, họ tên mẹ, số điện thoại, muốn sot họ tên hs theo vần a,b,c, mong anh chị giúp đỡ ạ
Bác thử sử dụng Thủ tục VSORTING hoặc Hàm VSORT trong tệp dưới đây:

Ví dụ:
Gọi hàm dưới đây trong VBA:
Call VSORTING([A4:V1000], Array(1001, 2, 3, 4, 5, 6, 7),True)
Hoặc gõ trong bảng tính: =VSORT(A4:V1000, {1001, 2, 3, 4, 5, 6, 7},True)
{1001, 2, 3, 4, 5, 6, 7} tức là sắp xếp cột 1, rồi đến 2, rồi đến 3, ...
Tham số Cột lớn hơn 1000 thì 1001 là sắp xếp cột 1 của mảng nhập vào, theo thứ tự tên tiếng Việt
Tham số Cột là số âm thì sắp xếp giảm dần.

Call VSORTING(A4:V1000, {1001, 2, 3, 4, 5, 6, 7},True,-1) - đặt tham số màu nhỏ hơn 0 sẽ không tô màu
Call VSORTING(A4:V1000, {1001, 2, 3, 4, 5, 6, 7},True,256,0,65355) - đặt tham số màu nền và màu phông

Nguồn:
 

File đính kèm

  • S_QuickSort_Color.xlsm
    443.5 KB · Đọc: 18
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom