Xin các cao thủ viết dùm e đoạn code tạo mã nhân viên với điều kiện e đã ghi trong file đính kèm! Thanks.
Function NameSplit(ByVal FullName As String, ByVal lType As Long) As String
Dim tmpArr, Arr()
Dim Item1 As String, Item2 As String, Item3 As String, tmp As String
Dim i As Long, n As Long
''lType = 1 <==> Lay HO
''lType = 2 <==> Lay TÊN LÓT
''lType = 3 <==> Lay TÊN
On Error Resume Next
FullName = Trim(FullName)
If Len(FullName) Then
tmpArr = Split(FullName, " ")
Item3 = tmpArr(UBound(tmpArr))
Item1 = tmpArr(0)
Select Case lType
Case 1: NameSplit = IIf(UBound(tmpArr) > 0, Item1, "")
Case 2
If UBound(tmpArr) > 1 Then
For i = 1 To UBound(tmpArr) - 1
tmp = Trim(CStr(tmpArr(i)))
If Len(tmp) > 0 Then
n = n + 1
ReDim Preserve Arr(1 To n)
Arr(n) = tmp
End If
Next
If n Then NameSplit = Join(Arr, " ")
End If
Case 3: NameSplit = Item3
End Select
End If
End Function
Function RemoveMarks(ByVal Text As String) As String
Dim CharCode, i As Long
Dim ResText As String, sTmp As String
On Error Resume Next
sTmp = Text
CharCode = Array(7855, 7857, 7859, 7861, 7863, 7845, 7847, 7849, 7851, 7853, 225, _
224, 7843, 227, 7841, 259, 226, 273, 7871, 7873, 7875, 7877, 7879, _
233, 232, 7867, 7869, 7865, 234, 237, 236, 7881, 297, 7883, 7889, _
7891, 7893, 7895, 7897, 7899, 7901, 7903, 7905, 7907, 243, 242, _
7887, 245, 7885, 244, 417, 7913, 7915, 7917, 7919, 7921, 250, _
249, 7911, 361, 7909, 432, 253, 7923, 7927, 7929, 7925)
ResText = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyy"
For i = 0 To UBound(CharCode)
sTmp = Replace(sTmp, ChrW(CharCode(i)), Mid(ResText, i + 1, 1))
sTmp = Replace(sTmp, UCase(ChrW(CharCode(i))), UCase(Mid(ResText, i + 1, 1)))
Next
RemoveMarks = sTmp
End Function
Sub Main()
Dim sArray, Arr()
Dim i As Long, n As Long
Dim lastName As String, tmp As String
On Error Resume Next
With Sheets("Sheet1").Range("A3:A1000")
sArray = .Value
ReDim Arr(1 To UBound(sArray), 1 To 1)
With CreateObject("Scripting.Dictionary")
For i = 1 To UBound(sArray)
tmp = Trim(CStr(sArray(i, 1)))
If Len(tmp) Then
lastName = UCase(NameSplit(tmp, 3))
lastName = Trim(RemoveMarks(lastName))
If Not .Exists(lastName) Then
.Add lastName, 1
Arr(i, 1) = lastName & 1
Else
.Item(lastName) = .Item(lastName) + 1
Arr(i, 1) = lastName & .Item(lastName)
End If
End If
Next
End With
.Offset(, 1).Value = Arr
End With
End Sub
Lại nhờ thêm chút nữa ! Bạn đưa code chạy tốt lắm mà do mình không biết về VB nên chưa tự sửa được theo ý. Bạn có thể viết lại theo dạng tạo 1 hàm cho mình xài - hàm(). để có thể chủ động hơn. Thanks.
Function TachHoTen(ByVal strData As String, Optional ByVal retType As Integer = 3) As String
Dim RE As Object, REMatches As Object
If retType < 1 Or retType > 3 Then
TachHoTen = "khong co cach tach loai " & retType
Exit Function
End If
Set RE = CreateObject("vbscript.regexp")
With RE
.MultiLine = False
.Global = True
.IgnoreCase = True
.Pattern = "^([^\s]+\s+)?(.+\s)*([^\s]+$)"
End With
Set REMatches = RE.Execute(WorksheetFunction.Trim(strData))
If REMatches.Count > 0 Then
TachHoTen = Trim(REMatches.Item(0).submatches(retType - 1))
Else
TachHoTen = ""
End If
End Function
Cảm ơn bạn đã quan tâm và gợi ý cho mình.Xin gợi ý bạn bộ mã học sinh như sau:
PHP:' [ATTACH=full]194316[/ATTACH]
Xin cảm ơn bạn đã nhiệt tình giúp đỡ.Macro sẽ tạo giúp bạn cột "Mã 03" & sắp xếp theo thứ tự tăng dần của cột này;
Cột 'Mã 05' do công thức tạo nên
Trước tiên bạn cần 2 hàm hổ trợ
1> Hàm tách tên:
2> Hàm loại dấu tiếng ViệtPHP:Function NameSplit(ByVal FullName As String, ByVal lType As Long) As String Dim tmpArr, Arr() Dim Item1 As String, Item2 As String, Item3 As String, tmp As String Dim i As Long, n As Long ''lType = 1 <==> Lay HO ''lType = 2 <==> Lay TÊN LÓT ''lType = 3 <==> Lay TÊN On Error Resume Next FullName = Trim(FullName) If Len(FullName) Then tmpArr = Split(FullName, " ") Item3 = tmpArr(UBound(tmpArr)) Item1 = tmpArr(0) Select Case lType Case 1: NameSplit = IIf(UBound(tmpArr) > 0, Item1, "") Case 2 If UBound(tmpArr) > 1 Then For i = 1 To UBound(tmpArr) - 1 tmp = Trim(CStr(tmpArr(i))) If Len(tmp) > 0 Then n = n + 1 ReDim Preserve Arr(1 To n) Arr(n) = tmp End If Next If n Then NameSplit = Join(Arr, " ") End If Case 3: NameSplit = Item3 End Select End If End Function
3> Tiếp theo là code chính:PHP:Function RemoveMarks(ByVal Text As String) As String Dim CharCode, i As Long Dim ResText As String, sTmp As String On Error Resume Next sTmp = Text CharCode = Array(7855, 7857, 7859, 7861, 7863, 7845, 7847, 7849, 7851, 7853, 225, _ 224, 7843, 227, 7841, 259, 226, 273, 7871, 7873, 7875, 7877, 7879, _ 233, 232, 7867, 7869, 7865, 234, 237, 236, 7881, 297, 7883, 7889, _ 7891, 7893, 7895, 7897, 7899, 7901, 7903, 7905, 7907, 243, 242, _ 7887, 245, 7885, 244, 417, 7913, 7915, 7917, 7919, 7921, 250, _ 249, 7911, 361, 7909, 432, 253, 7923, 7927, 7929, 7925) ResText = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyy" For i = 0 To UBound(CharCode) sTmp = Replace(sTmp, ChrW(CharCode(i)), Mid(ResText, i + 1, 1)) sTmp = Replace(sTmp, UCase(ChrW(CharCode(i))), UCase(Mid(ResText, i + 1, 1))) Next RemoveMarks = sTmp End Function
PHP:Sub Main() Dim sArray, Arr() Dim i As Long, n As Long Dim lastName As String, tmp As String On Error Resume Next With Sheets("Sheet1").Range("A3:A1000") sArray = .Value ReDim Arr(1 To UBound(sArray), 1 To 1) With CreateObject("Scripting.Dictionary") For i = 1 To UBound(sArray) tmp = Trim(CStr(sArray(i, 1))) If Len(tmp) Then lastName = UCase(NameSplit(tmp, 3)) lastName = Trim(RemoveMarks(lastName)) If Not .Exists(lastName) Then .Add lastName, 1 Arr(i, 1) = lastName & 1 Else .Item(lastName) = .Item(lastName) + 1 Arr(i, 1) = lastName & .Item(lastName) End If End If Next End With .Offset(, 1).Value = Arr End With End Sub
Nhờ bạn kiểm tra lại giúp mình với.Macro sẽ tạo giúp bạn cột "Mã 03" & sắp xếp theo thứ tự tăng dần của cột này;
Cột 'Mã 05' do công thức tạo nên
Cảm ơn bạn đã chỉ ra cho mình cách khắc phục lỗi.Dòng này bị lỗi do 1 trong các nguyên nhân sau:
1./ Có khoảng trống trước [Họ Đêm] khi nhập gây ra; Xem cả bên cột [Tên] nữa nghen.
2./ Có thừa khoảng trống giữa [họ] & [đêm] hay cuối [Họ Đêm]
3./ Bắt macro tra từ không có trong bảng tra.
. . . . .
1. Macro thực hiện các công đoạn:Nhờ bạn giúp mình tí nữa ạ: Khi mình chạy code tạo mã thì dữ liệu cũng bị xáo trộn không như dữ liệu lúc đầu.
Bạn có thể chỉ mình cách thêm mã vào mà không bị xáo trộn dữ liệu so với ban đầu. Xin cảm ơn bạn.
Cảm ơn bạn đã gợi ý.1. Macro thực hiện các công đoạn:
2. Tạo ra 3 kí tự đầu của mã (Fần đặc tính của mã)
3. Sau đó sắp xết theo fần đặc tính này
4. Chỉ sau khi đã sắp xếp, ta mới có thể thêm fần định trị của mã (thường là 2 kí số); Bằng công thức hay câu lệnh macro đều được.
Để đưa về trạng thái ban đầu của dữ liệu của bạn, ta nên làm vầy:
Cần thực hiện tạo cột thứ tự trước khi chạy macro (tạo 3 kí tự đặt tính)
Sau bước 4 nêu trên, ta Copy & dán Values cột mã_05
Sau đó, ta lại xếp danh sách theo trường [STT]
Đó là cách thêm fần định trị bằng công thức;
Nếu làm bỡi macro sẽ đơn giản đi fần nào các bước sắp xếp
Bạn thử sức trước xem sao & chúc thành công!
Sao bạn không dùng mã Số vậy?Cảm ơn bạn đã gợi ý.
Mình hiểu cách thực hiện rồi.
Nếu dùng mã số, với số lượng dữ liệu lớn thì rất khó khăn trong tìm kiếm.Sao bạn không dùng mã Số vậy?