Hiển thị dòng cuối của list box

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

kokoro mitsubishi

Thành viên chính thức
Tham gia
2/12/13
Bài viết
55
Được thích
3
Chào các anh chị / em trong diễn đàn
hiện tại em đã tạo được bảng nhập liệu , tuy nhiên em đang mắc 2 vấn đề nhờ các bác giúp đỡ
1. Khi đưa thông tin bào bảng báo ca ( đính kèm file ) , ấn Nhập thì thông tin chuyển list box không hiển thị được dòng vừa nhập mà luôn luôn chỉ hiển thị dòng đầu
trong trường hợp ví dụ dòng cuối là 500 dòng thì phải kéo con trỏ đi xuống
Các anh chị / em có thể giúp em code khi ấn vào nút bấm "nhập " thì trong list box sẽ tự động bôi màu dòng cuối và hiển thị như hình bên dưới
1681047868022.png

2. Trường hợp em muốn xin code là khi nhập thông tin sai hoặc thiếu nội dung em muốn sửa thì có thể tích vào nút "sửa " sau đó nhâp vào dòng " mã số công việc" khi đó nội dung đã nhập hiển thị vào dòng đã nhập


em xin cảm ơn
Chúc cả nhà buổi tối cuối tuần vui vẻ
 

File đính kèm

  • Nhap du lieu.xlsm
    2.7 MB · Đọc: 14
Công thức name tdata của bạn sai rồi. Nó phải thế này: =OFFSET(nhat_ky_CV!$A$1;1;0;COUNTA(nhat_ky_CV!$A$2:$A$50000);13)
Muốn chọn dòng cuối của listbox thì thêm dòng lệnh ListBox1.ListIndex = ListBox1.ListCount - 1 vào cuối Sub btn_Save_Click
 
Upvote 0
Một cách khác là Sort dữ liệu của Listbox theo hướng giảm dần dựa theo thời gian nhập liệu.
 
Upvote 0

kokoro mitsubishi


Để đi đến dòng cuối ListBox có giá trị thì có các cách sau:
  • Nếu ListBox nhận danh sách từ trang tính, thì sử dụng phương thức End hoặc Find của range để tìm dòng cuối chứa dữ liệu.
  • Nếu ListBox nhập tay thì cho một biến toàn cục tăng dần giá trị mỗi lần nhập.
Và gán dòng cuối có dữ liệu cho ListBox1.ListIndex


Trong mã của bạn đã gõ biến số là một chuỗi chứa mã UTF8, một số trình biên dịch VBA có thể biên dịch lỗi.
 
Upvote 0
Ý là muốn hiển thị chọn dòng cuối cùng vừa đc nhập, chứ k phải cuối cùng của list box là ô trống b ơi
Thêm 1 dòng nữa bên trên là được. Bạn @gacel và thớt thử xem (nhưng gà xèo viết tắt nhiều quá):
ListBox1.RowSource = "tdata"
ListBox1.ListIndex = ListBox1.ListCount - 1
 
Lần chỉnh sửa cuối:
Upvote 0
Ý là muốn hiển thị chọn dòng cuối cùng vừa đc nhập, chứ k phải cuối cùng của list box là ô trống b ơi
Thêm 1 dòng nữa bên trên là được. Bạn @gacel và thớt thử xem (nhưng gà xèo viết tắt nhiều quá):
ListBox1.RowSource = "tdata"
ListBox1.ListIndex = ListBox1.ListCount - 1
Cảm ơn Bác @Maika8008 về tư vấn bên trên em đã sử lý đúng ý 1 rồi ạ
trong trường hợp thứ 2 em muốn sửa mã số công việc mà đã nhập trước hoặc thêm vào giá trị mà mã số công việc lúc trước còn thiếu thì bác có cao kiến gì không giúp em với
Ví dụ : em tích vào nút "Sửa " sau đó nhập mã số công việc :000012336 vào ô mã số công viêc khi đó các giá trị đã nhập trước :trình tự , mã phòng .... sẽ hiển thị=> người nhập tự xác nhận và nhập cho đúng thực tế => tích vào nhập để dữ liệu up trở lại bào bảng tính

em cảm ơn
 
Upvote 0
Cảm ơn Bác @Maika8008 về tư vấn bên trên em đã sử lý đúng ý 1 rồi ạ
trong trường hợp thứ 2 em muốn sửa mã số công việc mà đã nhập trước hoặc thêm vào giá trị mà mã số công việc lúc trước còn thiếu thì bác có cao kiến gì không giúp em với
Ví dụ : em tích vào nút "Sửa " sau đó nhập mã số công việc :000012336 vào ô mã số công viêc khi đó các giá trị đã nhập trước :trình tự , mã phòng .... sẽ hiển thị=> người nhập tự xác nhận và nhập cho đúng thực tế => tích vào nhập để dữ liệu up trở lại bào bảng tính

