Ứng dụng sắp xếp họ tên tự động xls (2 người xem)

Liên hệ QC

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

duong3000

Thành viên mới
Tham gia
25/8/11
Bài viết
6
Được thích
3
Nhờ các cao thủ giúp làm nhẹ bớt file excel sau ạ:
- Mục đích: File này giúp giáo viên sắp xếp họ tên học sinh để ghi sổ điểm, làm các danh sách lớp, ... một cách tự động
- Yêu cầu: File phải nhẹ, việc sắp xếp phải tự động ạ.
Sử dụng vì mục đích cộng đồng, không cá nhân hóa.
 

File đính kèm

Tôi không có hứng nghiên cứu các công thức của bạn nên tôi tạo tập tin chỉ cho mục đích sắp xếp. Tự điều chỉnh cho nhu cầu của mình.

Mỗi lần có sự thay đổi ở cột A thì kết quả sắp xếp sẽ có ở cột B.

Xem thêm LƯU Ý trong module của sheet1.

Code chính, dùng mỗi khi cần sắp xếp, nằm trong modSort2DArray và vietnamese_convert
 

File đính kèm

Tôi không có hứng nghiên cứu các công thức của bạn nên tôi tạo tập tin chỉ cho mục đích sắp xếp. Tự điều chỉnh cho nhu cầu của mình.

Mỗi lần có sự thay đổi ở cột A thì kết quả sắp xếp sẽ có ở cột B.

Xem thêm LƯU Ý trong module của sheet1.

Code chính, dùng mỗi khi cần sắp xếp, nằm trong modSort2DArray và vietnamese_convert
Cảm ơn bạn đã giúp đỡ. File của bạn rất nhẹ có điều các tên Đức, Định, Đ ... nó chưa xếp đúng ạ
 
Nhờ các cao thủ giúp làm nhẹ bớt file excel sau ạ:
- Mục đích: File này giúp giáo viên sắp xếp họ tên học sinh để ghi sổ điểm, làm các danh sách lớp, ... một cách tự động
- Yêu cầu: File phải nhẹ, việc sắp xếp phải tự động ạ.
Sử dụng vì mục đích cộng đồng, không cá nhân hóa.
Góp thêm một cách cho bạn rộng đường lựa chọn. Hãy thêm dữ liệu vào và chạy thử.
Chúc thành công.

P/S : Code này là sản phẩm cóp nhặt trên diễn đàn của anh NDU, Anh Batman, anh VetMini, Anh HieuCD về chắp vá lại nen có nhiều chỗ lủng củng chạy vòng vèo. Trân trọng cảm ơn các anh chị em trên diễn đàn. Mong Anh chi em có thể xem code và góp ý để hoàn thiện hơn. Nếu có thể anh chị em nào có thời gian viết lại cho ngắn hơn hoặc viết thành hàm mảng thì ứng dụng chắc là nhiều hơn.
Trân trọng.
 

File đính kèm

Góp thêm một cách cho bạn rộng đường lựa chọn. Hãy thêm dữ liệu vào và chạy thử.
Chúc thành công.

P/S : Code này là sản phẩm cóp nhặt trên diễn đàn của anh NDU, Anh Batman, anh VetMini, Anh HieuCD về chắp vá lại nen có nhiều chỗ lủng củng chạy vòng vèo. Trân trọng cảm ơn các anh chị em trên diễn đàn. Mong Anh chi em có thể xem code và góp ý để hoàn thiện hơn. Nếu có thể anh chị em nào có thời gian viết lại cho ngắn hơn hoặc viết thành hàm mảng thì ứng dụng chắc là nhiều hơn.
Trân trọng.
Cảm ơn bạn HUONGHCKT nhé. file của bạn đã xắp sếp đúng rồi ạ, mình rất cảm ơn vì sự giúp đỡ nhiệt tình của bạn.
 
Góp thêm một cách cho bạn rộng đường lựa chọn. Hãy thêm dữ liệu vào và chạy thử.
Chúc thành công.

P/S : Code này là sản phẩm cóp nhặt trên diễn đàn của anh NDU, Anh Batman, anh VetMini, Anh HieuCD về chắp vá lại nen có nhiều chỗ lủng củng chạy vòng vèo. Trân trọng cảm ơn các anh chị em trên diễn đàn. Mong Anh chi em có thể xem code và góp ý để hoàn thiện hơn. Nếu có thể anh chị em nào có thời gian viết lại cho ngắn hơn hoặc viết thành hàm mảng thì ứng dụng chắc là nhiều hơn.
Trân trọng.
trong office 365 có hàm này
=SORT(A2:A32,,1)
 
Cảm ơn bạn đã giúp đỡ. File của bạn rất nhẹ có điều các tên Đức, Định, Đ ... nó chưa xếp đúng ạ
Tôi hiểu sai thôi.
Code của tôi sắp xếp cả họ, tên đệm, tên. Tức sắp xếp họ trước, cùng họ thì sắp xếp theo tên đệm, cùng họ cùng tên đệm thì sắp xếp theo tên.
 
trong office 365 có hàm này
=SORT(A2:A32,,1)
laptop của không cài Office 365, và tôi nghĩ cũng có rất nhiều máy không cài Office 365 bởi có thể họ không quen dùng, hoặc có thể vì trăm ngàn lý do nào đó
Thêm nữa là hàm này cũng quá xa lạ với tôi.
Cảm ơn bạn đã quan tâm
 
Tôi không biết hàm SORT hoạt động thế nào vì tôi không có hàm đó. Nhưng tôi không hâm mộ công cụ sort của Excel.

Về bài #4.

Với A2:A20 là:

Phan Thị Điệu
Võ Ngọc Châu
Lê Điền
Lê Văn Đẳng
Phạm Đây
Nguyễn Thanh Hà
Vũ Thị Điệp
Đỗ Hồng Diễm
Đỗ Đình Diệu
Trịnh Công Hận
Đinh ất
Nguyễn Thị Em
Nguyễn Anh
Lê Anh Diệp
Nguyễn Phước Diện
Lương Văn Hào
Nguyễn Hà
Nguyễn Thanh Hà
Trần Chức

thì sau khi nhấn Run code ta có như hình.

sort.jpg

1. Trong cột O không có Nguyễn Anh, mà có thêm TT phụ 2 TT phụ 3 TT phụ 4. Nguyễn Anh lại ở C1:E1 thay cho TT phụ 2 TT phụ 3 TT phụ 4. Phải chăng code chưa chuẩn?

