vutienloc99
Thành viên mới

- Tham gia
- 9/11/09
- Bài viết
- 22
- Được thích
- 0

Công thức đơn giản cũng được mà, đâu cần codeXin chào!
Em có dữ liệu đầu vào như bảng bên dưới:
View attachment 128478
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:
View attachment 128479
Cảm ơn các Bác
File đính kèm:

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 điCả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
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.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.
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ả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.
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

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$22,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


Vậy bạn thử code này xem005 Bác ơi, Cảm ơn Bác nhé.
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
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![]()
Ở 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 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?
Ý 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.Ở 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.

(chút xíu nữa e mới thử code mới của Bác)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.