Giúp đỡ điền giá trị từ ComboBox có 2 cột hiển thị vào bảng tính

Liên hệ QC

Mr.hieudoanxd

Thành viên thường trực
Tham gia
25/10/19
Bài viết
322
Được thích
150
Chào các anh chị trên diễn đàn!
Em có tập thao tác với Userform trên bảng tính và gặp vấn đề về việc điền giá trị ở cột thứ 2 trong ComboBox hiển thị 2 cột vào bảng tính nhưng không được.
Với file trên nếu em điền giá trị bình thương vào các ComboBox thì không sao. nhưng với việc sử dụng tính năng chọn của ComboBox thì code không điền được giá trị ra bảng tính
Ngoài ra thi thoảng UserForm không cập nhật ảnh khi lựa chọn ảnh từ ListBox
Mong các anh chị giúp đỡ
Em có mô tả qua File ở dưới các anh kích đúp chuột vào các ô từ A6:F50 trong sheet có tên là Sheet4 sẽ hiện UserForm (em mô tả phần này để các anh đỡ mất công tìm)
 

File đính kèm

  • Combobox.xlsb
    664.4 KB · Đọc: 14
Hiện tại ListBResult chỉ cho chọn 1, mà cũng chỉ có 1 khung ảnh nên chọn 2 thì vô lý. Khi ListBox chỉ cho chọn 1 thì chỉ số của mục được chọn nằm trong thuộc tính ListIndex, vậy không ai dùng vòng FOR để kiểm tra SELECTED.

Sửa thành
Mã:
Private Sub ListBResult_Change()
    With ListBResult
        If .ListIndex > -1 Then Image_Pic.Picture = LoadPicture(.List(.ListIndex, 1))
    End With
End Sub

Chắc chắn code không chuẩn. Kiểu điều kiện:

If Cells(5, ActiveCell.Column) = "LytrinhBD" Then
If Cells(5, ActiveCell.Column) = "LytrinhKT" Then

không bao giờ được thỏa mãn. Trên sheet là "LyTrinhBD" và "LyTrinhKT" lại đem so sánh với "LytrinhBD" và "LytrinhKT" thì muôn đời không bao giờ bằng nhau.

Muốn lấy cột nào thì dùng thuộc tính LIST thôi. Chú ý là chỉ số cột, dòng tính từ 0, tức muốn lấy cột thứ 2 thì nhập vào 1.

Ngoài ra code rối rắm vô cùng.

Nếu tôi hiểu ý thì thay

Mã:
Private Sub CmBAppcept_Click()
Dim i As Long, FName As String
With ListBResult
   If Cells(5, ActiveCell.Column) = "AnhCD" Then Cells(ActiveCell.Row, ActiveCell.Column) = .List(i, 1)
   If Cells(5, ActiveCell.Column) = "LytrinhBD" Then Cells(ActiveCell.Row, ActiveCell.Column - 1) = .List(i, 1)
   If Cells(5, ActiveCell.Column) = "LytrinhKT" Then Cells(ActiveCell.Row, ActiveCell.Column - 2) = .List(i, 1)
   If Cells(5, ActiveCell.Column) = "DaoDap" Then Cells(ActiveCell.Row, ActiveCell.Column - 3) = .List(i, 1)
   If Cells(5, ActiveCell.Column) = "PhanLop" Then Cells(ActiveCell.Row, ActiveCell.Column - 4) = .List(i, 1)
   If Cells(5, ActiveCell.Column) = "DiemCD" Then Cells(ActiveCell.Row, ActiveCell.Column - 5) = .List(i, 1)
End With

With CbBoxBD
   If Cells(5, ActiveCell.Column) = "AnhCD" Then Cells(ActiveCell.Row, ActiveCell.Column + 1) = .Value
   If Cells(5, ActiveCell.Column) = "LyTrinhBD" Then Cells(ActiveCell.Row, ActiveCell.Column) = .List(.ListIndex, 1)
   If Cells(5, ActiveCell.Column) = "LyTrinhKT" Then Cells(ActiveCell.Row, ActiveCell.Column - 1) = .Value
   If Cells(5, ActiveCell.Column) = "DaoDap" Then Cells(ActiveCell.Row, ActiveCell.Column - 2) = .Value
   If Cells(5, ActiveCell.Column) = "PhanLop" Then Cells(ActiveCell.Row, ActiveCell.Column - 3) = .Value
   If Cells(5, ActiveCell.Column) = "DiemCD" Then Cells(ActiveCell.Row, ActiveCell.Column - 4) = .Value