2. Excel sắp xếp tiếng Việt chưa chuẩn.
Nhìn O2:O18 thấy hơi bị kỳ. Đang Đ (Lê Văn Đẳng, Phạm Đây) thì lại chuyển sang D (Đỗ Hồng Diễm, Nguyễn Phước Diện), rồi lại về Đ (Lê Điền), rồi lại nhẩy về D (Lê Anh Diệp), rổi về Đ (Vũ Thị Điệp), về D (Đỗ Đình Diệu), về Đ (Phan Thị Điệu).

3. Trong cột O có thứ tự
Nguyễn Thanh Hà
Nguyễn Hà
Nguyễn Thanh Hà

Hơi buồn cười. Lẽ ra 2 tên Y NHƯ NHAU (Nguyễn Thanh Hà) phải ở những dòng liên tiếp chứ nhỉ.
------------
Điểm 2 cũng có thể kiểm tra riêng. Lúc đầu B1:B19 Y HỆT A1:A19. Sau khi dùng SORT của Excel thì B1:B19 y như nhận xét ở trên. Như vậy ở đây Excel làm chưa chuẩn chứ không phải do nhầm lẫn của code bài #4.

sapxep.jpg
 
Lần chỉnh sửa cuối:
Tôi không biết hàm SORT hoạt động thế nào vì tôi không có hàm đó. Nhưng tôi không hâm mộ công cụ sort của Excel.

Về bài #4.

Với A2:A20 là:

Phan Thị Điệu
Võ Ngọc Châu
Lê Điền
Lê Văn Đẳng
Phạm Đây
Nguyễn Thanh Hà
Vũ Thị Điệp
Đỗ Hồng Diễm
Đỗ Đình Diệu
Trịnh Công Hận
Đinh ất
Nguyễn Thị Em
Nguyễn Anh
Lê Anh Diệp
Nguyễn Phước Diện
Lương Văn Hào
Nguyễn Hà
Nguyễn Thanh Hà
Trần Chức

thì sau khi nhấn Run code ta có như hình.

View attachment 260914

1. Trong cột O không có Nguyễn Anh, mà có thêm TT phụ 2 TT phụ 3 TT phụ 4. Nguyễn Anh lại ở C1:E1 thay cho TT phụ 2 TT phụ 3 TT phụ 4. Phải chăng code chưa chuẩn?

2. Excel sắp xếp tiếng Việt chưa chuẩn.
Nhìn O2:O18 thấy hơi bị kỳ. Đang Đ (Lê Văn Đẳng, Phạm Đây) thì lại chuyển sang D (Đỗ Hồng Diễm, Nguyễn Phước Diện), rồi lại về Đ (Lê Điền), rồi lại nhẩy về D (Lê Anh Diệp), rổi về Đ (Vũ Thị Điệp), về D (Đỗ Đình Diệu), về Đ (Phan Thị Điệu).

3. Trong cột O có thứ tự
Nguyễn Thanh Hà
Nguyễn Hà
Nguyễn Thanh Hà

Hơi buồn cười. Lẽ ra 2 tên Y NHƯ NHAU (Nguyễn Thanh Hà) phải ở những dòng liên tiếp chứ nhỉ.
------------
Điểm 2 cũng có thể kiểm tra riêng. Lúc đầu B1:B19 Y HỆT A1:A19. Sau khi dùng SORT của Excel thì B1:B19 y như nhận xét ở trên. Như vậy ở đây Excel làm chưa chuẩn chứ không phải do nhầm lẫn của code bài #4.

View attachment 260915
Mình cũng đã thử danh sách của bạn, khi nhấn code 2 lần thì nó sắp xếp khá chính xác, chỉ có điều code đã sử dụng 4 cột phụ để tách họ tên nên hơi bất tiện trong việc điền thông tin phụ. Cảm ơn bạn nhiều.
 

File đính kèm

  • 2021-06-19_204238.png
    2021-06-19_204238.png
    26 KB · Đọc: 7
Nếu code đã sắp xếp được theo ho, tên đệm và tên thì không lý gì lại không sắp xếp được theo tên. Chỉ cần suy nghĩ một chút và viết code thích hợp với yêu cầu ưa thích của mình. Code tổng quát chỉ có 1, mỗi người dùng code đó tùy theo yêu cầu của mình mà viết code thích hợp. Thế thôi.

Nếu bạn không chê code của tôi thì đọc tiếp, ngược lại thì dừng ở đây.

Code dưới đây sắp xếp theo tên. Nếu tên giống nhau thì sắp xếp theo họ + tên đệm.

Với dữ liệu

Phạm Hồng Diệp
Phạm Đình DươngB
Phạm Đình DươngC
Phạm Đình DươngA
Nông Thùy Dương
Nguyễn Tuấn Dương
Vi Đình Dương
Hoàng Trung Định
Nguyễn Phương Đông
Lương Văn Giang
Lê Quỳnh Anh

thì sẽ có sắp xếp theo tên, tiếp theo theo ho + tên đệm (cùng Dương thì theo thự tự Nguyễn Tuấn, Nông Thùy, Vi Đình)

Lê Quỳnh Anh
Phạm Hồng Diệp
Nguyễn Tuấn Dương
Nông Thùy Dương
Vi Đình Dương
Phạm Đình DươngA
Phạm Đình DươngB
Phạm Đình DươngC
Hoàng Trung Định
Nguyễn Phương Đông
Lương Văn Giang

Trong module Sheet1 thay toàn bộ code bài # 2 bằng code sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Long, c As Long, Arr
    If Intersect(Me.Range("A2:A10000"), Target) Is Nothing Then Exit Sub
    Application.EnableEvents = False
    Me.Range("B2:B10000").ClearContents
    Arr = Me.Range("A2:C" & Me.Range("A" & Rows.Count).End(xlUp).Row).Value
    For r = 1 To UBound(Arr)
        c = InStrRev(" " & Arr(r, 1), " ")
        Arr(r, 3) = Mid(Arr(r, 1), c)
        If c < 3 Then
            Arr(r, 2) = ""
        Else
            Arr(r, 2) = Mid(Arr(r, 1), 1, c - 2)
        End If
    Next r
    Me.Range("B2").Resize(UBound(Arr, 1)).Value = Sort2DArray(Arr, 3, True, cc_uni, False, 2, True, cc_uni, False)
    Application.EnableEvents = True
End Sub
 
