Cần giúp code sinh mã trong ô trống (2 người xem)

Người dùng đang xem chủ đề này

vutienloc99

Thành viên mới
Tham gia
9/11/09
Bài viết
22
Được thích
0
Xin chào!
Em có dữ liệu đầu vào như bảng bên dưới:
DATA.JPG
Em muốn code VBA để phát sinh mã ở những ô TRỐNG trong CỘT SoTT (do một số ô đã có mã rồi), Kết quả mong muốn:
KQ.jpg

Cảm ơn các Bác

File đính kèm:
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
thử công thức sau cho D2
Mã:
=text(countif(C$2:c2,c2),"000")

copy cho các ô tiếp
 
Upvote 0
Cảm ơn 2 Bác Ba Tê và MuaBuiRoi, nhưng mã phát sinh e muốn dựa trên CẢ 3 CỘT khachHang NhaCungCap, SanPham công thức các Bác cho e chỉ xét trên cột SanPham, và như e đã trình bày ở trên, một số MÃ đã có sẵn rồi nên e muốn chỉ phát sinh mã ở ô nào còn TRỐNG trong cột SoTT thôi nên muốn được giúp code VBA, các Bác vui lòng hướng dẫn thêm e nhé. Cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn 2 Bác Ba Tê và MuaBuiRoi, nhưng mã phát sinh e muốn dựa trên CẢ 3 CỘT khachHang NhaCungCap, SanPham công thức các Bác cho e chỉ xét trên cột SanPham, và như e đã trình bày ở trên, một số MÃ đã có sẵn rồi nên e muốn chỉ phát sinh mã ở ô nào còn TRỐNG trong cột SoTT thôi nên muốn được giúp code VBA, các Bác vui lòng hướng dẫn thêm e nhé. Cảm ơn
Cái gì cũng cần "thấy" mới hiểu. Bạn gởi file có dữ liệu giống thật lên đi
Mã có rồi mặt mũi nó ra sao, mã chưa có cần điền vào theo quy luật thế nào?
Đoán mò mất thời gian.
v.v.v.v...
 
Upvote 0
Bác vui lòng xem file đính kèm nhé. Cảm ơn Bác đã nhiệt tình giúp e.
File đính kèm:
 

File đính kèm

Upvote 0
Bác vui lòng xem file đính kèm nhé. Cảm ơn Bác đã nhiệt tình giúp e.
File đính kèm:
Mình thấy công thức đơn giản mà, code làm gì. Do bạn đã có một số ô có thứ tự rồi nên mình insert cột phụ D.
D2=Text(1,"000")
D3=IF(AND(A3=A2,B3=B2,C3=C2),TEXT(D2+1,"000"),"001")
Fill xuống rồi copy, paste value sang cột E, xóa cột D đi.
Nếu bạn vẫn muốn vba thì record macro.
 
Upvote 0
Mình thấy công thức đơn giản mà, code làm gì. Do bạn đã có một số ô có thứ tự rồi nên mình insert cột phụ D.
D2=Text(1,"000")
D3=IF(AND(A3=A2,B3=B2,C3=C2),TEXT(D2+1,"000"),"001")
Fill xuống rồi copy, paste value sang cột E, xóa cột D đi.
Nếu bạn vẫn muốn vba thì record macro.

