Cách hiện dữ liệu trong ô cuối hàng A vào textbox trong userform

Liên hệ QC

brachiosaurus

Thành viên mới
Tham gia
15/6/17
Bài viết
30
Được thích
5
Giới tính
Nữ
Chào mọi người! Mình có nhu cầu khi ấn vào nút tạo phiếu thì tại dòng cuối cột A sẽ tạo mã tự động và cùng lúc đó mã đấy sẽ đc hiển thị trên ô Số phiếu phân tích trong userform hiện ra ngay sau. Phần làm mã tự động mình đã làm đc nhưng để mã đó hiện trên ô Số phiếu phân tích thì tìm mãi ko ra giải pháp. Mong mọi ng trợ giúp mình có gửi kèm cả file đang làm ở dưới nhé. Mình cảm ơn
 

File đính kèm

Chào mọi người! Mình có nhu cầu khi ấn vào nút tạo phiếu thì tại dòng cuối cột A sẽ tạo mã tự động và cùng lúc đó mã đấy sẽ đc hiển thị trên ô Số phiếu phân tích trong userform hiện ra ngay sau. Phần làm mã tự động mình đã làm đc nhưng để mã đó hiện trên ô Số phiếu phân tích thì tìm mãi ko ra giải pháp. Mong mọi ng trợ giúp mình có gửi kèm cả file đang làm ở dưới nhé. Mình cảm ơn
Tìm từ khóa : tìm ô cuối của hàng, cột bằng VBA
Là có thể hiểu
 
Upvote 0
Bạn đã xài form trong file; Nhưng file lại có những điểm không đạt hay sẽ gây khó khăn cho bạn lúc vận hành:
(1) Tên trang tính có dấu tiếng Việt; Cũng không nhất thiết gán tên trang quá dài như vậy; Hãy bắt chước người ta gán mã chứng khoán thì hay hơn;
(2) Trong 1 cột không thể có 2 loại/kiểu dữ liệu (vừa dạng chuỗi vừa dạng số)
Nếu là số thì dễ; Nếu dạng chuỗi như YYYY-#### thì tách chuỗi 4 kí số cuối ra; Sau đó biến nó thành 1 số & đem cọng với 1
Sau đó lại biến lại thành chuỗi kí số & nối vô 5 kí tự trước của mã phiếu ngay trước nó
 
Lần chỉnh sửa cuối:
Upvote 0
Chào mọi người! Mình có nhu cầu khi ấn vào nút tạo phiếu thì tại dòng cuối cột A sẽ tạo mã tự động và cùng lúc đó mã đấy sẽ đc hiển thị trên ô Số phiếu phân tích trong userform hiện ra ngay sau. Phần làm mã tự động mình đã làm đc nhưng để mã đó hiện trên ô Số phiếu phân tích thì tìm mãi ko ra giải pháp.
Thực ra code SoPhieuPhanTich chưa chuẩn. Nếu cột A chưa có dữ liệu (code chạy lần đầu) thì EndRow = 11 (A11 = Tiêu chuẩn chất lượng) và số phiếu mới tạo sẽ được nhập vào A12. Ngoài ra phương thức Find gọi chưa chuẩn (chạy code ít nhất 2 lần rồi kiểm tra các số phiếu được tạo sẽ thấy chúng như nhau)

Dù dùng cách nào thì mấu chốt là phải gọi SoPhieuPhanTich trước TaoPhieu1.Show

Tôi sửa chút ít.

1. Dùng Sub SoPhieuPhanTich như bạn.
Toàn bộ code trong Module1
Mã:
Sub SoPhieuPhanTich(MaPhieu)
Dim CotSoPhieu As Range, OSoPhieu As Range, EndRow As Long
    EndRow = Sheets("Data").Cells(Rows.Count, "A").End(xlUp).Row
    If EndRow < 13 Then EndRow = 12
    Set CotSoPhieu = Sheets("Data").Range("A13:A" & EndRow)
    Set OSoPhieu = CotSoPhieu.Find(MaPhieu, CotSoPhieu(1), xlValues, xlPart, , xlPrevious, True)
    If Not OSoPhieu Is Nothing Then
        Sheets("Data").Range("A" & EndRow + 1).Value = MaPhieu & Format(Right(CStr(OSoPhieu.Value), 4) + 1, "0000")
    Else
        Sheets("Data").Range("A" & EndRow + 1).Value = MaPhieu & "0001"
    End If
    Application.Goto Sheets("Data").Range("A" & EndRow + 1)
    Set OSoPhieu = Nothing
    Set CotSoPhieu = Nothing
End Sub

Sub TaoPhieu()
    SoPhieuPhanTich Year(Date) & "/"
    TaoPhieu1.Show