Nhờ các cao thủ giúp làm nhẹ bớt file excel sau ạ:
- Mục đích: File này giúp giáo viên sắp xếp họ tên học sinh để ghi sổ điểm, làm các danh sách lớp, ... một cách tự động
- Yêu cầu: File phải nhẹ, việc sắp xếp phải tự động ạ.
Sử dụng vì mục đích cộng đồng, không cá nhân hóa.
Sắp xếp họ tên học sinh Việt Nam cho giáo viên có đặc thù riêng và phức tạp
Function SortHoTen chạy trên cơ sở hàm SortArray2D ở trang https://www.giaiphapexcel.com/diendan/threads/function-sort-mảng-2-chiều.155499/
Tham số thứ 3 bABC=true khi danh sách có trùng tên và thêm ký tự "A" "B" hoặc "C" để phân biệt, chỉ xét 3 trường hợp "A" "B" "C", code chưa xét chi tiết nên có thể chưa chính xác 100% và sai sót nếu có cũng không nghiêm trọng
Mã:
Function SortHoTen(ByVal sArr As Variant, Optional bASC As Boolean = True, Optional bABC As Boolean = False) As Variant
'SortHoTen: Sort Ho Ten tieng Viet, ket qua là mang 2 chieu
'sArr co the la Array 2 chieu hoac Range, voi cac dong la HoTen trinh bay tren 1 cot
'bASC mac dinh = true sort A --> Z, bASC = false Z --> A
'bABC = True có trung ho ten và them A, B, hoac C sau ten. bABC mac dinh = False khong co trung ten
  Dim Arr(), tmp$, t$, sRow&, i&, j&, d&
  If TypeName(sArr) = "Range" Then sArr = sArr.Value
  If IsArray(sArr) = False Then
    ReDim Arr(1 To 1, 1 To 1)
    Arr(1, 1) = sArr:    SortHoTen = Arr
    Exit Function
  End If
  sRow = UBound(sArr)
  ReDim Arr(1 To sRow, 1 To 2)
  For i = 1 To sRow
    tmp = Application.Trim(sArr(i, 1))
    j = InStrRev(tmp, " ")
    Arr(i, 2) = Mid(tmp, j + 1, 200)
    If bABC = True Then
      t = Right(tmp, 1): d = Len(Arr(i, 2))
      If d > 1 And t = UCase(t) And InStr(1, "ABC", t) > 0 Then
        Arr(i, 1) = tmp & "||"
        Arr(i, 2) = Mid(Arr(i, 2), 1, Len(Arr(i, 2)) - 1)
      Else
        Arr(i, 1) = Mid(tmp, 1, j - 1)
      End If
    Else
      Arr(i, 1) = Mid(tmp, 1, j - 1)
    End If
  Next i
  If bASC = True Then
    Arr = SortArray2D(Arr, Array(2, 1))
  Else
    Arr = SortArray2D(Arr, Array(-2, -1))
  End If
  For i = 1 To sRow
    If InStr(1, Arr(i, 1), "||") Then
      sArr(i, 1) = Replace(Arr(i, 1), "||", "")
    Else
      sArr(i, 1) = Arr(i, 1) & " " & Arr(i, 2)
    End If
  Next i
  SortHoTen = sArr
End Function
Hàm hàm SortArray2D
Mã:
Option Explicit

Function SortArray2D(ByVal sArr, ByVal aCol, Optional bHeader As Boolean = False) As Variant
  'Sort Mang 2 chieu "sArr" theo nhieu Cot
  'aCol: So hoac Mang so, so duong tu A => Z, so am tu Z => A
  'Ví du aCol:'          2:  Sort theo cot 2 tu A => Z
              '         -3:  Sort theo cot 3 tu Z => A
              'Array(2,-4): (VBA) Sort theo cot 2 tu A => Z va Sort theo cot 4 tu Z => A
              '{2,-4}:      (Cong thuc trong Sheet) Sort theo cot 2 tu A => Z va Sort theo cot 4 tu Z => A
  'bHead = True Du lieu co dong tieu de. Mac dinh bHead = False Du lieu khong co dong tieu de
  Dim aRow, Res()
  Dim sRow&, fRow&, eRow&, fCol&, eCol&, b&, i&, r&, k&, j&
 
  If TypeName(sArr) = "Range" Then sArr = sArr.Value
  If IsArray(sArr) = False Then Exit Function
  fRow = LBound(sArr, 1):   eRow = UBound(sArr, 1)
  fCol = LBound(sArr, 2):   eCol = UBound(sArr, 2)
  If IsArray(aCol) = False Then aCol = Array(aCol) 'Mang thu tu cot Sort
  If bHeader Then b = 1
  sRow = eRow - fRow - b
  ReDim aRow(0 - b To sRow) 'Mang thu tu dong du lieu goc
  For i = fRow To eRow
    aRow(i - fRow - b) = i
  Next i
  Call ChiaDuLieu(aRow, sArr, 0, sRow, aCol(LBound(aCol))) 'Sort theo cot 1
  If UBound(aCol) > LBound(aCol) Then 'Sort theo cac cot ke tiep
    Call DeQui(sArr, aRow, aCol, LBound(aCol) + 1, 0, sRow)
  End If

  k = fRow - 1
  ReDim Res(fRow To eRow, fCol To eCol) 'Mang ket qua
  For i = 0 - b To sRow
    k = k + 1
    r = aRow(i)
    For j = fCol To eCol
      Res(k, j) = sArr(r, j)
    Next j
  Next i
  SortArray2D = Res
End Function

Private Sub DeQui(sArr, aRow, aCol, ByVal n&, ByVal fRow&, ByVal eRow&)
  Dim tmp, tmp2, i&, fR&, jCol&
 
  jCol = Abs(aCol(n - 1)) 'Thu tu cot da Sort truoc
  fR = -1
  tmp = sArr(aRow(fRow), jCol)
  If IsError(tmp) Then tmp = "Error!@#"
  For i = fRow To eRow - 1
    If i > 0 Then tmp = tmp2
    tmp2 = sArr(aRow(i + 1), jCol)
    If IsError(tmp2) Then tmp2 = "Error!@#"
    If fR = -1 Then
      If tmp = tmp2 Then fR = i
    End If
    If fR > -1 Then
      If tmp <> tmp2 Then
        Call ChiaDuLieu(aRow, sArr, fR, i, aCol(n))
        If n < UBound(aCol) Then
          Call DeQui(sArr, aRow, aCol, n + 1, fR, i) 'Sort cot ke tiep
        End If
        fR = -1
      ElseIf i = eRow - 1 Then
        Call ChiaDuLieu(aRow, sArr, fR, eRow, aCol(n))
        If n < UBound(aCol) Then
          Call DeQui(sArr, aRow, aCol, n + 1, fR, eRow) 'Sort cot ke tiep
        End If
      End If
    End If
  Next i
End Sub

