Nhờ các bạn chỉnh sữa giúp mình code VBA trong UserForm

Liên hệ QC

Phuoctaifast

Thành viên mới
Tham gia
4/7/18
Bài viết
32
Được thích
9
1/ nút cập nhật : khi mình nhấn sẽ lưu lại trong sheet2 và hiện trên listbox những cột mới sửa.
2/ code cho listbox thể hiện hơn 10 trường dữ liệu khác nhau.
3/ nút tìm kiếm theo cột Mã vận đơn, và hiện lên trên listbox, tìm không có sẽ hiện ra bảng thông báo không có.
Nhờ các bạn sửa code giúp mình ạ
 

File đính kèm

  • text.xlsm
    45.1 KB · Đọc: 31
1/ nút cập nhật : khi mình nhấn sẽ lưu lại trong sheet2 và hiện trên listbox những cột mới sửa.
2/ code cho listbox thể hiện hơn 10 trường dữ liệu khác nhau.
3/ nút tìm kiếm theo cột Mã vận đơn, và hiện lên trên listbox, tìm không có sẽ hiện ra bảng thông báo không có.
Nhờ các bạn sửa code giúp mình ạ
Code vẫn chạy, có gì sửa nhỉ,
Mà sửa sub nào, function nào, đoạn nào? và sửa gì?

Bạn nên tìm hiểu về Cells(row,column).... tiện hơn là Range(... địa chỉ ô), hoặc Array thì tốt hơn nữa
 
Upvote 0
Code vẫn chạy, có gì sửa nhỉ,
Mà sửa sub nào, function nào, đoạn nào? và sửa gì?

Bạn nên tìm hiểu về Cells(row,column).... tiện hơn là Range(... địa chỉ ô), hoặc Array thì tốt hơn nữa

câu hỏi 1,2,3 của mình bạn đọc là hiểu rồi, code tui cần thay đổi ngắn gọn,xúc tích, và hiện trên listbox , tui nhấn cập nhật thì không ra theo ý của mình
 
Upvote 0
câu hỏi 1,2,3 của mình bạn đọc là hiểu rồi, code tui cần thay đổi ngắn gọn,xúc tích, và hiện trên listbox , tui nhấn cập nhật thì không ra theo ý của mình
Xúc tích mà khó hiểu với bạn thì là làm khó , vậy bạn cứ thử sửa và suy nghĩ theo hướng bài#2 nói trên

Không hiẻu sửa cái gì ah, vì bài 1 không có dấu hỏi (?) và cụ thể code thì dài nên không biết bạn đang bị lỗi hay thiếu chỗ nào

Cập nhật vào đâu vậy, vào listbox thì thấy có tác dụng rồi?
 
Upvote 0
1/ nút cập nhật : khi mình nhấn sẽ lưu lại trong sheet2 và hiện trên listbox những cột mới sửa.
3/ nút tìm kiếm theo cột Mã vận đơn, và hiện lên trên listbox, tìm không có sẽ hiện ra bảng thông báo không có.

Tôi nhìn qua code thì thấy đúng là nó dài dòng trong một số công đoạn như:
- Gán dữ liệu cho textbox khi chọn dòng trong Listbox.
- Các nút cập nhật, thêm cũng dài dòng khi phải viết code nhiều dòng để cập nhật từng cột trong sheet. Khi có thêm cột thì phải vô code thêm dòng.
- Bạn dùng vòng lặp mà không có điểm nhảy ra, ngưng vòng lặp để tránh lãng phí tài nguyên.
- Lạm dụng "On Error Resume Next". Nó cứ Next vậy thì biết lỗi ở đâu mà sửa, mà bẫy lỗi.
- Code cho nút Sửa cũng dư thừa, không cần thiết.
- Nút cập nhật của bạn hiện tại không lưu dữ liệu vừa sửa xuống sheet. Bạn thêm dòng code dưới đây vào dòng đầu tiên của code [nút Cập Nhật] thì nó sẽ lưu (nhớ bật lại Automatic ở cuối code).

Mã:
With Application
    .ScreenUpdating = False
    .EnableEvents = False
End With

Về việc gán dữ liệu cho textbox và code cho nút "Tìm kiếm" thì bạn xem code trong bài này theo link này: link #44: https://www.giaiphapexcel.com/diendan/threads/demo-form-tìm-kiếm-nhiều-cột-trong-listbox.142752/page-3#post-921729