End With

With CbBoxKT
   If Cells(5, ActiveCell.Column) = "AnhCD" Then Cells(ActiveCell.Row, ActiveCell.Column + 2) = .Value
   If Cells(5, ActiveCell.Column) = "LyTrinhBD" Then Cells(ActiveCell.Row, ActiveCell.Column + 1) = .Value
   If Cells(5, ActiveCell.Column) = "LyTrinhKT" Then Cells(ActiveCell.Row, ActiveCell.Column) = .Value
   If Cells(5, ActiveCell.Column) = "DaoDap" Then Cells(ActiveCell.Row, ActiveCell.Column - 1) = .Value
   If Cells(5, ActiveCell.Column) = "PhanLop" Then Cells(ActiveCell.Row, ActiveCell.Column - 2) = .Value
   If Cells(5, ActiveCell.Column) = "DiemCD" Then Cells(ActiveCell.Row, ActiveCell.Column - 3) = .Value
End With

With CbBoxPL
   If Cells(5, ActiveCell.Column) = "AnhCD" Then Cells(ActiveCell.Row, ActiveCell.Column + 3) = .Value
   If Cells(5, ActiveCell.Column) = "LyTrinhBD" Then Cells(ActiveCell.Row, ActiveCell.Column + 2) = .Value
   If Cells(5, ActiveCell.Column) = "LyTrinhKT" Then Cells(ActiveCell.Row, ActiveCell.Column + 1) = .Value
   If Cells(5, ActiveCell.Column) = "DaoDap" Then Cells(ActiveCell.Row, ActiveCell.Column) = .Value
   If Cells(5, ActiveCell.Column) = "PhanLop" Then Cells(ActiveCell.Row, ActiveCell.Column - 1) = .Value
   If Cells(5, ActiveCell.Column) = "DiemCD" Then Cells(ActiveCell.Row, ActiveCell.Column - 2) = .Value
End With

With TextBox1
   If Cells(5, ActiveCell.Column) = "AnhCD" Then Cells(ActiveCell.Row, ActiveCell.Column + 4) = .Value
   If Cells(5, ActiveCell.Column) = "LytrinhBD" Then Cells(ActiveCell.Row, ActiveCell.Column + 3) = .Value
   If Cells(5, ActiveCell.Column) = "LytrinhKT" Then Cells(ActiveCell.Row, ActiveCell.Column + 2) = .Value
   If Cells(5, ActiveCell.Column) = "DaoDap" Then Cells(ActiveCell.Row, ActiveCell.Column + 1) = .Value
   If Cells(5, ActiveCell.Column) = "PhanLop" Then Cells(ActiveCell.Row, ActiveCell.Column) = .Value
   If Cells(5, ActiveCell.Column) = "DiemCD" Then Cells(ActiveCell.Row, ActiveCell.Column - 1) = .Value
End With

With TextBox2
   If Cells(5, ActiveCell.Column) = "AnhCD" Then Cells(ActiveCell.Row, ActiveCell.Column + 5) = .Value
   If Cells(5, ActiveCell.Column) = "LytrinhBD" Then Cells(ActiveCell.Row, ActiveCell.Column + 4) = .Value
   If Cells(5, ActiveCell.Column) = "LytrinhKT" Then Cells(ActiveCell.Row, ActiveCell.Column + 3) = .Value
   If Cells(5, ActiveCell.Column) = "DaoDap" Then Cells(ActiveCell.Row, ActiveCell.Column + 2) = .Value
   If Cells(5, ActiveCell.Column) = "PhanLop" Then Cells(ActiveCell.Row, ActiveCell.Column + 1) = .Value
   If Cells(5, ActiveCell.Column) = "DiemCD" Then Cells(ActiveCell.Row, ActiveCell.Column) = .Value
End With

   UF_PictureCD.Hide
End Sub

bằng

Mã:
Private Sub CmBAppcept_Click()
    If ListBResult.ListIndex > -1 Then Cells(ActiveCell.Row, 1) = ListBResult.List(ListBResult.ListIndex, 1)
    Cells(ActiveCell.Row, 2) = CbBoxBD.List(CbBoxBD.ListIndex, 1)
    Cells(ActiveCell.Row, 3) = CbBoxKT.List(CbBoxKT.ListIndex, 1)
    Cells(ActiveCell.Row, 4) = CbBoxPL.Value
    Cells(ActiveCell.Row, 5) = TextBox1.Value
    Cells(ActiveCell.Row, 6) = TextBox2.Value

    UF_PictureCD.Hide
