Cần giúp đỡ nhập liệu bằng Combobox trên userform

Liên hệ QC

Vivx

Thành viên mới
Tham gia
11/10/21
Bài viết
4
Được thích
0
Chào các anh chị trên diễn đàn

Tôi có file ví dụ nhập hàng bằng userform. Ô tên hàng được thiết kế bằng combobox. Khi đánh tên hàng vào combobox sẽ tự xổ xuống tên hàng cần tìm. Khi thoát khỏi combobox nó sẽ tự động điền đơn vị, đơn giá vào các textbox bên dưới.
Tuy nhiên tôi có vấn đề chưa xử lý được, đó là trong combobox có những tên hàng trùng nhau, nhưng đơn giá lại khác nhau. Khi tôi chọn thì chỉ chọn được đơn giá có ở trên cùng. Tôi không chọn được tên hàng có đơn giá mong muốn.
Tôi có gửi kèm file, mong các anh chị trên diễn đàn giúp đỡ.

Trân trọng cảm ơn!
 

File đính kèm

  • form nhap lieu.xlsm
    27.5 KB · Đọc: 46
Chào các anh chị trên diễn đàn

Tôi có file ví dụ nhập hàng bằng userform. Ô tên hàng được thiết kế bằng combobox. Khi đánh tên hàng vào combobox sẽ tự xổ xuống tên hàng cần tìm. Khi thoát khỏi combobox nó sẽ tự động điền đơn vị, đơn giá vào các textbox bên dưới.
Tuy nhiên tôi có vấn đề chưa xử lý được, đó là trong combobox có những tên hàng trùng nhau, nhưng đơn giá lại khác nhau. Khi tôi chọn thì chỉ chọn được đơn giá có ở trên cùng. Tôi không chọn được tên hàng có đơn giá mong muốn.
Tôi có gửi kèm file, mong các anh chị trên diễn đàn giúp đỡ.

Trân trọng cảm ơn!
Thêm 1 cột mã vật tư nữa cho khác biệt là xong, hoặc sửa tên lại cho khác.
 
Upvote 0
Cảm ơn anh Hoàng Trọng Nghĩa. Nếu có cách giải quyết thì vẫn tốt hơn. Vì nếu thêm mã vật tư hay đổi thành tên khác thì thêm rắc rối nếu có hàng nghìn loại vật tư khác nhau, mỗi loại vật tư lại có nhiều đơn giá khác nhau (giá thay đổi theo thị trường theo từng thời điểm)
 
Upvote 0
Hiện tại ComboBox của bạn đang chỉ 1 cột thì phải; Tăng lên thành 4 cột xem sao?!?
 
Upvote 0
Cảm ơn anh Hoàng Trọng Nghĩa. Nếu có cách giải quyết thì vẫn tốt hơn. Vì nếu thêm mã vật tư hay đổi thành tên khác thì thêm rắc rối nếu có hàng nghìn loại vật tư khác nhau, mỗi loại vật tư lại có nhiều đơn giá khác nhau (giá thay đổi theo thị trường theo từng thời điểm)

Bạn tham khảo cách này.

Screen Shot 2022-03-08 at 14.30.47.png
Nếu giá thường thay đổi thì phải có bảng ghi nhận các biến động giá. Khi tạo nguồn dữ liệu cho comboBox để chọn thì sẽ lấy nhưng dòng nào có giá mới nhất (ngày cuối cùng). Tất nhiên khi thiết kế Userform thì cái ô nhập giá sẽ tự động lấy giá từ dòng chọn trong comboBox nhưng vẫn để tuỳ chọn cho người dùng có thể nhập tay. (Để ông/bà chủ vui buồn nhập giá tuỳ tâm trạng)
Về CSDL thì tổ chức như vậy còn về code thì đừng hỏi tôi nhe. :)
 
Upvote 0
Upvote 0
Tôi đề nghị:

1. Xóa code Sub cbb_tenvt_AfterUpdate

2. Sửa thành
Mã:
Private Sub cbb_tenvt_Change()
Dim i As Integer
Dim index As Integer
    If cbb_tenvt.ListIndex = -1 Then Exit Sub
    
    txt_donvi.Value = cbb_tenvt.List(cbb_tenvt.ListIndex, 1)
    txt_dongia.Value = cbb_tenvt.List(cbb_tenvt.ListIndex, 2)

    With Me.cbb_tenvt
        index = .ListIndex
        For i = .ListCount - 1 To 0 Step -1
            If InStr(1, .List(i), .Value, vbTextCompare) = 0 Then
                .RemoveItem i
                If i < index Then index = index - 1
            End If
        Next i
        .ListIndex = index
'        .ListRows = 3
        .DropDown
    End With

End Sub

Private Sub cmd_them_Click()
    Dim lr As Integer
    
    lr = Sheets("nhap hang").Range("A" & Rows.Count).End(xlUp).Row + 1
    
    Worksheets("nhap hang").Cells(lr, 1).Value = lr - 5
    Worksheets("nhap hang").Cells(lr, 2).Value = cbb_tenvt.Value
    Worksheets("nhap hang").Cells(lr, 3).Value = txt_donvi.Value
    Worksheets("nhap hang").Cells(lr, 4).Value = txt_dongia.Value
    Worksheets("nhap hang").Cells(lr, 5).Value = txt_soluong.Value
    Worksheets("nhap hang").Cells(lr, 6).Value = txt_thanhtien.Value
    
    Call clear1
    
    lr = Worksheets("Vat tu").Range("B" & Rows.Count).End(xlUp).Row
    Me.cbb_tenvt.List = Worksheets("Vat tu").Range("B6:D" & lr).Value