em cảm ơn
Làm như bạn cũng được, hoặc có thể chọn dòng cần sửa rồi cho hiện form, bấm sửa.

Rồi sau đó sẽ có 1 nút tên là Lưu cập nhật nữa hay sao. Hay là sẽ sửa nút Sửa đó thành có tên là Lưu? Tùy bạn.

Bấm vào đó sẽ lưu dòng đã sửa xuống sheet
 
Lần chỉnh sửa cuối:
Upvote 0
@Maika8008 cảm ơn bác em sẽ sửa thử , mắc đâu em lại hỏi
Tôi gửi bạn đoạn mã của nút Sửa - Lưu theo hướng: nhập mã số rồi bấm Sửa -> đổi thành nút Lưu -> sửa xong bấm Lưu để chép trở lại sheet:
Rich (BB code):
Private Sub CommandButton1_Click()
    Dim sMS$, iRw&, aCol, i&, objTXT As Object
    aCol = Array(2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13): sMS = txt1.Text
    iRw = Sheets("nhat_ky_CV").Range("A1:A" & Sheets("nhat_ky_CV").Range("A" & Rows.Count).End(xlUp).Row). _
          Find(What:=sMS, LookIn:=xlFormulas, LookAt:=xlWhole).Row
    If CommandButton1.Caption = "S" & ChrW(7917) & "a" Then
        For Each objTXT In Me.Controls
            For k = 0 To UBound(aCol)
                If objTXT.Name = "txt" & k + 2 Then objTXT.Value = Sheets("nhat_ky_CV").Cells(iRw, aCol(k)): Exit For
            Next
        Next
        CommandButton1.Caption = "L" & ChrW(432) & "u"
    Else
        For Each objTXT In Me.Controls
            For k = 0 To UBound(aCol)
                If objTXT.Name = "txt" & k + 2 Then
                    Sheets("nhat_ky_CV").Cells(iRw, aCol(k)) = objTXT.Value
                    objTXT.Value = "": Exit For
                End If
            Next
        Next
        txt1.Value = "": CommandButton1.Caption = "S" & ChrW(7917) & "a"
    End If
End Sub
 
Upvote 0
Thêm 1 dòng nữa bên trên là được. Bạn @gacel và thớt thử xem (nhưng gà xèo viết tắt nhiều quá):
ListBox1.RowSource = "tdata"
ListBox1.ListIndex = ListBox1.ListCount - 1
Ngoài câu lệnh:

ListBox1.ListIndex = ListBox1.ListCount - 1

Chúng ta còn có câu này để chọn hàng cuối cùng:

ListBox1.Selected(ListBox1.ListCount - 1) = True
 
Upvote 0
Cái gì mà mã UTF8 (phải viết chuẫn chị là UTF-8), cái đó là Shift-JIS chứ UTF-8 nào.
Những cái này phải có kiến thức thực chiến mới nắm được. Nhìn cái biết luôn.

Mấy vụ này mình nói vài lần rồi. Các bài ca thán nào là VBA không hỗ trợ unicode này nọ thật buồn cười.
Nhắc lại rằng Windows và Office phiên bản ngôn ngữ nào thì trong môi trường VBA hỗ trợ hết (tiếng Thái, Hàn, Tàu, Nhật, Pháp, Đức...), cứ thế viết được tuốt, tên sub/function/variable dùng chữ của ngôn ngữ đó được luôn.
Trong diễn đàn này, thỉnh thoảng có người úp file có VBA chữ Nhật, Hàn đó. Người ta biết OS, phần mềm đang dùng như thế nào mà.

Cái vụ không hỗ trợ unicode kia là do các chàng/ nàng dùng Windows EN, Office EN mà cứ đòi dùng tiếng Việt có dấu thì khóc tiếng mán là đúng rồi.
Đợi khi nào mẽo ưu ái cho tiếng Việt vào phần ngôn ngữ chính thức của phần mềm thì hẵng hay.
 
Upvote 0
Ngoài câu lệnh:

ListBox1.ListIndex = ListBox1.ListCount - 1

Chúng ta còn có câu này để chọn hàng cuối cùng:

ListBox1.Selected(ListBox1.ListCount - 1) = True
Làm sao để sau khi nhập dữ liệu, sẽ chọn hàng cuối cùng( tức là dòng cuối cùng có chứa dữ liệu) , chứ k pải dòng cuối cùng của list bạn nhỉ?
 