Khi tìm kiếm không có dữ liệu thì listbox nó hiện trắng là biết rồi, khỏi cần hiện thông báo chi cho mất công, mất thời gian của người dùng phải bấm thêm nút OK để tắt thông báo.

Từ việc thiết lập thuộc tính "Tag" cho các Control trên Userform thì bạn có thể tận dụng để cập nhật, thêm dữ liệu xuống Sheet cho nhanh thay vì phải liệt kê từng dòng như hiện tại và không cần sửa code nếu có phát sinh thêm cột mới (chỉ cần thêm thông tin cho Tag).

uf.png

Mã:
Sheet2.Range("b" & w) = Me.txtMakh.Text
Sheet2.Range("c" & w) = txtLoaihinh.Text
Sheet2.Range("d" & w) = txtTlthuc.Text
Sheet2.Range("e" & w) = txtTl.Text
...


Mã:
Sub CapNhatDuLieu()

    Dim searchRange As Range, foundCell As Range
    Dim SearchID As String
    Dim ctl As Control
    Dim col As Integer
 
    SearchID = Me.txtMavd.Value

    With ThisWorkbook.Sheets("database")
        Set searchRange = .Range("A2", .Range("A" & .Rows.Count).End(xlUp))
    End With
    Set foundCell = searchRange.Find(what:=SearchID, Lookat:=xlWhole, MatchCase:=False, SearchFormat:=False)
    If Not foundCell Is Nothing Then
        If foundCell.Offset(0, 0).Value = Me.txtMavd.Value Then
            For Each ctl In Me.Controls
                If TypeName(ctl) = "TextBox" Or TypeName(ctl) = "ComboBox" Or TypeName(ctl) = "CheckBox" Or TypeName(ctl) = "OptionButton" Then
                    If Right(ctl.Tag, 3) = "yes" Then   'Tùy chon textbox nào can gan du lieu. Thiet lap trong Tag.
                        col = CInt(Left(ctl.Tag, 2)) 'Ký tu dau trong tag la so cot trong Sheet
                        foundCell.Offset(0, col).Value = ctl.Value
                    End If
                End If
            Next ctl
            ganSourceListbox    'Refresh lai listbox1
            MsgBox "Da cap nhat thanh cong."
        Else
            MsgBox "ID khong ton tai."
        End If
    Else
        MsgBox "Khong tim thay dong du lieu can cap nhat."
    End If

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
hi ongke0711
mình vẫn chưa hiểu về 2 dòng này, nhờ bạn hướng dẫn thêm giúp mình ạ
1/ mình có 20 text box, và mình đã tag theo vị trí từ 1 đến 20 , nhưng khi mình chạy thì hàm lỗi ở dòng chữ ký tự đầu trong tà là số cột trong sheet, hoặc số cột trong listbox
chữ " r " mình sẽ thay bằng chữ gì, khi mục tiêu của mình chỉ cần search tên mã sản phẩm nằm ở cột a2 ạ
1604289248943.png
 
Upvote 0
hi ongke0711
mình vẫn chưa hiểu về 2 dòng này, nhờ bạn hướng dẫn thêm giúp mình ạ
1/ mình có 20 text box, và mình đã tag theo vị trí từ 1 đến 20 , nhưng khi mình chạy thì hàm lỗi ở dòng chữ ký tự đầu trong tà là số cột trong sheet, hoặc số cột trong listbox
chữ " r " mình sẽ thay bằng chữ gì, khi mục tiêu của mình chỉ cần search tên mã sản phẩm nằm ở cột a2 ạ
View attachment 248483

- Chữ "r": là tên biến đại diện cho vị trí dòng bạn đang click chọn trong Listbox. Không liên quan đến mục tiêu tìm mã sản phẩm vì đây là code dùng để hiển thị thông tin của dòng chọn trong Listbox đưa lên các Control (Textbox, comboBox...) trên Userform.
- Việc Tag Texbox từ 1 - 20 là phải tương ứng nội dung Textbox với số thứ tự cột trong Listbox. Ví dụ: txtMaVd phải đáng Tag="01-yes" --> là cột 1 trong listbox.
- Right (ctl.Tag,3) = "yes". --> lấy 3 ký tự bên phải chuỗi Tag để xem có phải là chữ "yes" không để mà xử lý. Không phải số 20 như hình. Mục đích là sẽ có nhiều Control trên Userform, sẽ có những Control không cần thao tác nên sẽ bỏ qua khi không đánh Tag cho nó.
 
Upvote 0
Web KT

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

Back
Top Bottom