End Sub

Trong UserForm thêm code
Mã:
Private Sub UserForm_Initialize()
    txtSoPhieu.Value = Sheets("Data").Cells(Rows.Count, "A").End(xlUp).Value
End Sub

2. Dùng Function SoPhieuPhanTich.
Toàn bộ code trong Module1.
Mã:
Function SoPhieuPhanTich(MaPhieu) As String
Dim CotSoPhieu As Range, OSoPhieu As Range, EndRow As Long, ma As String
    EndRow = Sheets("Data").Cells(Rows.Count, "A").End(xlUp).Row
    If EndRow < 13 Then EndRow = 12
    Set CotSoPhieu = Sheets("Data").Range("A13:A" & EndRow)
    Set OSoPhieu = CotSoPhieu.Find(MaPhieu, CotSoPhieu(1), xlValues, xlPart, , xlPrevious, True)
    If Not OSoPhieu Is Nothing Then
        ma = MaPhieu & Format(Right(CStr(OSoPhieu.Value), 4) + 1, "0000")
    Else
        ma = MaPhieu & "0001"
    End If
    Sheets("Data").Range("A" & EndRow + 1).Value = ma
    SoPhieuPhanTich = ma
    Application.Goto Sheets("Data").Range("A" & EndRow + 1)
    Set OSoPhieu = Nothing
    Set CotSoPhieu = Nothing
End Function

Sub TaoPhieu()
    TaoPhieu1.txtSoPhieu.Value = SoPhieuPhanTich(Year(Date) & "/")
    TaoPhieu1.Show
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Thực ra code SoPhieuPhanTich chưa chuẩn. Nếu cột A chưa có dữ liệu (code chạy lần đầu) thì EndRow = 11 (A11 = Tiêu chuẩn chất lượng) và số phiếu mới tạo sẽ được nhập vào A12. Ngoài ra phương thức Find gọi chưa chuẩn (chạy code ít nhất 2 lần rồi kiểm tra các số phiếu được tạo sẽ thấy chúng như nhau)

Dù dùng cách nào thì mấu chốt là phải gọi SoPhieuPhanTich trước TaoPhieu1.Show

Tôi sửa chút ít.

1. Dùng Sub SoPhieuPhanTich như bạn.
Toàn bộ code trong Module1
Mã:
Sub SoPhieuPhanTich(MaPhieu)
Dim CotSoPhieu As Range, OSoPhieu As Range, EndRow As Long
    EndRow = Sheets("Data").Cells(Rows.Count, "A").End(xlUp).Row
    If EndRow < 13 Then EndRow = 12
    Set CotSoPhieu = Sheets("Data").Range("A13:A" & EndRow)
    Set OSoPhieu = CotSoPhieu.Find(MaPhieu, CotSoPhieu(1), xlValues, xlPart, , xlPrevious, True)
    If Not OSoPhieu Is Nothing Then
        Sheets("Data").Range("A" & EndRow + 1).Value = MaPhieu & Format(Right(CStr(OSoPhieu.Value), 4) + 1, "0000")
    Else
        Sheets("Data").Range("A" & EndRow + 1).Value = MaPhieu & "0001"
    End If
    Application.Goto Sheets("Data").Range("A" & EndRow + 1)
    Set OSoPhieu = Nothing
    Set CotSoPhieu = Nothing
End Sub

Sub TaoPhieu()
    SoPhieuPhanTich Year(Date) & "/"
    TaoPhieu1.Show
End Sub

Trong UserForm thêm code
Mã:
Private Sub UserForm_Initialize()
    txtSoPhieu.Value = Sheets("Data").Cells(Rows.Count, "A").End(xlUp).Value
End Sub

2. Dùng Function SoPhieuPhanTich.
Toàn bộ code trong Module1.
Mã:
Function SoPhieuPhanTich(MaPhieu) As String
Dim CotSoPhieu As Range, OSoPhieu As Range, EndRow As Long, ma As String
    EndRow = Sheets("Data").Cells(Rows.Count, "A").End(xlUp).Row
    If EndRow < 13 Then EndRow = 12
    Set CotSoPhieu = Sheets("Data").Range("A13:A" & EndRow)
    Set OSoPhieu = CotSoPhieu.Find(MaPhieu, CotSoPhieu(1), xlValues, xlPart, , xlPrevious, True)
    If Not OSoPhieu Is Nothing Then
        ma = MaPhieu & Format(Right(CStr(OSoPhieu.Value), 4) + 1, "0000")
    Else
        ma = MaPhieu & "0001"
    End If
    Sheets("Data").Range("A" & EndRow + 1).Value = ma
    SoPhieuPhanTich = ma
    Application.Goto Sheets("Data").Range("A" & EndRow + 1)
    Set OSoPhieu = Nothing
    Set CotSoPhieu = Nothing
