Tìm số chạy lớn nhất.

Liên hệ QC

auvfei

Thành viên mới
Tham gia
29/6/10
Bài viết
28
Được thích
1
Chào các bác,

E có 1 file quản lý code hàng (khá nhiều dòng).
Kết cấu của code hàng như sau: [đầu ngữ code]+["-"]+[số chạy]+[đuôi]

-Đầu ngữ code là ký tự viết tắt của nhiều loại hàng hóa >>> chiều dài cũng như cách lập ko theo quy luật.
-Số chạy là số tự nhiên >0
-Đuôi là tên địa điểm lưu hàng, ở đây có 4 loại: YL, GMD, VS, "hoặc ko có"

Yêu cầu công việc của e là tìm số chạy lớn nhất hiện có để e có thể tiếp tục tạo code hàng có số chạy tiếp theo cho các đơn về sau (phần đầu và đuôi vẫn giữ nguyên). Hiện e cũng đang sử dụng công thức như trong bảng tính đính kèm. Phần công thức này cơ bản là đáp ứng được yc, tuy nhiên e thấy nó hơi rối, bên cạnh đó sheet bắt đầu trở lên chậm khi e có quá nhiều dòng dữ liệu

Vậy e nhờ các bác hỗ trợ e 1 marco để tìm số chạy nhanh hơn khi cho [đầu ngữ] và [đuôi].

E cảm ơn,
 

File đính kèm

  • Tim số chạy lớn nhất.xlsx
    113.2 KB · Đọc: 14
Đúng là như thế đó bạn, trong TH này thì phần đầu sẽ là: "ABB1-28153-22.4.20" còn phần đuôi là "không có gì". Số chạy đc xác định sau dấu "-" thứ 3.
Vậy theo bạn, nhìn vào làm sao để biết số "-28153" không phải là "số chạy"? Người nhìn còn khó hình dung thì sao viết được bạn
 
Upvote 0
Cách dễ nhất: Tạo một sheet mới. Chỉ có một cột là cột code đã chặt cái đuôi đi, và sort Z-A
 
Upvote 0
Vậy theo bạn, nhìn vào làm sao để biết số "-28153" không phải là "số chạy"? Người nhìn còn khó hình dung thì sao viết được bạn
Như trong file của mình thì mình đã phải nhập thông tin của phần đầu của phần đuôi rồi, lúc đó cũng coi như là bước xác định cấu trúc của code. TH này mình sẽ nhập:
Phần đầu code là: ABB1-28153-22.4.20
Phần đuôi code là: {blank}

Thực tế ban đầu mình cũng đã làm bằng cách thủ công khi sử dụng filter phần đầu code, sau đó "dò trên bảng sổ xuống", nhưng cách này khá mất thời gian. Sau đó mình mới viết công thức kia để tìm cho tiện hơn.
 
Upvote 0
Số chạy 1 2 3
 

File đính kèm

  • so lon nhat_.xlsx
    57.7 KB · Đọc: 7
Upvote 0
Cảm ơn bác, nhưng khi E test với 1 vài trường hợp nhưng nó lúc chạy lúc không hoặc lại ra kết quả bị sai.

VD như nhóm code: AIFK1-xxxYL, ACIZ1-xxxYL, ... >>> e thấy ra kết quả là 1828
Bài đã được tự động gộp:

Cách dễ nhất: Tạo một sheet mới. Chỉ có một cột là cột code đã chặt cái đuôi đi, và sort Z-A
Thực ra cách này e cũng đã từng làm, tuy nhiên lại phải qua 1 vài bước copy và "chặt đuôi" ... nữa bác ạ :)
 
Upvote 0
Như trong file của mình thì mình đã phải nhập thông tin của phần đầu của phần đuôi rồi, lúc đó cũng coi như là bước xác định cấu trúc của code. TH này mình sẽ nhập:
Phần đầu code là: ABB1-28153-22.4.20
Phần đuôi code là: {blank}

Thực tế ban đầu mình cũng đã làm bằng cách thủ công khi sử dụng filter phần đầu code, sau đó "dò trên bảng sổ xuống", nhưng cách này khá mất thời gian. Sau đó mình mới viết công thức kia để tìm cho tiện hơn.
Bạn thử xem
Mã:
=AGGREGATE(14,6,--SUBSTITUTE(SUBSTITUTE(A5:A3599,D2&"-",""),D3,""),1)
 
Upvote 0
Vậy e nhờ các bác hỗ trợ e 1 marco để tìm số chạy nhanh hơn khi cho [đầu ngữ] và [đuôi].
Theo yêu cầu
Mã:
Function MaxOfCode(ByVal aCode As Variant, ByVal sPrefix As String, ByVal sSuffix As String) As Long
Static oReg As Object
Dim i As Long, lTmp As Long
If oReg Is Nothing Then
    Set oReg = CreateObject("VBScript.RegExp")
    oReg.IgnoreCase = True
End If
oReg.Pattern = "^" & sPrefix & "-(\d+)" & sSuffix & "$"
aCode = aCode
For i = 1 To UBound(aCode, 1)
    If oReg.test(aCode(i, 1)) Then
        lTmp = CLng(oReg.Replace(aCode(i, 1), "$1"))
        If lTmp > MaxOfCode Then MaxOfCode = lTmp
    End If
Next
End Function
Mã:
D4=MaxOfCode(A5:A3599,D2,D3)
 
Upvote 0
1601463502622.png
Cảm ơn bác, CT này chạy nhanh và chuẩn xác hơn rồi đó ạ!
công thức trên dựa vào giả thiết số đứng riêng rẽ, không có lẫn dấu chấm hoặc ký tự gì khác.
Nếu code ACIMO1-29.8.20-01 thì số là cái gì?
Nếu code AIDU1-N11-VS01 (dòng 3470) thì số là cái gì?
Muốn công thức ấy chạy đúng, nó phải bỏ cái chỗ "-" ra và tiếp đầu của code phải là có cả dấu "-" hoặc "." nếu cần
 
