Hiển thị lại những mục đã lựa chọn trên listbox

Liên hệ QC

Mr.hieudoanxd

Thành viên thường trực
Tham gia
25/10/19
Bài viết
204
Được thích
48
Chào các anh chị!
Trong quá trình học cách sử dụng Listbox(LB) của Userform(UF) em có thấy 1 vấn đề em mô tả qua các bước sau đây:
1. Tích chọn các mục LB trong UF tại 1 vị trí
2. Thao tác tích chọn với vị trí khác......
3. Quay lại thao tác tích chọn với vị trí cũ để sửa. Lúc này những vị trí tích chọn trên đã di chuyển sang Lần cuối cùng thao tác
Em mong muốn khi quay lại vị trí cũ này vẫn nhớ các tích chọn cũ đó. Có thể lưu các biến đệm ghi lại trong 1 sheet nào đó nếu cần.
Loay hoay mãi cả tối nhưng vẫn kém quá không tìm được cách nào giải quyết, tìm trong diễn đàn chưa thấy bài tương tự
Mong các anh chị giúp đỡ. Em cảm ơn!
 

File đính kèm

  • ListBOx.xlsb
    677.4 KB · Đọc: 8
Cùng là 'Thước thép 5m' tại sao nếu ở A3 thì chọn hàng 3 còn ở A4 thì chọn hàng 5?
 
Upvote 0
Cùng là 'Thước thép 5m' tại sao nếu ở A3 thì chọn hàng 3 còn ở A4 thì chọn hàng 5?
Dữ liệu của em chỉ là tham khảo minh họa thôi anh. Không quá quan trọng cái đó ạ.
Nếu ở hàng 2 nó giống nhau thì nhất định dòng 1 nó khác nhau nên sẽ không có sự trùng lặp ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Em thấy so sánh ở cột 1 của listbox đâu có vấn đề trùng lặp dữ liệu đâu ạ
Mình nghĩ ô Textbox sẽ lấy giá trị tại ô hiện hành rồi dùng Split tách ra theo dấu ";" sau đó dùng vòng lặp For kiểm tra lại giá trị đã tách ra đối chiếu với Listbox cột 2, dòng nào giống thì sẽ Selected. Bạn thử code vậy được không.
Mã:
Sub ReviewResult() 'tao nut command hoac dua vao su kien UserForm_Initialize khi mo Form
    Dim str
    Dim i As Long, j As Long
    TxtBSelect = ""                                             'lam sach o textbox truoc khi nhap ket qua
    ListBResult.MultiSelect = 0: ListBResult.MultiSelect = 1    'lam sach cac vi tri da check chon dong
    If TxtBSelect = "" Then TxtBSelect = ActiveCell             'lay du lieu o hien hanh test ket qua
    str = Split(TxtBSelect, ";")
    For i = 0 To UBound(str)
        For j = 0 To ListBResult.ListCount - 1
            If str(i) = ListBResult.List(j, 1) Then
                ListBResult.Selected(j) = True
            End If
        Next
    Next
End Sub
và như anh Huuthang phân tích ở #2 thì 'Thước thép 5m' sẽ bị trùng và Selected sẽ sai vị trí làm ảnh hưởng đến Kết quả lựa chọn bị trùng lặp nhiều lần tại vị trí 'Thước thép 5m'. (Tốt nhất cột Phương pháp kiểm tra bạn đặt tên sao cho không trùng lặp là được)
Selected Listbox.JPG
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy ghi nhớ địa chỉ (index) items đã chọn, chứ sao lại ghi nhớ nội dung đã chọn.
 
Upvote 0
Vậy ghi nhớ địa chỉ (index) items đã chọn, chứ sao lại ghi nhớ nội dung đã chọn.
Lưu vị trí thì khi danh sách thay đổi cũng tèo. Phải có một trường nào đó không có dữ liệu trùng, nếu không có thì chắc phải tạo một trường ID phục vụ riêng cho mục đích này.
 
Upvote 0
Lưu vị trí thì khi danh sách thay đổi cũng tèo. Phải có một trường nào đó không có dữ liệu trùng, nếu không có thì chắc phải tạo một trường ID phục vụ riêng cho mục đích này.
Em đã sửa lại file ở bài #8 để dữ liệu không trùng rồi đó ạ. Em cũng nghĩ phải có 1 cái gì đó để lưu được lựa chọn này nhưng ko biết nên làm như thế nào. Anh có thể giúp em không ạ
 
Upvote 0
Em đã sửa lại file ở bài #8 để dữ liệu không trùng rồi đó ạ. Em cũng nghĩ phải có 1 cái gì đó để lưu được lựa chọn này nhưng ko biết nên làm như thế nào. Anh có thể giúp em không ạ
Tôi chỉ viết code cơ bản, bạn tự bẫy lỗi và chỉnh sửa lại cho phù hợp với nhu cầu nhé.
--
Thêm đoạn code sau vào UF_NoidungPPkiemtra
Mã:
Private Sub UserForm_Activate()
    RestoreListboxSelection Me.ListBResult, ActiveCell.Value
End Sub
Private Sub RestoreListboxSelection(ByVal oLB As MSForms.ListBox, ByVal sSelected As String, Optional ByVal sSep As String = ";;")
Dim i As Long
sSelected = sSep & sSelected & sSep
For i = 0 To oLB.ListCount - 1
    oLB.Selected(i) = (InStr(sSelected, sSep & oLB.List(i, 0) & sSep) > 0)
Next
End Sub
 
Upvote 0
Web KT
Back
Top Bottom