Private Sub ChiaDuLieu(aRow, sArr, ByVal fRow&, ByVal eRow&, ByVal jCol&)
  Dim oListStr As Object, oListNum As Object
  Dim aErr, aEmp, aNum, aStr, Arr
  Dim td$, tdUp$, tmp, bASC As Boolean
  Dim i&, n&, k0&, k1&, k2&, k3&
 
  Set oListStr = CreateObject("System.Collections.ArrayList")
  Set oListNum = CreateObject("System.Collections.ArrayList")
  Arr = Array(-1, -1, -1, -1) ' Loi, Rong, So, Chuoi
  td = ChrW(273):       tdUp = ChrW(272)
  bASC = jCol > 0:      jCol = Abs(jCol)
  For n = fRow To eRow 'Dem cac loai du lieu
    tmp = sArr(aRow(n), jCol)
    If IsError(tmp) Then 'du lieu error
      Arr(0) = Arr(0) + 1
    ElseIf IsEmpty(tmp) Then 'du lieu Rong
      Arr(1) = Arr(1) + 1
    ElseIf IsNumeric(tmp) = True Then 'du lieu So
      Arr(2) = Arr(2) + 1
    Else 'du lieu Chuoi
      Arr(3) = Arr(3) + 1
    End If
  Next n
  If Arr(0) >= 0 Then ReDim aErr(0 To Arr(0))
  If Arr(1) >= 0 Then ReDim aEmp(0 To Arr(1))
  If Arr(2) >= 0 Then ReDim aNum(0 To Arr(2))
  If Arr(3) >= 0 Then ReDim aStr(0 To Arr(3))
  For n = fRow To eRow 'Gan cac loai du lieu vao mang tuong ung
    i = aRow(n)
    tmp = sArr(i, jCol)
    If IsError(tmp) Then
      k0 = k0 + 1:  aErr(k0 - 1) = i
    ElseIf IsEmpty(tmp) Then
      k1 = k1 + 1:  aEmp(k1 - 1) = i
    ElseIf IsNumeric(tmp) = True Then
      k2 = k2 + 1:  aNum(k2 - 1) = i
      oListNum.Add tmp
    Else
      If InStr(1, tmp, td, vbBinaryCompare) > 0 Then tmp = Replace(tmp, td, "dzz")
      If InStr(1, tmp, tdUp, vbBinaryCompare) > 0 Then tmp = Replace(tmp, tdUp, "Dzz")
      k3 = k3 + 1:  aStr(k3 - 1) = i
      oListStr.Add tmp
    End If
  Next n
  If k2 > 0 Then aNum = SortRow(oListNum, aNum, bASC) 'Sort du lieu So
  If k3 > 0 Then aStr = SortRow(oListStr, aStr, bASC) 'Sort du lieu Chuoi
  If bASC Then
    Arr = Array(aNum, aStr, aErr, aEmp) ' So, Chuoi, Loi, Rong
  Else
    Arr = Array(aStr, aNum, aErr, aEmp) ' Chuoi, So, Loi, Rong
  End If
  k1 = fRow - 1
  For n = 0 To 3
    If IsArray(Arr(n)) Then
      For i = 0 To UBound(Arr(n))
        k1 = k1 + 1
        aRow(k1) = Arr(n)(i)
      Next i
    End If
  Next n
  Set oListNum = Nothing:   Set oListStr = Nothing
End Sub

Private Function SortRow(tList, aSort, bASC) As Variant
  Dim Arr(), i&, k&, r&, tmp, oList As Object
 
  On Error Resume Next
  ReDim Arr(0 To UBound(aSort))
  Set oList = tList.Clone
  tList.Sort
  If bASC = False Then tList.Reverse
  For i = 0 To tList.Count - 1
    tmp = tList.Item(i)
    r = oList.IndexOf(tmp, 0)
    If tmp = tList.Item(i + 1) Then oList.Item(r) = Empty
      k = k + 1
      Arr(k - 1) = aSort(r)
  Next i
  SortRow = Arr
  Set oList = Nothing
End Function
Code minh họa sort họ tên
Mã:
Sub Main()
  Dim sArr
  With Sheets("S")
    sArr = .Range("A2", .Range("A" & Rows.Count).End(xlUp)).Value
    sArr = SortHoTen(sArr, 1,1)
    .Range("O2").Resize(UBound(sArr)) = sArr
  End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Nếu code đã sắp xếp được theo ho, tên đệm và tên thì không lý gì lại không sắp xếp được theo tên. Chỉ cần suy nghĩ một chút và viết code thích hợp với yêu cầu ưa thích của mình. Code tổng quát chỉ có 1, mỗi người dùng code đó tùy theo yêu cầu của mình mà viết code thích hợp. Thế thôi.

Nếu bạn không chê code của tôi thì đọc tiếp, ngược lại thì dừng ở đây.

Code dưới đây sắp xếp theo tên. Nếu tên giống nhau thì sắp xếp theo họ + tên đệm.

Với dữ liệu

Phạm Hồng Diệp
Phạm Đình DươngB
Phạm Đình DươngC
Phạm Đình DươngA
Nông Thùy Dương
Nguyễn Tuấn Dương
Vi Đình Dương
Hoàng Trung Định
Nguyễn Phương Đông
Lương Văn Giang
Lê Quỳnh Anh

thì sẽ có sắp xếp theo tên, tiếp theo theo ho + tên đệm (cùng Dương thì theo thự tự Nguyễn Tuấn, Nông Thùy, Vi Đình)

Lê Quỳnh Anh
Phạm Hồng Diệp
Nguyễn Tuấn Dương
Nông Thùy Dương
Vi Đình Dương
Phạm Đình DươngA
Phạm Đình DươngB
Phạm Đình DươngC
Hoàng Trung Định
Nguyễn Phương Đông
Lương Văn Giang

Trong module Sheet1 thay toàn bộ code bài # 2 bằng code sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Long, c As Long, Arr
    If Intersect(Me.Range("A2:A10000"), Target) Is Nothing Then Exit Sub
    Application.EnableEvents = False
    Me.Range("B2:B10000").ClearContents
    Arr = Me.Range("A2:C" & Me.Range("A" & Rows.Count).End(xlUp).Row).Value
    For r = 1 To UBound(Arr)
        c = InStrRev(" " & Arr(r, 1), " ")
        Arr(r, 3) = Mid(Arr(r, 1), c)
        If c < 3 Then
            Arr(r, 2) = ""
        Else
            Arr(r, 2) = Mid(Arr(r, 1), 1, c - 2)
        End If
    Next r
    Me.Range("B2").Resize(UBound(Arr, 1)).Value = Sort2DArray(Arr, 3, True, cc_uni, False, 2, True, cc_uni, False)
    Application.EnableEvents = True
End Sub
Dựa vào bài #2 của bạn mình đã sử dụng hàm để đổi tên lên đầu sau đó đến họ và đệm và code của bạn đã xếp ok. Cảm ơn bạn nhiều.
Bài đã được tự động gộp:

