Nhờ mọi người giúp Em!Tự động sinh mã số khách hàng khi thêm mới

Ducvu

Yêu THVBA
Em đang tìm hiểu về VBA có gặp vấn đề như sau nhờ mọi người giúp đỡ ạ
Em đã tạo được form thêm mới thông tin khách hàng tuy nhiên có phần mã khách hàng, em chưa biết cách nào để mã nó tự động sinh tăng dần ví dụ từ 0001,0002... và mã của khách hàng thì không được trùng nhau.

mọi người biết cách nào chia sẻ giúp Em với ạ. Cảm ơn mọi người
 
D

Deleted member 1392

Guest
Dữ liệu khách hàng đó bạn lưu trên Sheet đúng không?. Nếu đúng thì chỉ cần bạn lấy số lớn nhất trong khoảng Range rồi + 1.
VD: bạn có dữ liệu cột A là cột mã khách hàng thì dùng code:
Mã:
Sub Get_MKH()
Dim lr, MKH As Long

With ThisWorkbook.Sheets("Sheet1")

    '//Dòng cuối cột A
    lr = .Cells(.Rows.Count, "A").End(xlUp).Row
  
    '//Mã khách hàng mới
    MKH = Application.WorksheetFunction.Max(.Range("A1:A" & lr)) + 1
End With
End Sub
 

Ducvu

Yêu THVBA
Dữ liệu khách hàng đó bạn lưu trên Sheet đúng không?. Nếu đúng thì chỉ cần bạn lấy số lớn nhất trong khoảng Range rồi + 1.
VD: bạn có dữ liệu cột A là cột mã khách hàng thì dùng code:
Mã:
Sub Get_MKH()
Dim lr, MKH As Long

With ThisWorkbook.Sheets("Sheet1")

    '//Dòng cuối cột A
    lr = .Cells(.Rows.Count, "A").End(xlUp).Row
 
    '//Mã khách hàng mới
    MKH = Application.WorksheetFunction.Max(.Range("A1:A" & lr)) + 1
End With
End Sub
Bác giúp EM với Em rối quá. Mã khách hàng em để ở cột M và chỉ cần là số tự nhiên thôi ạ. Em cảm ơn
 
D

Deleted member 1392

Guest
Cho thêm code ở trên của tôi, rồi gọi nó mỗi khi mở form thêm khách hàng và sau khi lưu khách hàng mới
Của bạn
 

Ducvu

Yêu THVBA
Cho thêm code ở trên của tôi, rồi gọi nó mỗi khi mở form thêm khách hàng và sau khi lưu khách hàng mới
Của bạn
Ôi Em cảm ơn bác ạ, mò mãi qua tới nay xem đủ các video mà không hiểu :3
 

Ducvu

Yêu THVBA
Cho thêm code ở trên của tôi, rồi gọi nó mỗi khi mở form thêm khách hàng và sau khi lưu khách hàng mới
Của bạn
Bác có thể cho em hỏi thêm là em muốn thêm dòng công thức này "=IF(L6=0,"",IF(C6>90,"Quá hạn",IF(C6>60,"Sắp hết hạn","Còn hạn")))" vào một ô khi thêm mới thì làm thế nào ạ. vì thêm mới nên em không biết là nó là c6 hay c7 để so sánh.
 
D

Deleted member 1392

Guest
@Ducvu Có 3 cách:
1: Là bác dùng if then trực tiếp trong code rồi trả kết quả
2: Là bác gán thẳng công thức vào ô
3: Là Fill công thức có sẵn từ ô nào đó Fill xuống

Tôi sẽ đi từng trường hợp cho bạn:
1. Nếu bác dùng if then trong code thì sẽ như thế này
Mã:
Dim a as string
With Thisworkbook.Sheets("CHKD")
    if .Range("L6").value = 0 then
        a = 0
    elseif .Range("C6") > 90 then
        a = "Quá hạn"
    Elseif .Range("C6") > 60 then
        a = "Sắp hết hạn"
    Else
        a = "Còn hạn"
    End if
End With
Tuy nhiên,Trong VBA không thể nhập trực tiếp Tiếng Việt có dấu khi viết code nên các chữ có dấu sẽ bị "?". Để giải quyết vấn đề này bạn cần cho nó qua 1 hàm trung gian để chuyển đổi, vui lòng tham khảo .

2.
Để gán công thức vào ô bất kể nó ở dòng nào cũng đúng thì bạn cần chèn nó dưới dạng R1C1. R1C1 được hiểu như ô được tham chiều sẽ cách ô hiện tại bao nhiêu dòng và bao nhiêu cột. Để có được công thức dạng này bạn xem cách tôi làm dưới dùng Record macro.
Bạn cần đăng nhập để thấy hình ảnh

