Tạo mã hàng hóa cho hàng hóa mới! Nhờ ACE giúp mình!

Liên hệ QC

tieuvutru90

Thành viên mới
Tham gia
16/4/10
Bài viết
27
Được thích
3
mã hàng: 2 chữ cái đầu của tên hàng (không dấu, ký tự đặc biệt) + 3 số
mà em có danh sách một số mã hàng có sẵn rồi ạ. Có cách nào xài hàm VBA để nó tự xuất ra mã hàng mà không trùng với những mã hàng hiện tại không ạ?
Xin được mọi người giúp đỡ ạ! Em xin cám ơn nhiều!

2905.PNG
 

File đính kèm

  • import hang moi - help.xlsm
    467.3 KB · Đọc: 18
Luôn có cách. Chỉ là cách ngắn, cách dài.
 
Không trùng là thế nào, chưa rõ lắm. Code này chỉ xử lý việc: mã hàng: 2 chữ cái đầu của tên hàng (không dấu, ký tự đặc biệt) + 3 số
 

File đính kèm

  • import hang moi_KgDauKgKtuDacBiet_tieuvutru90.xlsm
    461 KB · Đọc: 7
Không trùng là thế nào, chưa rõ lắm. Code này chỉ xử lý việc: mã hàng: 2 chữ cái đầu của tên hàng (không dấu, ký tự đặc biệt) + 3 số
là mã mới không trùng với danh sách mã hàng hiện có đó Maika ơi!
lúc trước làm mã không chuẩn nên đôi khi đang BA102, BA103 cái nhảy lên BA400. giờ hàng mới về muốn nó tạo mã BA104 BA105, đại loại vậy đó!
 
là mã mới không trùng với danh sách mã hàng hiện có đó Maika ơi!
lúc trước làm mã không chuẩn nên đôi khi đang BA102, BA103 cái nhảy lên BA400. giờ hàng mới về muốn nó tạo mã BA104 BA105, đại loại vậy đó!
Bạn nói ở bài 1: "để nó tự xuất ra mã hàng mà không trùng với những mã hàng hiện tại không ạ?"
Có 2 kiểu định nghĩa không trùng:
1. Mã mới tạo ra không trùng với mã cũ của cùng 1 mặt hàng. VD: Vitamin Vista-B B12: mã cũ VI004 mã mới tạo ra VI004 là không được, buộc phải là VI005 hay gì đó khác đi.
2. Mã mới tạo ra buộc phải không trùng với bất kỳ mã hàng nào ở trong sheet "ma co san" của bạn.

Muốn gì trình bày rõ, đừng hà tiện lời mà nói tối nghĩa. Mỗi cách định nghĩa là mỗi giải thuật khác nhau, đừng hời hợt quá!
 
mã hàng: 2 chữ cái đầu của tên hàng (không dấu, ký tự đặc biệt) + 3 số
mà em có danh sách một số mã hàng có sẵn rồi ạ. Có cách nào xài hàm VBA để nó tự xuất ra mã hàng mà không trùng với những mã hàng hiện tại không ạ?
Xin được mọi người giúp đỡ ạ! Em xin cám ơn nhiều!