Cảm ơn đã trả lời, nhưng công thức trên không dùng được Bác ơi, do dữ liệu được ghi thêm mỗi ngày và KHÔNG được sắp xếp, hơn nữa em muốn Mã chỉ phát sinh 1 lần và không thay đổi nữa nên nhất định không thể dùng công thức được, nên em muốn các Bác giúp đỡ code VBA. Thanks
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn đã trả lời, nhưng công thức trên không dùng được Bác ơi, do dữ liệu được ghi thêm mỗi ngày và KHÔNG được sắp xếp.
Bạn thêm cột phụ D, E. Cột D nhập công thức D2=A2 & B2 & C2 rồi fill xuống.
Cột E nhập công thức E2 = TEXT(COUNTIF($D$2:D2,D2),"000") rồi fill xuống.
Copy cột E, paste value sang F rồi xóa cột phụ D, E đi.
Nếu bạn muốn vba thì có thể dùng dictionary
Mã:
Sub danhso()
Dim dic As Object, i As Long, s As String
Dim arr()
Set dic = CreateObject("scripting.dictionary")
arr = Range("A2:D" & Range("A65536").End(xlUp).Row)
For i = 1 To UBound(arr)
s = arr(i, 1) & arr(i, 2) & arr(i, 3)
dic.Item(s) = dic.Item(s) + 1
arr(i, 4) = dic.Item(s)
Next
Range("A2:D" & Range("A65536").End(xlUp).Row) = arr
Range("D:D").NumberFormat = "000"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thêm cột phụ D, E. Cột D nhập công thức D2=A2 & B2 & C2 rồi fill xuống.
Cột E nhập công thức E2 = TEXT(COUNTIF($D$2:D2,D2),"000") rồi fill xuống.
Copy cột E, paste value sang F rồi xóa cột phụ D, E đi.
Nếu bạn muốn vba thì có thể dùng dictionary
Mã:
Sub danhso()
Dim dic As Object, i As Long, s As String
Dim arr()
Set dic = CreateObject("scripting.dictionary")
arr = Range("A2:D" & Range("A65536").End(xlUp).Row)
For i = 2 To UBound(arr)
s = arr(i, 1) & arr(i, 2) & arr(i, 3)
dic.Item(s) = dic.Item(s) + 1
arr(i, 4) = dic.Item(s)
Next
Range("A2:D" & Range("A65536").End(xlUp).Row) = arr
Range("D:D").NumberFormat = "000"
End Sub

Cảm ơn Bác rất nhiều, kết quả giống 99% ý của em rồi, em muốn hỏi thêm xíu nữa là trong lần tới cập nhật thêm dữ liệu thì em chỉ muốn tạo Mã cho ô nào còn TRỐNG trong cột SoTT thôi nhé (tức là Mã chỉ tạo 1 lần duy nhất, dù có thêm xóa sửa gì thì code cũ đã tạo ra vẫn k thay đổi) Bác vui lòng hướng dẫn thêm e nhé. Vui quá, công việc của e giảm đi rất nhiều rồi. Thanks /-*+/
 
Upvote 0
Vậy trường hợp có những số thứ tự không theo quy luật thì số tiếp theo đánh thế nào? Ví dụ nếu có bảng
...A B C D
1 a b c 001
2 a b c 002
3 a b c 004
4 a b c ???
Chỗ ??? bạn sẽ điền là gì? Nếu đếm từ trên cùng xuống thì sẽ là 004, còn đếm tiếp từ dòng thứ 3 sẽ được 005?
 
Upvote 0
005 Bác ơi, Cảm ơn Bác nhé.
Vậy bạn thử code này xem
Mã:
Sub danhso()
Dim dic As Object, i As Long, s As String
Dim arr()
Set dic = CreateObject("scripting.dictionary")
arr = Range("A2:D" & Range("A65536").End(xlUp).Row)
For i = 1 To UBound(arr)
s = arr(i, 1) & arr(i, 2) & arr(i, 3)
If arr(i, 4) = 0 Then
dic.Item(s) = dic.Item(s) + 1
arr(i, 4) = dic.Item(s)
Else
dic.Item(s) = arr(i, 4)
End If
Next
Range("A2:D" & Range("A65536").End(xlUp).Row) = arr
Range("D:D").NumberFormat = "000"
End Sub
 
Upvote 0
005 Bác ơi, Cảm ơn Bác nhé.