Lần chỉnh sửa cuối:
Upvote 0
"Tiếp đầu ngữ" chứ không chỉ "tiếp đầu", và tiếp đầu ngữ đi với "tiếp vĩ ngữ" chứ không đi với đuôi.
 
Upvote 0
Vậy chắc tác giả bài đăng nên lập danh sách duy nhất của 'tiếp đầu' cái đã
Có danh sách này rồi thì vấn đề còn lại như trở bàn tay mà thôi
Mà cũng phải lưu ý là những tiếp đầu này không chứa 1 tiếp đầu khác.; Ví dụ Đã có ABBA thì không thể có ABBAC hay ABBAE,. . . . được.
Lúc đó phải là ABBA_ & ABBAC, ABBAE,. . . .
 
Upvote 0
công thức trên dựa vào giả thiết số đứng riêng rẽ, không có lẫn dấu chấm hoặc ký tự gì khác.
Nếu code ACIMO1-29.8.20-01 thì số là cái gì?
Nếu code AIDU1-N11-VS01 (dòng 3470) thì số là cái gì?
Muốn công thức ấy chạy đúng, nó phải bỏ cái chỗ "-" ra và tiếp đầu của code phải là có cả dấu "-" hoặc "." nếu cần
Sorry các bác, tuần vừa rồi bận quá e ko vào trang này đc.
Về logic đánh code thì như e giải thích ở trên, tuy nhiên thú thực là đôi lúc cũng bị "out of rule" vì một số lý do "khách quan trong lịch sử" 1 chút. Về hiện tại e cũng đang cố gắng bám vào rule này 1 cách triệt để nhất để quản lý code đc tốt hơn.

Về câu hỏi của bác e giải thích 2 TH như bác đề cập:
Nếu code ACIMO1-29.8.20-01 thì số là cái gì? >>> số là "01", "vĩ ngữ" thì ko có vì hàng này ko có địa điểm lưu hàng cụ thể.
Nếu code AIDU1-N11-VS01 (dòng 3470) thì số là cái gì? >> số là 01, "Vĩ ngữ" là VS tuy nhiên TH này hơi đặc biệt 1 chút nên e phải để như thế để có thể nhớ theo cách hiểu của mình >>> Về những TH như thế này nó ko nằm theo logic trên nên các bác cũng ko nên quá bận tâm với e nó quá. :)

Vậy chắc tác giả bài đăng nên lập danh sách duy nhất của 'tiếp đầu' cái đã
Có danh sách này rồi thì vấn đề còn lại như trở bàn tay mà thôi
Mà cũng phải lưu ý là những tiếp đầu này không chứa 1 tiếp đầu khác.; Ví dụ Đã có ABBA thì không thể có ABBAC hay ABBAE,. . . . được.
Lúc đó phải là ABBA_ & ABBAC, ABBAE,. . . .
Thực ra vấn đề này e bị vướng do tính chất lịch sử của logic đặt "đầu ngữ", sở dĩ ban đầu cách đặt "đầu ngữ" này với mục đích:
- có đc tên hàng ngắn gọn nhất trên file quản lý.
- Bất kể ai cũng có thể nhìn vào code để biết đc luôn tên hàng (tên hàng thật của e có rât nhiều loại và dài dòng)
- Phân biệt được Lot, ngày sản xuất, ngày nhập kho, ngày phát hiện lỗi, ... đối với 1 số các nhóm mã hàng. VD: ACIZ1-17.6.20-xx; PSDBMTL20-xxx; ...
- ....
Vì cái này khá rắc rối (có tính chất đặc thù công việc) nên e ko share hết để các bác đỡ confused nên mới sinh ra cái "Đầu ngữ" là vì thế :)

Vì bên e cũng chỉ áp dụng excel để quản lý nên việc đặt code này ban đầu xuất phát nhiều do yc công việc là chủ yếu mà cũng ko có suy nghĩ là việc đặt code này có gây khó khăn nếu quản lý bằng hệ thống hay không (??). Vậy nên, e cũng rất mong muốn các bác tư vấn giúp e về vấn đề này để e có thể áp dụng vào thực tế trong cv (như logic của mình) nhưng cũng sẽ ko bị conflict quá nhiều nếu áp dụng CNTT
Bài đã được tự động gộp:

Theo yêu cầu
Mã:
Function MaxOfCode(ByVal aCode As Variant, ByVal sPrefix As String, ByVal sSuffix As String) As Long
Static oReg As Object
Dim i As Long, lTmp As Long
If oReg Is Nothing Then
    Set oReg = CreateObject("VBScript.RegExp")
    oReg.IgnoreCase = True
End If
oReg.Pattern = "^" & sPrefix & "-(\d+)" & sSuffix & "$"
aCode = aCode
For i = 1 To UBound(aCode, 1)
    If oReg.test(aCode(i, 1)) Then
        lTmp = CLng(oReg.Replace(aCode(i, 1), "$1"))
        If lTmp > MaxOfCode Then MaxOfCode = lTmp
    End If
Next
End Function
Mã:
D4=MaxOfCode(A5:A3599,D2,D3)
cảm ơn bác, chắc e sẽ nghiên cứu dần dần cái này. :):)
 
Upvote 0
Tôi chấm dứt liên hệ với thớt này ở đây. Để giảm thiểu sự phí phạm thì giờ và công sức mọi người, tôi xin phép miễn giải thích.
 
Upvote 0
Web KT
Back
Top Bottom