End Sub
 
Upvote 0
(1) Ta có thể gộp chung vô 1 bảng được không? Ví như thêm 2 cột cuối của bảng 1 vô bảng 2
(2) Không hỏi bạn thì biết hỏi ai bây chừ? . . . . .
1. Vì Excel không phải là CSDL quan hệ nên anh thiết kế gộp chung cũng phù hợp hơn, code đỡ rắc rối, chỉ có cái là dữ liệu bị lặp lại nhiều.
2. Bên Excel em không ngâm cứu nhiều các phương thức, thuộc tính của các đối tượng, tương tác với sheet, các đối tượng trên Userform. Do vậy khi viết code mất nhiều thời gian, nên làm biếng...:D
 
Upvote 0
Tôi đề nghị:

1. Xóa code Sub cbb_tenvt_AfterUpdate

2. Sửa thành
Mã:
Private Sub cbb_tenvt_Change()
Dim i As Integer
Dim index As Integer
    If cbb_tenvt.ListIndex = -1 Then Exit Sub
   
    txt_donvi.Value = cbb_tenvt.List(cbb_tenvt.ListIndex, 1)
    txt_dongia.Value = cbb_tenvt.List(cbb_tenvt.ListIndex, 2)

    With Me.cbb_tenvt
        index = .ListIndex
        For i = .ListCount - 1 To 0 Step -1
            If InStr(1, .List(i), .Value, vbTextCompare) = 0 Then
                .RemoveItem i
                If i < index Then index = index - 1
            End If
        Next i
        .ListIndex = index
'        .ListRows = 3
        .DropDown
    End With

End Sub

Private Sub cmd_them_Click()
    Dim lr As Integer
   
    lr = Sheets("nhap hang").Range("A" & Rows.Count).End(xlUp).Row + 1
   
    Worksheets("nhap hang").Cells(lr, 1).Value = lr - 5
    Worksheets("nhap hang").Cells(lr, 2).Value = cbb_tenvt.Value
    Worksheets("nhap hang").Cells(lr, 3).Value = txt_donvi.Value
    Worksheets("nhap hang").Cells(lr, 4).Value = txt_dongia.Value
    Worksheets("nhap hang").Cells(lr, 5).Value = txt_soluong.Value
    Worksheets("nhap hang").Cells(lr, 6).Value = txt_thanhtien.Value
   
    Call clear1
   
    lr = Worksheets("Vat tu").Range("B" & Rows.Count).End(xlUp).Row
    Me.cbb_tenvt.List = Worksheets("Vat tu").Range("B6:D" & lr).Value
End Sub
Cách này vẫn chưa ổn anh Batman1 ạ. Vì nó mất chức năng tìm kiếm của combobox (khi nhập liệu, sự kiện change xảy ra thì listindex luôn bằng -1 nên luôn bị thoát sub)
 
Upvote 0
Cách này vẫn chưa ổn anh Batman1 ạ. Vì nó mất chức năng tìm kiếm của combobox (khi nhập liệu, sự kiện change xảy ra thì listindex luôn bằng -1 nên luôn bị thoát sub)
Thú thực là tôi không dò từ a tới Z nên không để ý tới cái này của bạn.
 
Upvote 0
Cách này vẫn chưa ổn anh Batman1 ạ. Vì nó mất chức năng tìm kiếm của combobox (khi nhập liệu, sự kiện change xảy ra thì listindex luôn bằng -1 nên luôn bị thoát sub)
Hôm nay tôi có việc nên không xem kỹ cho bạn được. Hiện tôi tạm sửa lại như sau:

1. Xóa Sub cbb_tenvt_AfterUpdate

2. Thay mới thành
Mã:
Private Sub cbb_tenvt_Change()
Dim r As Long, lastRow As Long
    With Me.cbb_tenvt
        If .ListIndex > -1 Then
            txt_donvi.Value = .List(.ListIndex, 1)
            txt_dongia.Value = .List(.ListIndex, 2)
        Else
            txt_donvi.Value = ""
            txt_dongia.Value = ""
            lastRow = Worksheets("Vat tu").Range("B" & Rows.Count).End(xlUp).Row
            .List = Worksheets("Vat tu").Range("B6:D" & lastRow).Value
            For r = .ListCount - 1 To 0 Step -1
                If InStr(1, .List(r), .Value, vbTextCompare) = 0 Then .RemoveItem r
            Next r
        End If
        .ListRows = 3
        .DropDown
    End With
End Sub

Nếu vẫn chưa đúng ý thì bạn đợi người khác nhé.
 
Upvote 0
Cảm ơn anh Batman1. Sau khi sửa theo code của anh thì chạy đúng như mong đợi. Cảm ơn anh rất nhiều.
 
Upvote 0
Web KT

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

Back
Top Bottom