Tuy nhiên, cách này vẫn sẽ bị lỗi đối với các chữ có dấu như cách 1.

3. Fill công thức từ trên xuống dưới
Đây là cách đơn giản nhất đối với cách trường hợp dữ liệu liên tục trong 1 cột.
Ví dụ: Ô B6 của bạn đang có chứa sẵn công thức như trên và bạn cần chèn nó thêm vào ô B7 thì làm như sau:
Mã:
Dim iR As Long
'//ĐÂY LÀ DÒNG CUỐI CẦN THÊM CÔNG THỨC
iR = 7

'//FILL CÔNG THỨC BẮT ĐẦU TỪ Ô B6 CHO TỚI Ô B DÒNG iR
Range("B6").AutoFill Destination:=Range("B6:B" & iR), Type:=xlFillDefault
 

Ducvu

Yêu THVBA
@Ducvu Có 3 cách:
1: Là bác dùng if then trực tiếp trong code rồi trả kết quả
2: Là bác gán thẳng công thức vào ô
3: Là Fill công thức có sẵn từ ô nào đó Fill xuống

Tôi sẽ đi từng trường hợp cho bạn:
1. Nếu bác dùng if then trong code thì sẽ như thế này
Mã:
Dim a as string
With Thisworkbook.Sheets("CHKD")
    if .Range("L6").value = 0 then
        a = 0
    elseif .Range("C6") > 90 then
        a = "Quá hạn"
    Elseif .Range("C6") > 60 then
        a = "Sắp hết hạn"
    Else
        a = "Còn hạn"
    End if
End With
Tuy nhiên,Trong VBA không thể nhập trực tiếp Tiếng Việt có dấu khi viết code nên các chữ có dấu sẽ bị "?". Để giải quyết vấn đề này bạn cần cho nó qua 1 hàm trung gian để chuyển đổi, vui lòng tham khảo .

2.
Để gán công thức vào ô bất kể nó ở dòng nào cũng đúng thì bạn cần chèn nó dưới dạng R1C1. R1C1 được hiểu như ô được tham chiều sẽ cách ô hiện tại bao nhiêu dòng và bao nhiêu cột. Để có được công thức dạng này bạn xem cách tôi làm dưới dùng Record macro.
Bạn cần đăng nhập để thấy hình ảnh

Tuy nhiên, cách này vẫn sẽ bị lỗi đối với các chữ có dấu như cách 1.

3. Fill công thức từ trên xuống dưới
Đây là cách đơn giản nhất đối với cách trường hợp dữ liệu liên tục trong 1 cột.
Ví dụ: Ô B6 của bạn đang có chứa sẵn công thức như trên và bạn cần chèn nó thêm vào ô B7 thì làm như sau:
Mã:
Dim iR As Long
'//ĐÂY LÀ DÒNG CUỐI CẦN THÊM CÔNG THỨC
iR = 7

'//FILL CÔNG THỨC BẮT ĐẦU TỪ Ô B6 CHO TỚI Ô B DÒNG iR
Range("B6").AutoFill Destination:=Range("B6:B" & iR), Type:=xlFillDefault
Dạ để em mô tả kỹ hơn ạ. File thêm mới khách hàng vừa nãy có cột G là cột tình trạng, Em muốn thì thêm khách hàng mới thì điền luôn công thức vào cộ G đó. để so sánh ngày chăm sóc với này hiện tại xem còn hạn hay quá hạn chăm sóc rồi.
Bình thường ở ẽccell thì em có thể điền công thức vào ô đó và kéo cho các ô tiếp theo thì nó tự cập nhật cho các dòng tiếp theo để so sánh. Em muốn điền công thức sẵn khi thêm mới vào ô ở cột G để nó so sánh hằng ngày xem quá hạn hay còn hạn ạ
 

Ducvu

Yêu THVBA
Em đã làm theo cách số 3 và được rồi ạ, cảm ơn bác.
Bác cho EM hỏi thêm là khi em cập nhật lại thông tin trong listbox cho dòng Em đang chọn, sau khi cập nhật xong dữ liệu thì nó vẫn lưu về dòng vừa chọn. tuy nhiên dòng chọn (màu xanh) nó lại nhảy về dòng đầu tiền rất bất cập để chỉnh sửa các dòng tiếp theo vì phải kéo chuột xuống tìm từ đầu có cách nào khắc phục không ạ
 
D

Deleted member 1392

Guest
Tải về thử xem bạn. Tôi lưu lại vị trí dòng đang chọn trong Listbox lúc đầu và cho nó chọn lại vào lúc cuối.
 
Top