Sắp xếp họ tên học sinh Việt Nam cho giáo viên có đặc thù riêng và phức tạp
Function SortHoTen chạy trên cơ sở hàm SortArray2D ở trang https://www.giaiphapexcel.com/diendan/threads/function-sort-mảng-2-chiều.155499/
Tham số thứ 3 bABC=true khi danh sách có trùng tên và thêm ký tự "A" "B" hoặc "C" để phân biệt, chỉ xét 3 trường hợp "A" "B" "C", code chưa xét chi tiết nên có thể chưa chính xác 100% và sai sót nếu có cũng không nghiêm trọng
Mã:
Function SortHoTen(ByVal sArr As Variant, Optional bASC As Boolean = True, Optional bABC As Boolean = False) As Variant
'SortHoTen: Sort Ho Ten tieng Viet, ket qua là mang 2 chieu
'sArr co the la Array 2 chieu hoac Range, voi cac dong la HoTen trinh bay tren 1 cot
'bASC mac dinh = true sort A --> Z, bASC = false Z --> A
'bABC = True có trung ho ten và them A, B, hoac C sau ten. bABC mac dinh = False khong co trung ten
  Dim Arr(), tmp$, t$, sRow&, i&, j&, d&
  If TypeName(sArr) = "Range" Then sArr = sArr.Value
  If IsArray(sArr) = False Then
    ReDim Arr(1 To 1, 1 To 1)
    Arr(1, 1) = sArr:    SortHoTen = Arr
    Exit Function
  End If
  sRow = UBound(sArr)
  ReDim Arr(1 To sRow, 1 To 2)
  For i = 1 To sRow
    tmp = Application.Trim(sArr(i, 1))
    j = InStrRev(tmp, " ")
    Arr(i, 2) = Mid(tmp, j + 1, 200)
    If bABC = True Then
      t = Right(tmp, 1): d = Len(Arr(i, 2))
      If d > 1 And t = UCase(t) And InStr(1, "ABC", t) > 0 Then
        Arr(i, 1) = tmp & "||"
        Arr(i, 2) = Mid(Arr(i, 2), 1, Len(Arr(i, 2)) - 1)
      Else
        Arr(i, 1) = Mid(tmp, 1, j - 1)
      End If
    Else
      Arr(i, 1) = Mid(tmp, 1, j - 1)
    End If
  Next i
  If bASC = True Then
    Arr = SortArray2D(Arr, Array(2, 1))
  Else
    Arr = SortArray2D(Arr, Array(-2, -1))
  End If
  For i = 1 To sRow
    If InStr(1, Arr(i, 1), "||") Then
      sArr(i, 1) = Replace(Arr(i, 1), "||", "")
    Else
      sArr(i, 1) = Arr(i, 1) & " " & Arr(i, 2)
    End If
  Next i
  SortHoTen = sArr
End Function
Hàm hàm SortArray2D
Mã:
Option Explicit

Function SortArray2D(ByVal sArr, ByVal aCol, Optional bHeader As Boolean = False) As Variant
  'Sort Mang 2 chieu "sArr" theo nhieu Cot
  'aCol: So hoac Mang so, so duong tu A => Z, so am tu Z => A
  'Ví du aCol:'          2:  Sort theo cot 2 tu A => Z
              '         -3:  Sort theo cot 3 tu Z => A
              'Array(2,-4): (VBA) Sort theo cot 2 tu A => Z va Sort theo cot 4 tu Z => A
              '{2,-4}:      (Cong thuc trong Sheet) Sort theo cot 2 tu A => Z va Sort theo cot 4 tu Z => A
  'bHead = True Du lieu co dong tieu de. Mac dinh bHead = False Du lieu khong co dong tieu de
  Dim aRow, Res()
  Dim sRow&, fRow&, eRow&, fCol&, eCol&, b&, i&, r&, k&, j&
 
  If TypeName(sArr) = "Range" Then sArr = sArr.Value
  If IsArray(sArr) = False Then Exit Function
  fRow = LBound(sArr, 1):   eRow = UBound(sArr, 1)
  fCol = LBound(sArr, 2):   eCol = UBound(sArr, 2)
  If IsArray(aCol) = False Then aCol = Array(aCol) 'Mang thu tu cot Sort
  If bHeader Then b = 1
  sRow = eRow - fRow - b
  ReDim aRow(0 - b To sRow) 'Mang thu tu dong du lieu goc
  For i = fRow To eRow
    aRow(i - fRow - b) = i
  Next i
  Call ChiaDuLieu(aRow, sArr, 0, sRow, aCol(LBound(aCol))) 'Sort theo cot 1
  If UBound(aCol) > LBound(aCol) Then 'Sort theo cac cot ke tiep
    Call DeQui(sArr, aRow, aCol, LBound(aCol) + 1, 0, sRow)
  End If

  k = fRow - 1
  ReDim Res(fRow To eRow, fCol To eCol) 'Mang ket qua
  For i = 0 - b To sRow
    k = k + 1
    r = aRow(i)
    For j = fCol To eCol
      Res(k, j) = sArr(r, j)
    Next j
  Next i
  SortArray2D = Res
End Function

Private Sub DeQui(sArr, aRow, aCol, ByVal n&, ByVal fRow&, ByVal eRow&)
  Dim tmp, tmp2, i&, fR&, jCol&
 
  jCol = Abs(aCol(n - 1)) 'Thu tu cot da Sort truoc
  fR = -1
  tmp = sArr(aRow(fRow), jCol)
  If IsError(tmp) Then tmp = "Error!@#"
  For i = fRow To eRow - 1
    If i > 0 Then tmp = tmp2
    tmp2 = sArr(aRow(i + 1), jCol)
    If IsError(tmp2) Then tmp2 = "Error!@#"
    If fR = -1 Then
      If tmp = tmp2 Then fR = i
    End If
    If fR > -1 Then
      If tmp <> tmp2 Then
        Call ChiaDuLieu(aRow, sArr, fR, i, aCol(n))
        If n < UBound(aCol) Then
          Call DeQui(sArr, aRow, aCol, n + 1, fR, i) 'Sort cot ke tiep
        End If
        fR = -1
      ElseIf i = eRow - 1 Then
        Call ChiaDuLieu(aRow, sArr, fR, eRow, aCol(n))
        If n < UBound(aCol) Then
          Call DeQui(sArr, aRow, aCol, n + 1, fR, eRow) 'Sort cot ke tiep
        End If
      End If
    End If
  Next i
End Sub