View attachment 259625
Dữ liệu sheetJS không trùng, chạy sub ABC
Mã:
Option Explicit
Private mangBoDau(1 To 65535) As Integer
Sub ABC()
  Dim Dic As Object, sArr(), Res(), sRow&, i&, j&, ma$, tmp$

  Set Dic = CreateObject("Scripting.Dictionary")
  With Sheets("ma co san")
    sArr = .Range("A2", .Range("A" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  For i = 1 To sRow
    If sArr(i, 1) <> Empty Then Dic.Item(sArr(i, 1)) = ""
  Next i
  With Sheets("SheetJS")
    sArr = .Range("E2", .Range("E" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  ReDim Res(1 To sRow, 1 To 1)
  For i = 1 To sRow
    If Len(sArr(i, 1)) > 1 Then
      ma = BoDauViet(UCase(Mid(sArr(i, 1), 1, 2)))
      For j = 1 To 1000000
        tmp = ma & Format(j, "000")
        If Dic.exists(tmp) = False Then
          Res(i, 1) = tmp
          Dic.Add tmp, ""
          Exit For
        End If
      Next j
    End If
  Next i
  Sheets("SheetJS").Range("C2").Resize(sRow, 1) = Res
End Sub

Function BoDauViet(ByVal Str As String) As String
  Dim CodeKt, CodeDau, i&, C$
  If mangBoDau(225) <> 97 Then
    CodeKt = Array(97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 105, 105, 105, 105, 105, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 121, 121, 121, 121, 121, 100)
    CodeDau = Array(225, 224, 7843, 227, 7841, 259, 7855, 7857, 7859, 7861, 7863, 226, 7845, 7847, 7849, 7851, 7853, 233, 232, 7867, 7869, 7865, 234, 7871, 7873, 7875, 7877, 7879, 237, 236, 7881, 297, 7883, 243, 242, 7887, 245, 7885, 244, 7889, 7891, 7893, 7895, 7897, 417, 7899, 7901, 7903, 7905, 7907, 250, 249, 7911, 361, 7909, 432, 7913, 7915, 7917, 7919, 7921, 253, 7923, 7927, 7929, 7925, 273)
    For i = 0 To UBound(CodeKt)
      mangBoDau(CodeDau(i)) = CodeKt(i)
    Next i
  End If
  For i = 1 To Len(Str)
    C = Mid(Str, i, 1)
    If mangBoDau(AscW(LCase(C))) Then
      If C = LCase(C) Then Mid(Str, i, 1) = ChrW(mangBoDau(AscW(C))) Else Mid(Str, i, 1) = UCase(ChrW(mangBoDau(AscW(LCase(C)))))
    End If
  Next i
  BoDauViet = Str
End Function
 
Lần chỉnh sửa cuối:
Bạn nói ở bài 1: "để nó tự xuất ra mã hàng mà không trùng với những mã hàng hiện tại không ạ?"
Có 2 kiểu định nghĩa không trùng:
1. Mã mới tạo ra không trùng với mã cũ của cùng 1 mặt hàng. VD: Vitamin Vista-B B12: mã cũ VI004 mã mới tạo ra VI004 là không được, buộc phải là VI005 hay gì đó khác đi.
2. Mã mới tạo ra buộc phải không trùng với bất kỳ mã hàng nào ở trong sheet "ma co san" của bạn.

Muốn gì trình bày rõ, đừng hà tiện lời mà nói tối nghĩa. Mỗi cách định nghĩa là mỗi giải thuật khác nhau, đừng hời hợt quá!
2. Mã mới tạo ra buộc phải không trùng với bất kỳ mã hàng nào ở trong sheet "ma co san" của bạn.

Đúng ý 2 như bạn nói đó! cám ơn Maika nghen! Chắc tại do mình nghĩ nói vậy là mọi người sẽ hiểu rồi! Còn nhiều khi bạn rành hơn mình, làm nhiều hơn mình, thì thấy mình nói như vậy là chưa đủ thông tin! Đằng nào cũng cám ơn bạn!
 
Chạy sub ABC
Mã:
Option Explicit
Private mangBoDau(1 To 65535) As Integer
Sub ABC()
  Dim Dic As Object, sArr(), Res(), sRow&, i&, j&, ma$, tmp$

  Set Dic = CreateObject("Scripting.Dictionary")
  With Sheets("ma co san")
    sArr = .Range("A2", .Range("A" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  For i = 1 To sRow
    If sArr(i, 1) <> Empty Then Dic.Item(sArr(i, 1)) = ""
  Next i
  With Sheets("SheetJS")
    sArr = .Range("E2", .Range("E" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  ReDim Res(1 To sRow, 1 To 1)
  For i = 1 To sRow
    If Len(sArr(i, 1)) > 1 Then
      ma = BoDauViet(UCase(Mid(sArr(i, 1), 1, 2)))
      For j = 1 To 1000000
        tmp = ma & Format(j, "000")
        If Dic.exists(tmp) = False Then
          Res(i, 1) = tmp
          Dic.Add tmp, ""
          Exit For
        End If
      Next j
    End If
  Next i
  Sheets("SheetJS").Range("C2").Resize(sRow, 1) = Res
End Sub

Function BoDauViet(ByVal Str As String) As String
  Dim CodeKt, CodeDau, i&, C$
  If mangBoDau(225) <> 97 Then
    CodeKt = Array(97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 105, 105, 105, 105, 105, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 121, 121, 121, 121, 121, 100)
    CodeDau = Array(225, 224, 7843, 227, 7841, 259, 7855, 7857, 7859, 7861, 7863, 226, 7845, 7847, 7849, 7851, 7853, 233, 232, 7867, 7869, 7865, 234, 7871, 7873, 7875, 7877, 7879, 237, 236, 7881, 297, 7883, 243, 242, 7887, 245, 7885, 244, 7889, 7891, 7893, 7895, 7897, 417, 7899, 7901, 7903, 7905, 7907, 250, 249, 7911, 361, 7909, 432, 7913, 7915, 7917, 7919, 7921, 253, 7923, 7927, 7929, 7925, 273)
    For i = 0 To UBound(CodeKt)
      mangBoDau(CodeDau(i)) = CodeKt(i)
    Next i
  End If
  For i = 1 To Len(Str)
    C = Mid(Str, i, 1)
    If mangBoDau(AscW(LCase(C))) Then
      If C = LCase(C) Then Mid(Str, i, 1) = ChrW(mangBoDau(AscW(C))) Else Mid(Str, i, 1) = UCase(ChrW(mangBoDau(AscW(LCase(C)))))
    End If
  Next i
  BoDauViet = Str
End Function
Tuyệt vời quá bạn HieuCD ơi! Cám ơn nhiều! Nó giúp mình tiết kiệm rất nhiều thời gian và sức lực luôn đó! mê quá!
 
Bạn có 3 cột, đó là [Loại hàng], [Nhóm Hàng] & [Mã Hàng]; # cột này chắc liên hệ với nhau không ít thì nhiều.
Cột [Loại Hàng] gác qua 1 bên vì nó đang trống huơ;
Cột thứ đến là nhóm hàng & sau khi mình tiến hành xóa trùng thì còn lại như vầy:

STTNhóm hàng(3 Cấp)
1cơ xương khớp
2da liễu
3dầu xoa, cao xoa
4dầu xoa, cao xoa|cơ xương khớp
5đông y
6dược mỹ phẩm
7dược mỹ phẩm|da liễu
8gan, giải độc
9giảm đau, hạ sốt
10kháng sinh, nấm, virus, kí sinh trùng
11kháng viêm, dị ứng
12người việt dùng hàng việt
13nhãn khoa
14phụ khoa, nam khoa, nội tiết
15tai, mũi, họng, hô hấp
16thần kinh
17thận, tiết niệu
18thận, tiết niệu|tiêu hóa
19thực phẩm bổ sung
20tiêu hóa
21tim mạch
22TPCN
23TPCN|người việt dùng hàng việt
24TPCN|tim mạch|tiêu hóa
25TPCN|vitamin và muối khoáng
26vật tư y tế
27vật tư y tế|tai, mũi, họng, hô hấp
28vitamin và muối khoáng

(Trong đó có 4 dòng TFCN trùng nhau)
Theo mình nghĩ thì ta nên tạo mã nhóm hàng & mã này cho luôn vô [Mã Hàng]; Lúc đó các loại thuốc & hóa chất thuộc nhóm xương khớp đều có kí hiệu 'A' trong mã,. . . .

Bạn hiện có mã AB405 & kế đó là AC001; vậy xin hỏi bạn 'A' có nghĩa là gì & 'C' có nghĩa là chi?
Nên chăng 'A' là thần kinh, B là tim mạch, C là tiêu hóa & S là tiết niệu (?) . . . . . (Tất nhiên có loại đa chức năng, như nước cất hay vitamin,. . . . .)
 
Bạn có 3 cột, đó là [Loại hàng], [Nhóm Hàng] & [Mã Hàng]; # cột này chắc liên hệ với nhau không ít thì nhiều.
Cột [Loại Hàng] gác qua 1 bên vì nó đang trống huơ;
Cột thứ đến là nhóm hàng & sau khi mình tiến hành xóa trùng thì còn lại như vầy:

STTNhóm hàng(3 Cấp)
1cơ xương khớp
2da liễu
3dầu xoa, cao xoa
4dầu xoa, cao xoa|cơ xương khớp
5đông y
6dược mỹ phẩm
7dược mỹ phẩm|da liễu
8gan, giải độc
9giảm đau, hạ sốt
10kháng sinh, nấm, virus, kí sinh trùng
11kháng viêm, dị ứng
12người việt dùng hàng việt
13nhãn khoa
14phụ khoa, nam khoa, nội tiết
15tai, mũi, họng, hô hấp
16thần kinh
17thận, tiết niệu
18thận, tiết niệu|tiêu hóa
19thực phẩm bổ sung
20tiêu hóa
21tim mạch
22TPCN
23TPCN|người việt dùng hàng việt
24TPCN|tim mạch|tiêu hóa
25TPCN|vitamin và muối khoáng
26vật tư y tế
27vật tư y tế|tai, mũi, họng, hô hấp
28vitamin và muối khoáng

(Trong đó có 4 dòng TFCN trùng nhau)
Theo mình nghĩ thì ta nên tạo mã nhóm hàng & mã này cho luôn vô [Mã Hàng]; Lúc đó các loại thuốc & hóa chất thuộc nhóm xương khớp đều có kí hiệu 'A' trong mã,. . . .

Bạn hiện có mã AB405 & kế đó là AC001; vậy xin hỏi bạn 'A' có nghĩa là gì & 'C' có nghĩa là chi?
Nên chăng 'A' là thần kinh, B là tim mạch, C là tiêu hóa & S là tiết niệu (?) . . . . . (Tất nhiên có loại đa chức năng, như nước cất hay vitamin,. . . . .)
thật ra đây chỉ là bảng dữ liệu sau khi mình giới hạn lại để mn có thể tập trung hơn vào vấn đề mình đang gặp phải!
MÃ HÀNG thì tạo từ TÊN HÀNG HÓA ạ!
đây là file dữ liệu để import vào phần mềm quản lý nên cột NHÓM HÀNG không nhất thiết phải tạo mã cho nó bạn ơi!
 
Tuyệt vời quá bạn HieuCD ơi! Cám ơn nhiều! Nó giúp mình tiết kiệm rất nhiều thời gian và sức lực luôn đó! mê quá!
Chỉnh lại sub ABC do dữ liệu trong SheetJS bị trùng
Mã:
Sub ABC()
  Dim Dic As Object, sArr(), Res(), sRow&, i&, j&, ma$, tmp$

  Set Dic = CreateObject("Scripting.Dictionary")
  Dic.CompareMode = vbTextCompare
  With Sheets("ma co san")
    sArr = .Range("A2", .Range("A" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  For i = 1 To sRow
    If sArr(i, 1) <> Empty Then Dic.Item(sArr(i, 1)) = ""
  Next i
  With Sheets("SheetJS")
    sArr = .Range("E2", .Range("E" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  ReDim Res(1 To sRow, 1 To 1)
  For i = 1 To sRow
    If Len(sArr(i, 1)) > 1 Then
      If Dic.exists(sArr(i, 1)) = False Then
        ma = BoDauViet(UCase(Mid(sArr(i, 1), 1, 2)))
        For j = 1 To 1000000
          tmp = ma & Format(j, "000")
          If Dic.exists(tmp) = False Then
            Res(i, 1) = tmp
            Dic.Add tmp, ""
            Dic.Add sArr(i, 1), tmp
            Exit For
          End If
        Next j
      Else
        Res(i, 1) = Dic.Item(sArr(i, 1))
      End If
    End If
  Next i
  Sheets("SheetJS").Range("C2").Resize(sRow, 1) = Res
End Sub
 
mã hàng: 2 chữ cái đầu của tên hàng (không dấu, ký tự đặc biệt) + 3 số
mà em có danh sách một số mã hàng có sẵn rồi ạ. Có cách nào xài hàm VBA để nó tự xuất ra mã hàng mà không trùng với những mã hàng hiện tại không ạ?
Xin được mọi người giúp đỡ ạ! Em xin cám ơn nhiều!

View attachment 259625
Thực ra tạo mã hàng như bạn chẳng có tác dụng gì.Nếu đã tạo thì mình phải tạo từ phân nhóm.Loại hàng hóa chứ ai lại lấy chữ cái đầu tiên đặt làm mã hàng.
 
mã hàng: 2 chữ cái đầu của tên hàng (không dấu, ký tự đặc biệt) + 3 số
mà em có danh sách một số mã hàng có sẵn rồi ạ. Có cách nào xài hàm VBA để nó tự xuất ra mã hàng mà không trùng với những mã hàng hiện tại không ạ?
Xin được mọi người giúp đỡ ạ! Em xin cám ơn nhiều!

View attachment 259625
Tham khảo bài này nhé:
 
Chủ bài đăng làm cái chuyện sinh con rồi mới sinh cha!
"Tạo mã hàng hóa cho hàng hóa mới! Nhờ . . . giúp mình!"
Trước tiên theo mình nên tạo ra cái mà người ta thường nói lá 2ui trình để tạo ra bộ mã cái đã & nó sẽ xuyên suốt cho những mã phát sinh sau này
Ví dụ dạng mã gồm ABC0000
Ở đây AB là nhóm hàng, như VF là các văn phòng fẩm, XD là các vật tư, vật liệu xây dựng, NL gồm xăng dầu (DO hay FO), nhớt, mỡ bôi trơn,. . .
C là trạng thái của loại hàng, như L - lõng, B: bột, C cục, D - Dễ vỡ,. . . . ví dụ XDB0000 là cát, XDC0304 là đá 3x4,. . . .

https://www.giaiphapexcel.com/diendan/forums/xử-lý-chuỗi-ký-tự.118/post-thread
 
Em cám ơn mọi người đã đóng góp ý kiến. Đúng thật là nên tạo 2 chữ cái đầu theo nhóm hàng thì nó hợp lý hơn ạ! Khi em suy nghĩ về quy cách mã hàng hóa, em đã không nghĩ tới vấn đề đó!
Tuy nhiên vì đặc thù ngành hàng thuốc tây nên em khó có thể làm thế vì đơn giản là nhóm hàng nó có thể thay đổi. Em lấy ví dụ 1 như 1 chai cốm tiêu cho em bé ăn Xitrina, dù dữ liệu xếp vào Thực phẩm chức năng như thực sự thì sản phẩm đó có số đăng ký là thuốc (nên phải xếp vào nhóm Tiêu hóa). Nên việc xếp nhóm hàng là không chắc chắn.
Ví như gel bôi trơn, nghe qua thì dễ nhưng phải thực sự cầm sản phẩm đó trên tay, xem số đăng ký thì mới biêt là sản phẩm đó thuộc Vật tư y tế hay là Dược mỹ phẫm!
Vì kho dữ liệu hàng oder tới hơn 9 ngàn dòng nên em không thể nào kiểm soát hết! Em xin cảm ơn mn đã đóng góp ý kiến, đặc biệt là anh HieuCD và a Nghĩa đã bỏ thời gian ra giúp đỡ!
 
Góp ý của mọi người về mã nên theo ngành hàng là rất đúng, em nghĩ sau này khi cơ sở dữ liệu hoàn thiện hơn chắc em sẽ bỏ 1 khoảng thời gian để làm lại mã hàng hóa! Code a HieuCD viết thì em sửa lại vị trí ô là sẽ dùng được!
 
Góp ý của mọi người về mã nên theo ngành hàng là rất đúng, em nghĩ sau này khi cơ sở dữ liệu hoàn thiện hơn chắc em sẽ bỏ 1 khoảng thời gian để làm lại mã hàng hóa! Code a HieuCD viết thì em sửa lại vị trí ô là sẽ dùng được!
Bạn biết dùng UserForm không? Nếu biết tôi bày cách cho bạn sử dụng mã tự động bằng code của tôi?
 
mã hàng: 2 chữ cái đầu của tên hàng (không dấu, ký tự đặc biệt) + 3 số
mà em có danh sách một số mã hàng có sẵn rồi ạ. Có cách nào xài hàm VBA để nó tự xuất ra mã hàng mà không trùng với những mã hàng hiện tại không ạ?
Xin được mọi người giúp đỡ ạ! Em xin cám ơn nhiều!
Tạo cho bạn function nhập công thức trực tiếp trên sheet, bạn xem ví dụ trong sheetJS và sheet ma co san
Mặc dù mình đã lượt bớt các lệnh không cần thiết và tăng tốc xử lý nhưng do code phải chạy rất nhiều lần (mỗi công thức code chạy 1 lần) sẽ làm chậm file
Mã:
Function ShortageID(ByVal strMa$, ByVal lenSTT&, ParamArray paArr()) As Variant
  Dim aStt() As Boolean, Res(), jTem, sArr
  Dim sRow&, n&, i&, k&, lenMa&, stt0$
    
  lenMa = Len(strMa)
  stt0 = String(lenSTT, "0")
  ReDim aStt(1 To 1)
  For Each sArr In paArr
    If InStr(1, "RangeVariant()", TypeName(sArr)) = 0 Then sArr = Array(sArr)
    For Each jTem In sArr
      If Left(jTem, lenMa) = strMa Then
        n = CLng(Right(jTem, lenSTT))
        If n > UBound(aStt) - 1 Then ReDim Preserve aStt(1 To n + 1)
        If aStt(n) = False Then
          k = k + 1
          aStt(n) = True
        End If
      End If
    Next jTem
  Next sArr
  ReDim Res(1 To UBound(aStt) - k, 1 To 1)
  If k Then
    k = 0
    For i = 1 To UBound(aStt)
      If aStt(i) = False Then
        k = k + 1
        Res(k, 1) = strMa & Format(i, stt0)
      End If
    Next i
  Else
    Res(1, 1) = strMa & Format(1, stt0)
  End If
  ShortageID = Res
End Function
 

File đính kèm

  • import hang moi_KgDauKgKtuDacBiet_tieuvutru90.xlsm
    486.5 KB · Đọc: 8
là mã mới không trùng với danh sách mã hàng hiện có đó Maika ơi!
lúc trước làm mã không chuẩn nên đôi khi đang BA102, BA103 cái nhảy lên BA400. giờ hàng mới về muốn nó tạo mã BA104 BA105, đại loại vậy đó!
Trước hết để giải quyết triệt để vấn đề trùng mã, tôi thấy ngay cả tên hàng đã trùng 44 tên, nếu ghép với nhóm hàng thì trùng 43 tên, riêng cột nhóm hàng thì ô trống nhiều vô kể chúng ta cần loại trừ những tên hàng trùng nhau ra khỏi CSDL.

Phải chi cái fie gốc trong sheet mã có sẳn bao gồm mã hàng, nhóm hàng, tên hàng luôn thì mình sẽ nhập vào đó luôn đối với tên mới đặt.
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom