Tìm 2 số serial thiếu trong chuỗi 5000 số serial

Liên hệ QC

vuvanthe2000

Thành viên mới
Tham gia
29/12/10
Bài viết
34
Được thích
11
Giới tính
Nam
Gửi các bậc tiền bối.
Mong các bậc tiền bối giúp em vụ này ạ.
Em có 5000 số serial sản xuất. ( số có quy luật. Chia làm 25 lô sản xuất khác nhau. mỗi lô 200 sản phẩm)
Tuy nhiên sau khi sản xuất thì chỉ đếm được 4998. Tức là thiếu mất 2 số serial.
Mong các cụ giúp em tìm ra 2 số serial nhanh nhất có thể.
Em xin gửi file đính kèm

Em cảm ơn!
 

File đính kèm

  • tim serial thieu trong chuoi.xlsx
    73.3 KB · Đọc: 31
Bạn cho macro này chạy & sẽ biết 2 mã hàng còn thiếu là gì:
PHP:
Sub TimThieu()
Dim J As Long, W As Long
Dim Rng As Range, sRng As Range
Dim GPE As String
Const Lo As String = "V119011"
Const Model As String = "EA300080"
Const SLLo As String = "200A"
Set Rng = Range([B1], [B2].End(xlDown))
Rng.Offset(1, 17).Value = ""
For J = 75 To 97
    For W = 1 To 200
        GPE = Lo & CStr(J) & "A" & Model & SLLo & Right("0000" & CStr(W), 5)
        Set sRng = Rng.Find(GPE, , xlFormulas, xlWhole)
        If sRng Is Nothing Then
            Cells(Rng.Rows.Count + 9, "S").End(xlUp).Offset(1).Value = GPE
        End If
    Next W
Next J
End Sub

V11901186AEA300080200A00095
V11901187AEA300080200A00112
 
Upvote 0
V11901186AEA300080200A00095
V11901187AEA300080200A00112
Cảm ơn tiền bối nhiều ạ.
Bài đã được tự động gộp:

Tiền bối SA_DQ cho cháu hỏi. Câu lệnh VBA này có nghĩa là gì ạ? cháu hiểu là số liên tiếp của lô sản xuất đúng không ạ?
Nếu lô của cháu chạy từ 1 đến 1000 thì cháu có nên thay là: For J = 1 to 1000 không ạ?
Cháu đang định làm 1 cái Form để nhập thì chỉ cần copy dữ liệu vào cột B sau đó chạy lệnh là sẽ tự động tìm số serial thiếu và điền vào cột S đúng không ạ?
 
Lần chỉnh sửa cuối:
Upvote 0
Const SLLo As String = "200A"
GPE = Lo & CStr(J) & "A" & Model & SLLo & Right("0000" & CStr(W), 5)

Thưa tiền bối SA_DQ cháu đang ngâm cứu công thức của tiền bối. Đang hơi hơi hiểu 1 chút.
Tiền bối cho cháu hỏi, trường hợp SLLo ( số lượng lô ) của cháu không đặt cố định là 200 ( chạy từ 1 đến 200) thì công thức sẽ thay đổi như nào ạ?
Kính mong tiền bối giúp đỡ.
Cháu cảm ơn.
 
Upvote 0
Gửi các bậc tiền bối.
Mong các bậc tiền bối giúp em vụ này ạ.
Em có 5000 số serial sản xuất. ( số có quy luật. Chia làm 25 lô sản xuất khác nhau. mỗi lô 200 sản phẩm)
Tuy nhiên sau khi sản xuất thì chỉ đếm được 4998. Tức là thiếu mất 2 số serial.
Mong các cụ giúp em tìm ra 2 số serial nhanh nhất có thể.
Em xin gửi file đính kèm

Em cảm ơn!
Số lô sản xuất , số model, số lượng lô, số serial thì số kí tự có thay đổi không , như số lô sản xuất 10 kí tự, số model 8 kí tự ...
 
Upvote 0
Số lô sản xuất , số model, số lượng lô, số serial thì số kí tự có thay đổi không , như số lô sản xuất 10 kí tự, số model 8 kí tự ...

Có thay đổi ạ. Số Lô sản xuất thay đổi theo tháng và thứ tự tăng dần, Số lượng của lô cũng thay đổi từ 1 đến 200. Em gửi lại file excel như đính kèm để bác xem ạ.
Em đang có suy nghĩ là làm 1 form nhập vào mã model, số lô ( ký tự chung của tháng). Nhập các số serial cần tìm kiếm. Sau đó chỉ cần ấn nút lệnh là ra được số serial bị thiếu.
Nhờ bác giúp đỡ.
Em cảm ơn!
 

File đính kèm

  • tim serial thieu trong chuoi.xlsx
    73.5 KB · Đọc: 4
Upvote 0
Có thay đổi ạ. Số Lô sản xuất thay đổi theo tháng và thứ tự tăng dần, Số lượng của lô cũng thay đổi từ 1 đến 200. Em gửi lại file excel như đính kèm để bác xem ạ.
Em đang có suy nghĩ là làm 1 form nhập vào mã model, số lô ( ký tự chung của tháng). Nhập các số serial cần tìm kiếm. Sau đó chỉ cần ấn nút lệnh là ra được số serial bị thiếu.
Nhờ bác giúp đỡ.
Em cảm ơn!
Có thay đổi ạ. Số Lô sản xuất thay đổi theo tháng và thứ tự tăng dần, Số lượng của lô cũng thay đổi từ 1 đến 200. Em gửi lại file excel như đính kèm để bác xem ạ.
Em đang có suy nghĩ là làm 1 form nhập vào mã model, số lô ( ký tự chung của tháng). Nhập các số serial cần tìm kiếm. Sau đó chỉ cần ấn nút lệnh là ra được số serial bị thiếu.
Nhờ bác giúp đỡ.
Em cảm ơn!
oke bạn, cho tôi hỏi thêm chút, ví dụ V11901175AEA300080200A00001
- thì số lô là 175A tháng 01-2019, nếu lô 50A thì viết là V1190150AEA300080200A00001 đúng không?
- số lượng lô là 200, nếu số lượng là 50 thì viết là V11901175AEA30008050A00001 đúng không
- Mấy chữ màu đỏ có thay đổi không? như B,C,D chẳng hạn?
 
Upvote 0
oke bạn, cho tôi hỏi thêm chút, ví dụ V11901175AEA300080200A00001
- thì số lô là 175A tháng 01-2019, nếu lô 50A thì viết là V1190150AEA300080200A00001 đúng không?
- số lượng lô là 200, nếu số lượng là 50 thì viết là V11901175AEA30008050A00001 đúng không
- Mấy chữ màu đỏ có thay đổi không? như B,C,D chẳng hạn?

Dạ thưa anh số A có thay đổi nhưng rất ít ạ. Bên em từ khi thành lập công ty chưa phát sinh lần nào thay đổi A thành B.
Nếu lô 50A thì sẽ viết đầy đủ là V11901050AEA300080200A00001 - đầy đủ ký tự. ( 050A chứ không phải là 50A)
Số lượng của lô là 50 thì đũng là V11901175AEA30008050A00001 anh ạ.
 
Upvote 0
Dạ thưa anh số A có thay đổi nhưng rất ít ạ. Bên em từ khi thành lập công ty chưa phát sinh lần nào thay đổi A thành B.
Nếu lô 50A thì sẽ viết đầy đủ là V11901050AEA300080200A00001 - đầy đủ ký tự. ( 050A chứ không phải là 50A)
Số lượng của lô là 50 thì đũng là V11901175AEA30008050A00001 anh ạ.
Thử code này xem:
PHP:
Sub a()
Dim rng As Range, cell As Range, dic As Object, j As Long, wf As WorksheetFunction, result
Set wf = WorksheetFunction
Set rng = Range("b2:b" & [B100000].End(xlUp).Row)
ReDim result(0 To 0)
Set dic = CreateObject("Scripting.dictionary")
With CreateObject("vbscript.regexp")
    .Global = True: .Pattern = "^(.{9}[A-Z].{8}(\d{1,3}[A-Z]))\d{5}$"
    For Each cell In rng
        If Not dic.exists(.Replace(cell.Value, "$1")) And cell <> Empty Then dic.Add .Replace(cell.Value, "$1"), .Replace(cell.Value, "$2")
    Next
    For i = 0 To dic.Count - 1
        For j = 1 To CLng(Left(dic.items()(i), Len(dic.items()(i)) - 1))
           Set cell = rng.Find(dic.keys()(i) & Format(j, "00000"))
           If cell Is Nothing Then
             result(UBound(result)) = dic.keys()(i) & Format(j, "00000")
             ReDim Preserve result(UBound(result) + 1)
           End If
        Next
    Next
    [d2:d100000].Clear
    [d2].Resize(UBound(result), 1) = wf.Transpose(result)
End With
End Sub
 

File đính kèm

  • tim serial thieu trong chuoi.xlsb
    65.9 KB · Đọc: 11