Private Sub ChiaDuLieu(aRow, sArr, ByVal fRow&, ByVal eRow&, ByVal jCol&)
  Dim oListStr As Object, oListNum As Object
  Dim aErr, aEmp, aNum, aStr, Arr
  Dim td$, tdUp$, tmp, bASC As Boolean
  Dim i&, n&, k0&, k1&, k2&, k3&
 
  Set oListStr = CreateObject("System.Collections.ArrayList")
  Set oListNum = CreateObject("System.Collections.ArrayList")
  Arr = Array(-1, -1, -1, -1) ' Loi, Rong, So, Chuoi
  td = ChrW(273):       tdUp = ChrW(272)
  bASC = jCol > 0:      jCol = Abs(jCol)
  For n = fRow To eRow 'Dem cac loai du lieu
    tmp = sArr(aRow(n), jCol)
    If IsError(tmp) Then 'du lieu error
      Arr(0) = Arr(0) + 1
    ElseIf IsEmpty(tmp) Then 'du lieu Rong
      Arr(1) = Arr(1) + 1
    ElseIf IsNumeric(tmp) = True Then 'du lieu So
      Arr(2) = Arr(2) + 1
    Else 'du lieu Chuoi
      Arr(3) = Arr(3) + 1
    End If
  Next n
  If Arr(0) >= 0 Then ReDim aErr(0 To Arr(0))
  If Arr(1) >= 0 Then ReDim aEmp(0 To Arr(1))
  If Arr(2) >= 0 Then ReDim aNum(0 To Arr(2))
  If Arr(3) >= 0 Then ReDim aStr(0 To Arr(3))
  For n = fRow To eRow 'Gan cac loai du lieu vao mang tuong ung
    i = aRow(n)
    tmp = sArr(i, jCol)
    If IsError(tmp) Then
      k0 = k0 + 1:  aErr(k0 - 1) = i
    ElseIf IsEmpty(tmp) Then
      k1 = k1 + 1:  aEmp(k1 - 1) = i
    ElseIf IsNumeric(tmp) = True Then
      k2 = k2 + 1:  aNum(k2 - 1) = i
      oListNum.Add tmp
    Else
      If InStr(1, tmp, td, vbBinaryCompare) > 0 Then tmp = Replace(tmp, td, "dzz")
      If InStr(1, tmp, tdUp, vbBinaryCompare) > 0 Then tmp = Replace(tmp, tdUp, "Dzz")
      k3 = k3 + 1:  aStr(k3 - 1) = i
      oListStr.Add tmp
    End If
  Next n
  If k2 > 0 Then aNum = SortRow(oListNum, aNum, bASC) 'Sort du lieu So
  If k3 > 0 Then aStr = SortRow(oListStr, aStr, bASC) 'Sort du lieu Chuoi
  If bASC Then
    Arr = Array(aNum, aStr, aErr, aEmp) ' So, Chuoi, Loi, Rong
  Else
    Arr = Array(aStr, aNum, aErr, aEmp) ' Chuoi, So, Loi, Rong
  End If
  k1 = fRow - 1
  For n = 0 To 3
    If IsArray(Arr(n)) Then
      For i = 0 To UBound(Arr(n))
        k1 = k1 + 1
        aRow(k1) = Arr(n)(i)
      Next i
    End If
  Next n
  Set oListNum = Nothing:   Set oListStr = Nothing
End Sub

Private Function SortRow(tList, aSort, bASC) As Variant
  Dim Arr(), i&, k&, r&, tmp, oList As Object
 
  On Error Resume Next
  ReDim Arr(0 To UBound(aSort))
  Set oList = tList.Clone
  tList.Sort
  If bASC = False Then tList.Reverse
  For i = 0 To tList.Count - 1
    tmp = tList.Item(i)
    r = oList.IndexOf(tmp, 0)
    If tmp = tList.Item(i + 1) Then oList.Item(r) = Empty
      k = k + 1
      Arr(k - 1) = aSort(r)
  Next i
  SortRow = Arr
  Set oList = Nothing
End Function
Code minh họa sort họ tên
Mã:
Sub Main()
  Dim sArr
  With Sheets("S")
    sArr = .Range("A2", .Range("A" & Rows.Count).End(xlUp)).Value
    sArr = SortHoTen(sArr, 1,1)
    .Range("O2").Resize(UBound(sArr)) = sArr
  End With
End Sub
Cảm ơn bạn HieuCD đã giúp đỡ ạ. File của bạn đã đáp ứng đúng những điều mà mình đang cần. Còn một chỗ nhỏ là nếu chỉ có tên thôi hoặc trống một dòng thì file sẽ báo lỗi ạ.
 

File đính kèm

  • 2021-06-20_142651.jpg
    2021-06-20_142651.jpg
    129.3 KB · Đọc: 8
Lần chỉnh sửa cuối:
Dựa vào bài #2 của bạn mình đã sử dụng hàm để đổi tên lên đầu sau đó đến họ và đệm và code của bạn đã xếp ok. Cảm ơn bạn nhiều.
Bài đã được tự động gộp:


Cảm ơn bạn HieuCD đã giúp đỡ ạ. File của bạn đã đáp ứng đúng những điều mà mình đang cần. Còn một chỗ nhỏ là nếu chỉ có tên thôi hoặc trống một dòng thì file sẽ báo lỗi ạ.
Chỉnh lại Function SortHoTen
Mã:
Function SortHoTen(ByVal sArr As Variant, Optional bASC As Boolean = True, Optional bABC As Boolean = False) As Variant
'SortHoTen: Sort Ho Ten tieng Viet, ket qua là mang 2 chieu
'sArr co the la Array 2 chieu hoac Range, voi cac dong la HoTen trinh bay tren 1 cot
'bASC mac dinh = true sort A --> Z, bASC = false Z --> A
'bABC = True có trung ho ten và them A, B, hoac C sau ten. bABC mac dinh = False khong co trung ten
  Dim Arr(), tmp$, t$, sRow&, i&, j&, d&
  If TypeName(sArr) = "Range" Then sArr = sArr.Value
  If IsArray(sArr) = False Then
    ReDim Arr(1 To 1, 1 To 1)
    Arr(1, 1) = sArr:    SortHoTen = Arr
    Exit Function
  End If
  sRow = UBound(sArr)
  ReDim Arr(1 To sRow, 1 To 2)
  For i = 1 To sRow
    tmp = Application.Trim(sArr(i, 1))
    If tmp <> Empty Then
      j = InStrRev(tmp, " ")
      Arr(i, 2) = Mid(tmp, j + 1, 200)
      If bABC = True Then
        t = Right(tmp, 1): d = Len(Arr(i, 2))
        If d > 1 And t = UCase(t) And InStr(1, "ABC", t) > 0 Then
          Arr(i, 1) = tmp & "||"
          Arr(i, 2) = Mid(Arr(i, 2), 1, Len(Arr(i, 2)) - 1)
        Else
          If j > 0 Then Arr(i, 1) = Mid(tmp, 1, j - 1)
        End If
      Else
        If j > 0 Then Arr(i, 1) = Mid(tmp, 1, j - 1)
      End If
    End If
  Next i
  If bASC = True Then
    Arr = SortArray2D(Arr, Array(2, 1))
  Else
    Arr = SortArray2D(Arr, Array(-2, -1))
  End If
  For i = 1 To sRow
    If InStr(1, Arr(i, 1), "||") Then
      sArr(i, 1) = Replace(Arr(i, 1), "||", "")
    Else
      If Arr(i, 1) = Empty Then
        sArr(i, 1) = Arr(i, 2)
      Else
        sArr(i, 1) = Arr(i, 1) & " " & Arr(i, 2)
      End If
    End If
  Next i
  SortHoTen = sArr