End Sub
 
Upvote 0
Hiện tại ListBResult chỉ cho chọn 1, mà cũng chỉ có 1 khung ảnh nên chọn 2 thì vô lý. Khi ListBox chỉ cho chọn 1 thì chỉ số của mục được chọn nằm trong thuộc tính ListIndex, vậy không ai dùng vòng FOR để kiểm tra SELECTED.

Chắc chắn code không chuẩn. Kiểu điều kiện:

If Cells(5, ActiveCell.Column) = "LytrinhBD" Then
If Cells(5, ActiveCell.Column) = "LytrinhKT" Then

không bao giờ được thỏa mãn. Trên sheet là "LyTrinhBD" và "LyTrinhKT" lại đem so sánh với "LytrinhBD" và "LytrinhKT" thì muôn đời không bao giờ bằng nhau.

Muốn lấy cột nào thì dùng thuộc tính LIST thôi. Chú ý là chỉ số cột, dòng tính từ 0, tức muốn lấy cột thứ 2 thì nhập vào 1.

Ngoài ra code rối rắm vô cùng.
Chân thành cảm ơn anh về những những hướng dẫn ngoài ra còn góp ý cho em hoàn thiện hơn trong cách viết code nữa.
Em có đôi lời giải thích một chút ý tưởng của em như sau ạ.
-Về ListBResult em để mảng 2 là để sau em không hiển thị đường dẫn của file vào trong ListBResult mà chỉ hiển thị tên đại diện do em đặt cho dễ nhớ và đỡ rối
-Kiểu so sánh với ký tự đại diện là em phòng trường hợp trong quá trình thao tác với file có di chuyển các cột sang vị trí khác thì vẫn dò được tên để trả kết quả về (trong sự kiện Worksheet_BeforeDoubleClick cả 6 cột em đều chọn cả nên em mới diễn giải như trên để trả về kết quả tương ứng với từng cột DoubleClick vào)
Tiện anh đã vào bài viết của em rồi, mong anh có góp ý gì thêm cho em không ạ.
Cảm ơn anh!
 
Upvote 0
Tiện anh đã vào bài viết của em rồi, mong anh có góp ý gì thêm cho em không ạ.
Bạn hỏi gì mà tôi biết thì tôi giúp chứ tôi không có góp ý gì thêm.
-Kiểu so sánh với ký tự đại diện là em phòng trường hợp trong quá trình thao tác với file có di chuyển các cột sang vị trí khác thì vẫn dò được tên để trả kết quả về (trong sự kiện Worksheet_BeforeDoubleClick cả 6 cột em đều chọn cả nên em mới diễn giải như trên để trả về kết quả tương ứng với từng cột DoubleClick vào)
Nếu tôi hiểu ý thì ...

Nếu muốn code luôn đúng với vùng dữ liệu xê dịch nhưng luôn theo thứ tứ cho trước và luôn là 6 cột liên tiếp, vd. G:L thì

Mã:
Private Sub CmBAppcept_Click()
Dim k As Long
    Select Case Cells(5, ActiveCell.Column).Value
        Case "AnhCD": k = 0
        Case "LyTrinhBD": k = 1
        Case "LyTrinhKT": k = 2
        Case "DaoDap": k = 3
        Case "PhanLop": k = 4
        Case "DiemCD": k = 5
    End Select

    With ActiveCell.Offset(0, -k)  ' ô ở cột AnhCD cùng dòng với ActiveCell
        If ListBResult.ListIndex > -1 Then .Value = ListBResult.List(ListBResult.ListIndex, 1)
        .Offset(0, 1).Value = CbBoxBD.List(CbBoxBD.ListIndex, 1)
        .Offset(0, 2).Value = CbBoxKT.List(CbBoxKT.ListIndex, 1)
        .Offset(0, 3).Value = CbBoxPL.Value
        .Offset(0, 4).Value = TextBox1.Value
        .Offset(0, 5).Value = TextBox2.Value
    End With

   UF_PictureCD.Hide
End Sub


Tất nhiên lúc đó cũng phải sửa trong Sub Worksheet_BeforeDoubleClick. Không thể vẫn là


If .Row > 5 And .Row < maxRow And .count = 1 And .Column >= 1 And .Column <= 6 Then
 
Lần chỉnh sửa cuối:
Upvote 0
Code chạy đúng rồi ạ.
Tất nhiên lúc đó cũng phải sửa trong Sub Worksheet_BeforeDoubleClick. Không thể vẫn là