Lần chỉnh sửa cuối:
Upvote 0
Thử code này xem:
PHP:
Sub a()
Dim rng As Range, cell As Range, dic As Object, j As Long, wf As WorksheetFunction, result
Set wf = WorksheetFunction
Set rng = Range("b2:b" & [B100000].End(xlUp).Row)
ReDim result(0 To 0)
Set dic = CreateObject("Scripting.dictionary")
With CreateObject("vbscript.regexp")
    .Global = True: .Pattern = "^(.{9}[A-Z].{8})(\d{1,3}[A-Z])\d{5}$"
    For Each cell In rng
        If Not dic.exists(.Replace(cell.Value, "$1")) And cell <> Empty Then dic.Add .Replace(cell.Value, "$1"), .Replace(cell.Value, "$2")
    Next
    For i = 0 To dic.Count - 1
        For j = 1 To CLng(Left(dic.items()(i), Len(dic.items()(i)) - 1))
           Set cell = rng.Find(dic.keys()(i) & dic.items()(i) & Format(j, "00000"))
           If cell Is Nothing Then
             result(UBound(result)) = dic.keys()(i) & dic.items()(i) & Format(j, "00000")
             ReDim Preserve result(UBound(result) + 1)
           End If
        Next
    Next
    [d2:d100000].Clear
    [d2].Resize(UBound(result), 1) = wf.Transpose(result)
End With
End Sub


Em cảm ơn,
Em ngâm cứu thêm code để học hỏi.
Có gì em hỏi tiếp nhé.
 
Upvote 0
Nhận lại file bài #10 đi bạn, tôi mới chỉnh lại code!

Gửi bác excel_lv1.5 cảm ơn hỗ trợ của bác rất nhiều.
Thực sự đọc code của bác cao siêu quá nên em chưa thể áp dụng sang nhà máy khác trong công ty tương tự.
Do vậy em xin phép mặt dày nhờ bác giúp đỡ 1 lần nữa ạ.
Lần này bài toán của em cũng tương tự như bài toán trước nhưng cấu trúc của nó có khác 1 chút ạ.
Với lại lần này em chỉ cần tìm số thiếu trong chuỗi hiện hành đã có thôi ạ. Ví dụ cấu trúc của nó gồm 1000 số serial. Nhưng bên em mới sản xuất đến 900 số.
Vì vậy chỉ cần tìm số thiếu trong 900 số đã sản xuất. Còn số 901 đến 1000 do chưa sản xuất nên không cần báo là thiếu ạ.
Em xin phép gửi file đính kèm.
Em cảm ơn!
 

File đính kèm

  • tim serial thieu trong chuoi_2.xlsx
    12.5 KB · Đọc: 6
Upvote 0
Có 2 cách:

1. sort số. Đếm từ đầu đến cuối, cứ thấy chỗ nào bị nhảy hàng thì là số thiếu.

2. Đặt một array số a(1000). Đọc dãy số và a(số) = a(số) + 1
Đọc lại array, cứ cái nào a(số) = 0 là bị sót.
(trong lúc đọc dãy số, nhớ ghi lại số max - tức là 900 hay gì gì đó. Lúc đọc lại array, chỉ đọc đến số max thôi)
 
Upvote 0
Gửi bác excel_lv1.5 cảm ơn hỗ trợ của bác rất nhiều.
Thực sự đọc code của bác cao siêu quá nên em chưa thể áp dụng sang nhà máy khác trong công ty tương tự.
Do vậy em xin phép mặt dày nhờ bác giúp đỡ 1 lần nữa ạ.
Lần này bài toán của em cũng tương tự như bài toán trước nhưng cấu trúc của nó có khác 1 chút ạ.
Với lại lần này em chỉ cần tìm số thiếu trong chuỗi hiện hành đã có thôi ạ. Ví dụ cấu trúc của nó gồm 1000 số serial. Nhưng bên em mới sản xuất đến 900 số.
Vì vậy chỉ cần tìm số thiếu trong 900 số đã sản xuất. Còn số 901 đến 1000 do chưa sản xuất nên không cần báo là thiếu ạ.
Em xin phép gửi file đính kèm.
Em cảm ơn!
Số kí tự model có thay đổi không bạn, cái này dữ liệu mẫu thôi đúng không, sao bạn không cho thêm vài trường hợp model, tháng khác nhau nữa.
 
Upvote 0

File đính kèm

  • Vi du tim so khong lien tiep.xlsx
    15.1 KB · Đọc: 13
Upvote 0
Số kí tự model có thay đổi không bạn, cái này dữ liệu mẫu thôi đúng không, sao bạn không cho thêm vài trường hợp model, tháng khác nhau nữa.
Đây là dạng mã có hệ thống cố định. Đặc biệt là các nhóm mã có số ký tự giống nhau.
Loại dạng này dùng các hàm string hiệu quả hơn RegEx - vì nó bốc chính xác theo vị trí, không phải dò suốt chuỗi. Tuy nhiên nếu bạn muốn thử nghề pattern của mình thì thử viết pattern sao cho nó phải mò ít nhất (tức là phải hy sinh cái đặc tính "generalised/regular" của nó).

Thực ra, chủ thớt không chịu đưa ra cách cho mã nên mới rắc rối. Loại bài này giải quyết từ trên ngọn xuống gốc, cứ dựa trên cách cho mã mà tách lấy số mã, nhóm thành lô.

Chú: cách dò mã của bài #2 là cách đúng đắn. Tuy nhiên nó bị khuyết điểm là mỗi mã lại phải dò 1 lần. Nếu hàm Find thoát ra lúc dò thấy mã thì số lượt dò cells trung bình là (số cells)/2 * (số mã). Nếu số mã bị thiếu nhiều thì cách này tiến dần đến (số cells)*(số mã)
 
Upvote 0
Đây là dạng mã có hệ thống cố định. Đặc biệt là các nhóm mã có số ký tự giống nhau.
Loại dạng này dùng các hàm string hiệu quả hơn RegEx - vì nó bốc chính xác theo vị trí, không phải dò suốt chuỗi. Tuy nhiên nếu bạn muốn thử nghề pattern của mình thì thử viết pattern sao cho nó phải mò ít nhất (tức là phải hy sinh cái đặc tính "generalised/regular" của nó).

Thực ra, chủ thớt không chịu đưa ra cách cho mã nên mới rắc rối. Loại bài này giải quyết từ trên ngọn xuống gốc, cứ dựa trên cách cho mã mà tách lấy số mã, nhóm thành lô.

Chú: cách dò mã của bài #2 là cách đúng đắn. Tuy nhiên nó bị khuyết điểm là mỗi mã lại phải dò 1 lần. Nếu hàm Find thoát ra lúc dò thấy mã thì số lượt dò cells trung bình là (số cells)/2 * (số mã). Nếu số mã bị thiếu nhiều thì cách này tiến dần đến (số cells)*(số mã)
Bài 2 đang cố định số kí tự của số lượng lô, mà theo chủ topic nói nó sẽ thay đổi tôi dùng regexp chủ yếu để xác định số lượng lô , tuy nhiên 4 yếu tố mà chỉ có 1 yếu tố thay đổi thì đổi thì như bạn nói dùng các hàm string vẫn có thể xác định được số lượng lô, nhưng nếu từ 2 yếu tố trở đi thì tôi nghĩ dùng regexp sẽ hợp lý hơn, thật ra là ý tưởng lúc đầu là đã dùng regexp vì nghĩ rằng số lượng lô và số lô cũng thay đổi, nên chỉ chỉnh lại pattern sẽ nhanh hơn làm lại code.
 
Upvote 0
Bài 2 đang cố định số kí tự của số lượng lô, mà theo chủ topic nói nó sẽ thay đổi tôi dùng regexp chủ yếu để xác định số lượng lô , tuy nhiên 4 yếu tố mà chỉ có 1 yếu tố thay đổi thì đổi thì như bạn nói dùng các hàm string vẫn có thể xác định được số lượng lô, nhưng nếu từ 2 yếu tố trở đi thì tôi nghĩ dùng regexp sẽ hợp lý hơn, thật ra là ý tưởng lúc đầu là đã dùng regexp vì nghĩ rằng số lượng lô và số lô cũng thay đổi, nên chỉ chỉnh lại pattern sẽ nhanh hơn làm lại code.
Nếu luật mã số có xác định rõ ràng thì loại bài này làm bằng Access là dễ nhất. Group loại mã, right join với số từ 1 đến N, lấy ra các số thiếu.
 
Upvote 0
Em xin gửi bác 3 model ví dụ thực tế dữ liệu nhà em ạ.
Nếu chỉ thay đổi số seri thì có thể chạy code này tôi làm bên sheet Model A, các model khác tương tự:
Mã:
Sub a()
Dim wf As WorksheetFunction, rng As Range, nmin As Long, nmax As Long, res_seri, res, cell As Range
Set wf = WorksheetFunction
Set rng = Range("C3:C" & [C100000].End(xlUp).Row)
ReDim res_seri(0 To rng.Rows.Count - 1): ReDim res(0 To 0)
For i = 1 To rng.Rows.Count
    res_seri(i - 1) = CLng(Right(rng(i, 1).Value, 7))
Next
nmin = wf.Min(res_seri): nmax = wf.Max(res_seri)
For i = nmin To nmax
    Set cell = rng.Find("*" & i, , xlValues)
    If cell Is Nothing Then
        res(UBound(res)) = Format(i, "0000000")
        ReDim Preserve res(UBound(res) + 1)
    End If
Next
[F3].Resize(UBound(res), 1) = wf.Transpose(res)
End Sub
 
Upvote 0
Web KT
Back
Top Bottom