End Function

Sub TaoPhieu()
    TaoPhieu1.txtSoPhieu.Value = SoPhieuPhanTich(Year(Date) & "/")
    TaoPhieu1.Show
End Sub
Cảm ơn bạn đã trợ giúp. Nhờ code của bạn tôi đã làm đc như ý muốn. Tôi cũng mới vọc VBA nên còn nhiều thứ mặc dù sử dụng nhưng ko hiểu kỹ. Một lần nữa cảm ơn bạn đã giải đáp cặn kẽ
Bài đã được tự động gộp:

Bạn đã xài form trong file; Nhưng file lại có những điểm không đạt hay sẽ gây khó khăn cho bạn lúc vận hành:
(1) Tên trang tính có dấu tiếng Việt; Cũng không nhất thiết gán tên trang quá dài như vậy; Hãy bắt chước người ta gán mã chứng khoán thì hay hơn;
(2) Trong 1 cột không thể có 2 loại/kiểu dữ liệu (vừa dạng chuỗi vừa dạng số)
Nếu là số thì dễ; Nếu dạng chuỗi như YYYY-#### thì tách chuỗi 4 kí số cuối ra; Sau đó biến nó thành 1 số & đem cọng với 1
Sau đó lại biến lại thành chuỗi kí số & nối vô 5 kí tự trước của mã phiếu ngay trước nó
Cảm ơn bạn đã trợ giúp. Tên trang tính do sử dụng lại dữ liệu cũ nên tôi cũng chưa thay đổi tên, tôi sẽ rút kinh nghiệm. Còn góp ý thứ 2 thì mình chưa hiểu giải pháp cho lắm, do kiến thức máy tính của tôi không tốt lắm nên có nhiều thuật ngữ ko hiều. bạn giải thích kỹ hơn hộ mình nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Số phiếu FTNgày FT
Tiêu chuẩn chất lượng
1​
29/8/19​
Nguyệt0270819-1503-272h50l72h
137​
138​
139​
140​
2019/0001
2019/0002
2019/0002
2019/0002
2019/0002
. , , , Còn góp ý thứ 2 thì mình chưa hiểu giải pháp cho lắm, do kiến thức máy tính của tôi không tốt lắm nên có nhiều thuật ngữ ko hiều. bạn giải thích kỹ hơn hộ mình nhé

Trong cột đầu mà mình trích ảnh có 2 kiểu dữ liệu đang là sai lầm của bạn, mình cho là vậy!
Trước tiên bạn phải đưa về 1 kiểu/dạng dữ liệu
Nếu bạn chọn dạng 'Số' thì nên lấy từ 1000 trở đi (trong Excel)
Nếu dạng chuỗi thì:
(*) Trước tiên nên thay kí tự '/' bỡi 1 kí tự khác không tiềm ẩn nguy hại như '_'
(*) Thực hiện theo phần còn lại của chú thich đã khuyến cáo

Nếu là mình thì số phiếu đầu tiên trong năm 2019 sẽ là I1000,. . .
Tháng mười (của năm) sẽ là IA000 là phiếu đầu
Năm sau sẽ bắt đầu là J1000, . . .

Chúc bạn vui!
 
Lần chỉnh sửa cuối:
Upvote 0
Số phiếu FTNgày FT
Tiêu chuẩn chất lượng
1​
29/8/19​
Nguyệt0270819-1503-272h50l72h
137​
138​
139​
140​
2019/0001
2019/0002
2019/0002
2019/0002
2019/0002

Trong cột đầu mà mình trích ảnh có 2 kiểu dữ liệu đang là sai lầm của bạn, mình cho là vậy!
Trước tiên bạn phải đưa về 1 kiểu/dạng dữ liệu
Nếu bạn chọn dạng 'Số' thì nên lấy từ 1000 trở đi (trong Excel)
Nếu dạng chuỗi thì:
(*) Trước tiên nên thay kí tự '/' bỡi 1 kí tự khác không tiềm ẩn nguy hại như '_'
(*) Thực hiện theo phần còn lại của chú thich đã khuyến cáo

Nếu là mình thì số phiếu đầu tiên trong năm 2019 sẽ là I1000,. . .
Tháng mười (của năm) sẽ là IA000 là phiếu đầu
Năm sau sẽ bắt đầu là J1000, . . .

Chúc bạn vui!
Cảm ơn bạn đã hướng dẫn. Vấn đề này đúng là mình chưa nghĩ đến. Mình sẽ tìm hiểu thêm và cố gắng hoàn thiện mục này
 
Upvote 0
Web KT

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

Back
Top Bottom