Cảm ơn Bác rất nhiều, kết quả giống 99% ý của em rồi, em muốn hỏi thêm xíu nữa là trong lần tới cập nhật thêm dữ liệu thì em chỉ muốn tạo Mã cho ô nào còn TRỐNG trong cột SoTT thôi nhé (tức là Mã chỉ tạo 1 lần duy nhất, dù có thêm xóa sửa gì thì code cũ đã tạo ra vẫn k thay đổi) Bác vui lòng hướng dẫn thêm e nhé. Vui quá, công việc của e giảm đi rất nhiều rồi. Thanks /-*+/
Vậy trường hợp có những số thứ tự không theo quy luật thì số tiếp theo đánh thế nào? Ví dụ nếu có bảng
...A B C D
1 a b c 001
2 a b c 002
3 a b c 004
4 a b c ???
Chỗ ??? bạn sẽ điền là gì? Nếu đếm từ trên cùng xuống thì sẽ là 004, còn đếm tiếp từ dòng thứ 3 sẽ được 005?
Ở trên bạn nói là dù xoá, sửa... thì code cũ đã tạo ra rồi vẫn không thay đổi?
Vậy tôi sửa
3 a b c 004
thành
3 a b c 003
STT tiếp theo vẫn là 005?
Cái 004 bị xoá, sửa sẽ vẫn giữ đúng không? Giữ vào đâu?
 
Lần chỉnh sửa cuối:
Upvote 0
Ở trên bạn nói là dù xoá, sửa... thì code cũ đã tạo ra rồi vẫn không thay đổi?
Vậy tôi sửa
3 a b c 004
thành
3 a b c 003
STT tiếp theo vẫn là 005?
Cái 004 bị xoá, sửa sẽ vẫn giữ đúng không? Giữ vào đâu?
Ý tác giả là những ô trong cột D đã có STT rồi thì không đánh lại nữa, chỉ điền STT vào những ô trống. Như trong ví dụ nếu D3= 003, D4="" thì sẽ điền 004 vào D4.
 
Upvote 0
Ý tác giả là những ô trong cột D đã có STT rồi thì không đánh lại nữa, chỉ điền STT vào những ô trống. Như trong ví dụ nếu D3= 003, D4="" thì sẽ điền 004 vào D4.

Theo tôi thì chủ thớt chưa thấu đáo được sự phức tạp trong yêu cầu của mình.
Chơi trò xoá sửa rất phức tạp.
Ví dụ
1 abc 001
2 abc 002
3 abc 003
Bây giờ tôi sửa xoá thành
1 abc 001
2 abc
3 abc 003
4 abc
Thì ở dòng thứ 2 có ghi số lại hay không? Và nếu ghi lại thì ghi 002 hay là 004?

Kỹ thuật đánh số trám vào lỗ hổng gần như hoàn toàn khác với kỹ thuật đánh số tiếp tục. Nếu không xác định từ đầu, có thể code phải viết lại hoàn toàn.
 
Upvote 0
Cảm ơn mọi người đã giúp đỡ, đặc biệt Bác Hau151978 - Bác hiểu ý em /-*+/ (chút xíu nữa e mới thử code mới của Bác)
 
Lần chỉnh sửa cuối:
Upvote 0
Vấn đề còn là mã đã bị xóa của những ngày hôm trước có còn được xài lại hay không?

Nếu không được xài lại thì ta lại fải ghi những mã đã xóa rồi vô nơi cực lạc nào đó; & 1 khi cần trám lỗ trống bằng 1 mã mới thì lại lôi thêm cả miền "cực lạc" đó ra mà tra để tránh trùng.
 
Upvote 0
Vấn đề còn là mã đã bị xóa của những ngày hôm trước có còn được xài lại hay không?

Nếu không được xài lại thì ta lại fải ghi những mã đã xóa rồi vô nơi cực lạc nào đó; & 1 khi cần trám lỗ trống bằng 1 mã mới thì lại lôi thêm cả miền "cực lạc" đó ra mà tra để tránh trùng.

Như tôi đã nêu trên, có 2 cách. Và 2 cách dùng giải thuật khác nhau cho nên phải xác đinh trước cách nào:

1. nếu không dùng lại số: Giải thuật rất dễ, chỉ việc tìm số lớn nhất hiện tại của mỗi loại mã và bắt đầu từ đó.

2. nếu dùng lại số: giải thuật rất rắc rối. Mỗi mã phải có một danh sách cho biết các số nào đang được dùng. Cách dễ nhất là dùng một sheet phụ để chép chúng. Cách khó hơn, nhưng nhanh hơn một chút là dùng Dictionary với items ở dạng mảng số nguyên.

Đây là tôi đối thoại với bạn. Chứ chủ thớt đã có đáp án rồi.
 
Upvote 0

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

Back
Top Bottom