Xin code tạo mã nhân viên.

Liên hệ QC

huyhungvn

Thành viên mới
Tham gia
21/7/09
Bài viết
6
Được thích
1
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.
 

File đính kèm

  • ma NV.xls
    18 KB · Đọc: 58
Nếu bạn lập CSDL bên MS ACCESS thì không nói làm gì, còn bên Excel thì nên vầy:

Mã nên có độ dài như nhau;
Mã của nhân vậy này bao gồm mã của nhân vật khác;

Ví dụ Cô Ng. Việt Hồng có mã HNV; Thì cô Ng.Việt Hoa không thể mã là HNV1 được;
Mà cô đầu nên có mã là HNV0

Bạn xem file của mình sẵn có

/(/hững mong giúp bạn ít nhiều!
 

File đính kèm

  • gpeNhanSu.rar
    20.9 KB · Đọc: 109
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.

Trước tiên bạn cần 2 hàm hổ trợ
1> Hàm tách tên:
PHP:
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
2> Hàm loại dấu tiếng Việt
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
3> Tiếp theo là code chính:
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
 

File đính kèm

  • ma NV.xls
    42 KB · Đọc: 132
Cám ơn bạn nhiều lắm! Tôi tự kiếm trong diễn đàn mấy ngày rồi mà chưa thấy! Mới đưa sáng nay mà giờ đã có câu trả lời! Diễn đàn có những thành viên quá ưu tú. Thanks ...
 
Lần chỉnh sửa cuối:
Hàm lấy riêng họ tên, dùng Regex:

Mã:
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

TachHoTen("Nguyen Van Chuoi Tieu", 3) = "Tieu"
TachHoTen("Nguyen Van Chuoi Tieu", 2) = "Van Chuoi"
TachHoTen("Nguyen Van Chuoi Tieu", 1) = "Nguyen"
TachHoTen("Nguyen Van Tieu", 3) = "Tieu"
TachHoTen("Nguyen Van Tieu", 2) = "Van"
TachHoTen("Nguyen Van Tieu", 1) = "Nguyen"
TachHoTen("Nguyen Tieu", 3) = "Tieu"
TachHoTen("Nguyen Tieu", 2) = ""
TachHoTen("Nguyen Tieu", 1) = "Nguyen"
TachHoTen("Tieu", 3) = "Tieu"
TachHoTen("Tieu", 2) = ""
TachHoTen("Tieu", 1) = ""

Chú thích: rất tiếc là Regex của VBScript không hổ trợ dòm trước, ngó sau (lookahead, lookbehind). Nếu có hổ trợ thì code gọn đẹp hơn nhiều.
 
Mình có danh sách học sinh, nhiều khi học sinh chuyển đi rồi lại về sau một thời gian. Do đó có thể sẽ nhập trùng dữ liệu vì đã có dữ liệu trước đó. Mong các anh chị trong diễn đàn viết giúp đoạn code tạo mã cho học sinh ( tự động) để tránh nhập trùng dữ liệu.
Nội dung yêu cầu được ghi trong file.
Xin cảm ơn.
 

File đính kèm

  • TaoMa.rar
    11.4 KB · Đọc: 12
Xin gợi ý bạn bộ mã học sinh như sau:
PHP:
'
[ATTACH=full]194316[/ATTACH]
 

File đính kèm

  • 1524392484207.png
    1524392484207.png
    64.8 KB · Đọc: 18
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
 

File đính kèm

  • Mã.rar
    12.9 KB · Đọc: 42
Trước tiên bạn cần 2 hàm hổ trợ
1> Hàm tách tên:
PHP:
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
2> Hàm loại dấu tiếng Việt
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
3> Tiếp theo là code chính:
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
 
Lần chỉnh sửa cuối:

File đính kèm

  • 1524452655026.png
    1524452655026.png
    5.5 KB · Đọc: 8
Lần chỉnh sửa cuố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
Nhờ bạn kiểm tra lại giúp mình với.
Khi mình đưa danh sách có nhiều dữ liệu hơn vào thì code chạy bị lỗi.
Code bị lỗi tại dòng: Ma = WF.VLookup(Left(Tmp, 1), Tabl, 2, False)
Xin cảm ơn.
 

File đính kèm

  • Mã HS.rar
    28.9 KB · Đọc: 10
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.
. . . . .
 
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.
. . . . .
Cảm ơn bạn đã chỉ ra cho mình cách khắc phục lỗi.
Chúc bạn trong ngày đầu tuần gặp nhiều thành công.
 
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.
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!
 
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!
Cảm ơn bạn đã gợi ý.
Mình hiểu cách thực hiện rồi.
 
Web KT
Back
Top Bottom