End Function
 
Chỉnh lại Function SortHoTen
Mã:
Function SortHoTen(ByVal sArr As Variant, Optional bASC As Boolean = True, Optional bABC As Boolean = False) As Variant
'SortHoTen: Sort Ho Ten tieng Viet, ket qua là mang 2 chieu
'sArr co the la Array 2 chieu hoac Range, voi cac dong la HoTen trinh bay tren 1 cot
'bASC mac dinh = true sort A --> Z, bASC = false Z --> A
'bABC = True có trung ho ten và them A, B, hoac C sau ten. bABC mac dinh = False khong co trung ten
  Dim Arr(), tmp$, t$, sRow&, i&, j&, d&
  If TypeName(sArr) = "Range" Then sArr = sArr.Value
  If IsArray(sArr) = False Then
    ReDim Arr(1 To 1, 1 To 1)
    Arr(1, 1) = sArr:    SortHoTen = Arr
    Exit Function
  End If
  sRow = UBound(sArr)
  ReDim Arr(1 To sRow, 1 To 2)
  For i = 1 To sRow
    tmp = Application.Trim(sArr(i, 1))
    If tmp <> Empty Then
      j = InStrRev(tmp, " ")
      Arr(i, 2) = Mid(tmp, j + 1, 200)
      If bABC = True Then
        t = Right(tmp, 1): d = Len(Arr(i, 2))
        If d > 1 And t = UCase(t) And InStr(1, "ABC", t) > 0 Then
          Arr(i, 1) = tmp & "||"
          Arr(i, 2) = Mid(Arr(i, 2), 1, Len(Arr(i, 2)) - 1)
        Else
          If j > 0 Then Arr(i, 1) = Mid(tmp, 1, j - 1)
        End If
      Else
        If j > 0 Then Arr(i, 1) = Mid(tmp, 1, j - 1)
      End If
    End If
  Next i
  If bASC = True Then
    Arr = SortArray2D(Arr, Array(2, 1))
  Else
    Arr = SortArray2D(Arr, Array(-2, -1))
  End If
  For i = 1 To sRow
    If InStr(1, Arr(i, 1), "||") Then
      sArr(i, 1) = Replace(Arr(i, 1), "||", "")
    Else
      If Arr(i, 1) = Empty Then
        sArr(i, 1) = Arr(i, 2)
      Else
        sArr(i, 1) = Arr(i, 1) & " " & Arr(i, 2)
      End If
    End If
  Next i
  SortHoTen = sArr
End Function
Tuyệt vời. Thật vô cùng tiện ích cho những ai mà phải sắp xếp danh sách họ tên Tiếng Việt (các thầy cô giáo của các cấp học...).
Nhưng tôi thiết nghĩ rằng: nếu được anh hoặc các anh chị em khác cải tiến nâng cấp lên:
1/Thành một hàm mảng (Ví dụ: là chỉ cần đặt công thức SorttHoTen(A2:A...,true) vào ô O2 và Enter là được một danh sách đã sắp xếp theo trật tự ABC dán đầy vào các ô từ O2 đến O...). Bởi vì có rất nhiều người không biết gì về VBA, họ sẽ không biết làm thế nào để mở của sổ VBE, để tạo một button gắn vơi Sub, chạy Sub, hoặc Worksheet_Change...., thứ nữa là công thức hoặc sub, hoặc gắn với sự kiện Worksheet_Change thì cũng chỉ có dùng được trên một Workbook, các Workbook khác không dùng được. Nếu muốn dùng cho Workbook khác lại phải mất công sao chép là mã nguồn VBA...
2/ Nâng cấp lên thành một Add-in để có thể cài đặt vào máy tính và sử dụng công thức mảng như đã nói ở trên. để có thể sử dụng đước tất cả các file Excel. bởi những lý do đã nêu ở (1).
......
Tôi tin là nếu cải tiến và nâng cấp thành một Add-In (công thức mảng) thì sẽ là điều vô cùng thích và tiện lợi đối với những ai phải thường xuyên sắp xếp danh sách họ tên( nhất là những danh sách họ tên dài, nhiều danh sách cần sắp xếp nằm ở nhiều Sheet, nhiều Workbook , nhiều File Excel.... khác nhau). Nó kiểu như kế toán gặp được add-in đổi số ra chữ ấy.
Mong anh HieuCD và các anh chị em khác trên diễn đàn lưu tâm.
Mạo muội góp ý, có gì sai sót, xin được bỏ qua.
Trân trọng.
 
Chỉnh lại Function SortHoTen
Mã:
Function SortHoTen(ByVal sArr As Variant, Optional bASC As Boolean = True, Optional bABC As Boolean = False) As Variant
'SortHoTen: Sort Ho Ten tieng Viet, ket qua là mang 2 chieu
'sArr co the la Array 2 chieu hoac Range, voi cac dong la HoTen trinh bay tren 1 cot
'bASC mac dinh = true sort A --> Z, bASC = false Z --> A
'bABC = True có trung ho ten và them A, B, hoac C sau ten. bABC mac dinh = False khong co trung ten
  Dim Arr(), tmp$, t$, sRow&, i&, j&, d&
  If TypeName(sArr) = "Range" Then sArr = sArr.Value
  If IsArray(sArr) = False Then
    ReDim Arr(1 To 1, 1 To 1)
    Arr(1, 1) = sArr:    SortHoTen = Arr
    Exit Function
  End If
  sRow = UBound(sArr)
  ReDim Arr(1 To sRow, 1 To 2)
  For i = 1 To sRow
    tmp = Application.Trim(sArr(i, 1))
    If tmp <> Empty Then
      j = InStrRev(tmp, " ")
      Arr(i, 2) = Mid(tmp, j + 1, 200)
      If bABC = True Then
        t = Right(tmp, 1): d = Len(Arr(i, 2))
        If d > 1 And t = UCase(t) And InStr(1, "ABC", t) > 0 Then
          Arr(i, 1) = tmp & "||"
          Arr(i, 2) = Mid(Arr(i, 2), 1, Len(Arr(i, 2)) - 1)
        Else
          If j > 0 Then Arr(i, 1) = Mid(tmp, 1, j - 1)
        End If
      Else
        If j > 0 Then Arr(i, 1) = Mid(tmp, 1, j - 1)
      End If
    End If
  Next i
  If bASC = True Then
    Arr = SortArray2D(Arr, Array(2, 1))
  Else
    Arr = SortArray2D(Arr, Array(-2, -1))
  End If
  For i = 1 To sRow
    If InStr(1, Arr(i, 1), "||") Then
      sArr(i, 1) = Replace(Arr(i, 1), "||", "")
    Else
      If Arr(i, 1) = Empty Then
        sArr(i, 1) = Arr(i, 2)
      Else
        sArr(i, 1) = Arr(i, 1) & " " & Arr(i, 2)
      End If
    End If
  Next i
  SortHoTen = sArr