If .Row > 5 And .Row < maxRow And .count = 1 And .Column >= 1 And .Column <= 6 Then
Phần này thì em đặt các giá trị 1, 6 trong 1 sheet riêng và gọi ra trong sự kiện rồi ạ. Cảm ơn anh đã nhắc nhở và chỉ bảo!
 
Upvote 0
Code chạy đúng rồi ạ.

Phần này thì em đặt các giá trị 1, 6 trong 1 sheet riêng và gọi ra trong sự kiện rồi ạ. Cảm ơn anh đã nhắc nhở và chỉ bảo!
Bạn đợi tý tôi đưa ra giải pháp hợp lý hơn.

1. Trong module Test khai báo ở trên cùng
Mã:
Public Const startCol = 1

2. Trong Sub Worksheet_BeforeDoubleClick
sửa
Mã:
If .Row > 5 And .Row < maxRow And .count = 1 And .Column >= 1 And .Column <= 6 Then
thành
Mã:
If .Row > 5 And .Row < maxRow And .count = 1 And .Column >= startCol And .Column <= startCol + 5 Then

3. Mỗi khi dịch chyển vùng dữ liệu thì chỉ sửa ở 1 chỗ startCol, vd. dữ liệu ở C:H thì startCol = 3 (bắt đầu từ cột C)

4.
Sửa thành
Mã:
Private Sub CmBAppcept_Click()
    With Cells(ActiveCell.Row, startCol)    ' ô ở cột AnhCD cùng dòng với ActiveCell
        If ListBResult.ListIndex > -1 Then .Value = ListBResult.List(ListBResult.ListIndex, 1)
        .Offset(0, 1).Value = CbBoxBD.List(CbBoxBD.ListIndex, 1)
        .Offset(0, 2).Value = CbBoxKT.List(CbBoxKT.ListIndex, 1)
        .Offset(0, 3).Value = CbBoxPL.Value
        .Offset(0, 4).Value = TextBox1.Value
        .Offset(0, 5).Value = TextBox2.Value
    End With

   UF_PictureCD.Hide
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu không muốn thao tác bằng tay điểm 2 trong bài #6 thì phải sửa chút điểm 1 và 2. Tức toàn bộ như sau:

1. Trong module Test khai báo ở trên cùng
Mã:
Public startCol  As Long

2. Sửa Sub Worksheet_BeforeDoubleClick thành

Mã:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim maxRow As Long
'    On Error Resume Next
    maxRow = 50
    
    startCol = Me.Cells(4, Columns.Count).End(xlToLeft).Column - 5 ' dong 4 la dong tieu de
    
    With Target
        If .Row > 5 And .Row < maxRow And .Count = 1 And .Column >= startCol And .Column <= startCol + 5 Then
            UF_PictureCD.Show
            Cancel = True
        End If
    End With
End Sub
Chú ý là dòng 4 chứa tiêu đề, vì thế có startCol = Me.Cells(4, Columns.Count).End(xlToLeft).Column - 5

Nếu tiêu đề ở dòng khác nữa thì sửa 4 cho thích hợp.

3.

Mã:
Private Sub CmBAppcept_Click()
    With Cells(ActiveCell.Row, startCol)    ' ô ̉ cùng cột với AnhCD và cùng dòng với ActiveCell
        If ListBResult.ListIndex > -1 Then .Value = ListBResult.List(ListBResult.ListIndex, 1)
        .Offset(0, 1).Value = CbBoxBD.List(CbBoxBD.ListIndex, 1)
        .Offset(0, 2).Value = CbBoxKT.List(CbBoxKT.ListIndex, 1)
        .Offset(0, 3).Value = CbBoxPL.Value
        .Offset(0, 4).Value = TextBox1.Value
        .Offset(0, 5).Value = TextBox2.Value
    End With

   UF_PictureCD.Hide
End Sub
 
Upvote 0
Nếu không muốn thao tác bằng tay điểm 2 trong bài #6 thì phải sửa chút điểm 1 và 2. Tức toàn bộ như sau:

Chú ý là dòng 4 chứa tiêu đề, vì thế có startCol = Me.Cells(4, Columns.Count).End(xlToLeft).Column - 5

Nếu tiêu đề ở dòng khác nữa thì sửa 4 cho thích hợp.
Cảm ơn anh ạ, anh hướng dẫn rất chi tiết và dễ hiểu.
 
Upvote 0
Web KT

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

Back
Top Bottom