Upvote 0
Tôi gửi bạn đoạn mã của nút Sửa - Lưu theo hướng: nhập mã số rồi bấm Sửa -> đổi thành nút Lưu -> sửa xong bấm Lưu để chép trở lại sheet:
Rich (BB code):
Private Sub CommandButton1_Click()
    Dim sMS$, iRw&, aCol, i&, objTXT As Object
    aCol = Array(2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13): sMS = txt1.Text
    iRw = Sheets("nhat_ky_CV").Range("A1:A" & Sheets("nhat_ky_CV").Range("A" & Rows.Count).End(xlUp).Row). _
          Find(What:=sMS, LookIn:=xlFormulas, LookAt:=xlWhole).Row
    If CommandButton1.Caption = "S" & ChrW(7917) & "a" Then
        For Each objTXT In Me.Controls
            For k = 0 To UBound(aCol)
                If objTXT.Name = "txt" & k + 2 Then objTXT.Value = Sheets("nhat_ky_CV").Cells(iRw, aCol(k)): Exit For
            Next
        Next
        CommandButton1.Caption = "L" & ChrW(432) & "u"
    Else
        For Each objTXT In Me.Controls
            For k = 0 To UBound(aCol)
                If objTXT.Name = "txt" & k + 2 Then
                    Sheets("nhat_ky_CV").Cells(iRw, aCol(k)) = objTXT.Value
                    objTXT.Value = "": Exit For
                End If
            Next
        Next
        txt1.Value = "": CommandButton1.Caption = "S" & ChrW(7917) & "a"
    End If
End Sub
cảm ơn bác em đã thực thi thành công ạ , khi em đưa vào file thực tế chạy Lưu thì update rất mất thời gian , bác có giải pháp nào không chỉ giáo em với , kiểm tra hiệu năng thì rất tốn CPU
Bài đã được tự động gộp:

Làm sao để sau khi nhập dữ liệu, sẽ chọn hàng cuối cùng( tức là dòng cuối cùng có chứa dữ liệu) , chứ k pải dòng cuối cùng của list bạn nhỉ?
Vâng đúng rồi bác , mục đích để đối chiếu luôn dữ liệu xem có chính xác không thôi ạ
 
Upvote 0
cảm ơn bác em đã thực thi thành công ạ , khi em đưa vào file thực tế chạy Lưu thì update rất mất thời gian , bác có giải pháp nào không chỉ giáo em với , kiểm tra hiệu năng thì rất tốn CPU
Máy bạn CPU gì, mua từ lúc nào mà tệ vậy? Máy tôi i3 mua 2017 mà phi ầm ầm.
Giải pháp: với đoạn code sau, bạn thay từng cái textbox một chứ không làm vòng lặp nữa
Rich (BB code):
        For Each objTXT In Me.Controls
            For k = 0 To UBound(aCol)
                If objTXT.Name = "txt" & k + 2 Then objTXT.Value = Sheets("nhat_ky_CV").Cells(iRw, aCol(k)): Exit For
            Next
        Next
Ví dụ: txt2.Value = Sheets("nhat_ky_CV").Range("B" & iRw).Value
Cứ thế cho txt3, txt4 đến txt cuối

Rồi đoạn vòng lặp bên dưới cũng vậy:

Rich (BB code):
        For Each objTXT In Me.Controls
            For k = 0 To UBound(aCol)
                If objTXT.Name = "txt" & k + 2 Then
                    Sheets("nhat_ky_CV").Cells(iRw, aCol(k)) = objTXT.Value
                    objTXT.Value = "": Exit For
                End If
            Next
        Next

Thay bằng: Sheets("nhat_ky_CV").Range("B" & iRw).Value = txt2.Value
Chứ thế thay cho các txt khác
 
Upvote 0
Máy bạn CPU gì, mua từ lúc nào mà tệ vậy? Máy tôi i3 mua 2017 mà phi ầm ầm.
Giải pháp: với đoạn code sau, bạn thay từng cái textbox một chứ không làm vòng lặp nữa
Rich (BB code):
        For Each objTXT In Me.Controls
            For k = 0 To UBound(aCol)
                If objTXT.Name = "txt" & k + 2 Then objTXT.Value = Sheets("nhat_ky_CV").Cells(iRw, aCol(k)): Exit For
            Next
        Next
Ví dụ: txt2.Value = Sheets("nhat_ky_CV").Range("B" & iRw).Value
Cứ thế cho txt3, txt4 đến txt cuối

Rồi đoạn vòng lặp bên dưới cũng vậy:

Rich (BB code):
        For Each objTXT In Me.Controls
            For k = 0 To UBound(aCol)
                If objTXT.Name = "txt" & k + 2 Then
                    Sheets("nhat_ky_CV").Cells(iRw, aCol(k)) = objTXT.Value
                    objTXT.Value = "": Exit For
                End If
            Next
        Next

Thay bằng: Sheets("nhat_ky_CV").Range("B" & iRw).Value = txt2.Value
Chứ thế thay cho các txt khác
1681221729621.png
Máy em đây bác ơi , mang code gắn vào file sử dụng trong công ty dùng thì thời gian chờ ối giời ơi luôn
 
Upvote 0
Upvote 0
Upvote 0
Web KT

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

Back
Top Bottom