End Function
Đã OK rồi ạ. Cảm ơn chuyên gia HieuCD. Cảm ơn tất cả mọi người đã nhiệt tình giúp đỡ ạ
 
Tuyệt vời. Thật vô cùng tiện ích cho những ai mà phải sắp xếp danh sách họ tên Tiếng Việt (các thầy cô giáo của các cấp học...).
Nhưng tôi thiết nghĩ rằng: nếu được anh hoặc các anh chị em khác cải tiến nâng cấp lên:
1/Thành một hàm mảng (Ví dụ: là chỉ cần đặt công thức SorttHoTen(A2:A...,true) vào ô O2 và Enter là được một danh sách đã sắp xếp theo trật tự ABC dán đầy vào các ô từ O2 đến O...). Bởi vì có rất nhiều người không biết gì về VBA, họ sẽ không biết làm thế nào để mở của sổ VBE, để tạo một button gắn vơi Sub, chạy Sub, hoặc Worksheet_Change...., thứ nữa là công thức hoặc sub, hoặc gắn với sự kiện Worksheet_Change thì cũng chỉ có dùng được trên một Workbook, các Workbook khác không dùng được. Nếu muốn dùng cho Workbook khác lại phải mất công sao chép là mã nguồn VBA...
2/ Nâng cấp lên thành một Add-in để có thể cài đặt vào máy tính và sử dụng công thức mảng như đã nói ở trên. để có thể sử dụng đước tất cả các file Excel. bởi những lý do đã nêu ở (1).
......
Tôi tin là nếu cải tiến và nâng cấp thành một Add-In (công thức mảng) thì sẽ là điều vô cùng thích và tiện lợi đối với những ai phải thường xuyên sắp xếp danh sách họ tên( nhất là những danh sách họ tên dài, nhiều danh sách cần sắp xếp nằm ở nhiều Sheet, nhiều Workbook , nhiều File Excel.... khác nhau). Nó kiểu như kế toán gặp được add-in đổi số ra chữ ấy.
Mong anh HieuCD và các anh chị em khác trên diễn đàn lưu tâm.
Mạo muội góp ý, có gì sai sót, xin được bỏ qua.
Trân trọng.
Bạn tham khảo cách này xem
 
Bạn tham khảo cách này xem
Cảm ơn anh đã chia sẻ kiến thức, Nhưng nói ra thì xấu hổ chứ thực ra trình độ VBA của tôi chỉ là gà mờ , a bờ cờ thôi, tự học lỏm trên diễn đàn và thấy mình cũng đam mê với VBA và học mãi mà chẳng thấy có chút tiến bộ nào. Nói thât lòng là nhiều khi tôi xem công thức của các anh em giúp người này người nọ mà tôi còn chẳng biết gì, hay là nhiều lần tôi đọc code của các thành viên trên diễn đàn còn chẳng hiểu chút gì nữa là làm được những việc to tát như viết hàm UDF.... Ngựa non nên nhiều khi cũng có đăng trả lời gọi là "giúp người cũng chính là giúp mình" ấy mà, Mà chẳng biết trong những lần như vậy đã có lần nào mạo phạm với các anh chị em chưa(tin chắc là không thể không có). Nhân đây, cũng mong được anh em lượng thứ.
Dẫu sao thì tôi vẫn cứ hy vọng có một ngày nào đó mình sẽ được tiếp cận với Add-in hàm mảng về sắp xếp tên tiếng việt, mặc dù tôi cũng chẳng thấy mình có nhu cầu để sử dụng add-in đó
 
Lần chỉnh sửa cuối:
"Thành một hàm mảng (Ví dụ: là chỉ cần đặt công thức SorttHoTen(A2:A...,true) vào ô O2 và Enter là được một danh sách đã sắp xếp theo trật tự ABC dán đầy vào các ô từ O2 đến O...)"

Bạn muốn như vậy thì tôi chỉ cách áp dụng cho nó ra như vậy, chứ tôi đâu bảo bạn làm chuyện người ta đã làm rồi. Còn chuyện hàm người dùng thì buộc phải chép code VBA sang máy khác thôi chứ đâu có cách gì. Add-Ins thì cũng phải chép code hoặc/và cài đặt.
 
"Thành một hàm mảng (Ví dụ: là chỉ cần đặt công thức SorttHoTen(A2:A...,true) vào ô O2 và Enter là được một danh sách đã sắp xếp theo trật tự ABC dán đầy vào các ô từ O2 đến O...)"

Bạn muốn như vậy thì tôi chỉ cách áp dụng cho nó ra như vậy, chứ tôi đâu bảo bạn làm chuyện người ta đã làm rồi.
Cảm ơn bạn đã chỉ giáo. Bạn có thể cho tôi đường dẫn đến hàm mảng sắp xếp tiếng việt nhé. Để tôi học hỏi thêm. Trân trọng cảm ơn bạn!
Add-Ins thì cũng phải chép code hoặc/và cài đặt.
Tôi thì nghĩ rằng: Add-in cài trên máy một lần nhưng có thể sử dụng mãi mãi cho tất cả các file excel, như thế ứng dụng sẽ phát huy được tối đa tác dụng đối với người dùng.
Kiến thức nông cạn, không biết có đúng không? nếu có sai xin được cảm thông!
Mặc dù không thấy có nhu cầu sử dụng cả ở hiện tại và tương lai nhưng tôi vẫn hy vọng và muốn được tiếp cận với Add-in sắp xếp tiếng Việt.
 
Web KT

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

Back
Top Bottom