Tìm kiếm trong listbox trên form

Liên hệ QC

diemhuyenanh

Thành viên hoạt động
Tham gia
6/9/09
Bài viết
167
Được thích
58
chào các bạn và các anh chị trên GPE!
tôi có một file dùng để lọc số lệnh. trên form có một listbox dùng để hiện thông tin của lệnh. giờ tôi muốn làm một comanbutton dùng để tìm kiếm item trên listbox khi listbox đã hiện thông tin về lệnh nhưng tôi không biết phải viết code thế nào mong các bạn và anh chị chỉ giúp.
yêu cầu:
- trên form tôi có vẽ thêm một comanbutton đặt tên là find
- khi bấm vào find thì sẽ hiện hộp inputbox cho ta nhập thông tin cần tìm kiếm
khi nhập xong bấm ok thì sẽ thực hiện tìm kiếm các item trên listbox, khi item nào thỏa điều kiện (tìm tương đối) thì trên listbox dòng chứa item đó sẽ được tô sáng giống như ta dùng chuột kích chọn vào dòng trên item trên listbox vậy
listbox có thể là một cột hoặc nhiều cột và nhiều dòng
khi tìm thấy item trong listbox nhiều dòng thì scroll sẽ tự cuộn để ta nhìn thấy item được trọn (giống như tìm trên sheet vậy).
file tôi đính kèm. bên sheets hic hic có nút comanbutton để hiển thị form
Mong được sự trợ giúp của các bạn và các anh trị
 

File đính kèm

- cho hỏi, bạn "sưu tầm" code của Form đó từ đâu vậy ? --=0

chào các bạn và các anh chị trên GPE!
...
khi nhập xong bấm ok thì sẽ thực hiện tìm kiếm các item trên listbox, khi item nào thỏa điều kiện (tìm tương đối) thì trên listbox dòng chứa item đó sẽ được tô sáng giống như ta dùng chuột kích chọn vào dòng trên item trên listbox vậy
listbox có thể là một cột hoặc nhiều cột và nhiều dòng
khi tìm thấy item trong listbox nhiều dòng thì scroll sẽ tự cuộn để ta nhìn thấy item được trọn (giống như tìm trên sheet vậy)

- "cũng có thể" làm được nhờ thuộc tính ListStyle = 1 - fmListStyleOption và MultiSelect = 1- fmMultiSelectMulti,
MultiSelect.png

nhưng nghĩ ko cần thiết vì khi đã lọc thì hiện luôn các Row thỏa điều kiện cho khỏe chứ sau đó còn phải kéo chuột lên xuống làm gì nữa ... (khi gặp dữ liệu lớn) ---> sẽ có thêm 1 nút nhả lọc để trở về điều kiện lọc trước đó.

'---------
hiện tại Form đó đã có sẵn code lọc Lệnh, Năm ---> bạn chỉ cần tạo thêm 1 vài Textbox để lọc kết hợp chứ ko cần phải show 1 hộp thoại Inputbox cho nút Find nữa.
 
Lần chỉnh sửa cuối:
Upvote 0
cái form này mình nhờ bạn siwtom trên gpe làm giúp, cũng từ form này mình đã học được cách để load range lên listbox
mình đang tập vba lên không sử lý được việc này.
trong cái form gửi kèm mình chỉ để làm minh họa thôi chứ form của mình thì listbox sẽ có nhiều dòng hơn thế. có thể tới hơn 300 dòng lận
và mỗi dòng là một mã số duy nhất không trùng lập.
thực tế thì khi mình load form lên nhiều dòng như vậy thì khi mình tìm đến mặt hàng nào thì để xem số lượng của nó thì mệt và mỏi mắt lắm
mình nghĩ là các bạn trên gpe có thể giúp mình code như ý trên dùng để tìm đến item mình cần cho nhanh
bạn có thể giúp mình code theo form trên để mình học và áp dụng vào form của mình được thì tốt
 
Upvote 0
cái form này mình nhờ bạn siwtom trên gpe làm giúp, cũng từ form này mình đã học được cách để load range lên listbox
mình đang tập vba lên không sử lý được việc này.
trong cái form gửi kèm mình chỉ để làm minh họa thôi chứ form của mình thì listbox sẽ có nhiều dòng hơn thế. có thể tới hơn 300 dòng lận
và mỗi dòng là một mã số duy nhất không trùng lập.
thực tế thì khi mình load form lên nhiều dòng như vậy thì khi mình tìm đến mặt hàng nào thì để xem số lượng của nó thì mệt và mỏi mắt lắm
mình nghĩ là các bạn trên gpe có thể giúp mình code như ý trên dùng để tìm đến item mình cần cho nhanh
bạn có thể giúp mình code theo form trên để mình học và áp dụng vào form của mình được thì tốt
Đang xài 2 G nên trả lời bài vất vả quá
Tạo thêm 1 TB và cho code này vào
PHP:
Private Sub TextBox1_Change()
Dim  i,  Found As String
With UserForm1
Found = .TextBox1.Value
If Found = "" Then Exit Sub
For i = 0 To .ListBox1.ListCount - 1
    If .ListBox1.List(i, 1) Like "*" & Found & "*" Then
        .ListBox1.Selected(i) = True
        Exit Sub
    End If
Next
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
- tiếp bước thành công của bác QHai --=0 em xin được phép "pha chế" thêm chút ít để đạt yêu cầu hơn ...
- vẫn thấy chưa khả thi khi kết quả tìm kiếm nằm ở đầu và đuôi của Listbox---> ko biết Scroll thế nào cho phải (phải dùng tay)!
ah.jpg

Mã:
Private Sub TextBox1_Change()
    Call QHai_Find(TextBox1.Value, 0)
End Sub

Private Sub TextBox2_Change()
    Call QHai_Find(TextBox2.Value, 1)
End Sub

Private Sub QHai_Find(MyTxt As Variant, cot As Integer)
'Dim data(), i, j, Res(), Found As String
Dim iloop As Long, Found As String, i As Long

    For iloop = 1 To ListBox1.ListCount
        ListBox1.Selected(iloop - 1) = False
    Next iloop
    '-------
    With UserForm1
        Found = MyTxt '.TextBox1.Value
        If Found = "" Then Exit Sub
        '-------
        For i = 0 To .ListBox1.ListCount - 1
            If UCase(.ListBox1.List(i, cot)) Like "*" & UCase(Found) & "*" Then
                .ListBox1.Selected(i) = True
            End If
            'Exit sub
        Next
    End With
End Sub
 

File đính kèm

Upvote 0
Thử cách này:
Nhấn nút Tìm khác, đánh dấu vào Tìm Đ.vị nhận hàng, vào ComboBox chọn 1 cửa hàng và xem kết quả.

Thông cãm hết Quota nên không tải File được (trang mạng chia sẽ cũng hết luôn).
 
Upvote 0
cảm ơn bạn phucbugis!

code bạn viết đúng theo ý mình rồi. hiện tại mình đưa vào file của mình hoạt động rất tốt.
U40 rồi ngồi học cái vụ VBA mới thấy mình thiệt thòi vì cái thời mình đi học đâu có internet như bây giờ
 
Upvote 0
bạn phucbugis ơi có thể gộp 2 textbox vào làm 1 được không. để 2 textbox nhìn hơi rối
bạn cho mình hỏi phần khai báo biến mình thấy có biến cot as integer mà sao nhìn toàn bộ thủ tục mình không thấy biến cot được gán cho cái gì là sao nhỉ.
có thể giải thích cho mình phần khai báo biến này không nhỉ QHai_Find(MyTxt As Variant, cot As Integer)
 
Upvote 0
cái form này mình nhờ bạn siwtom trên gpe làm giúp, cũng từ form này mình đã học được cách để load range lên listbox
mình đang tập vba lên không sử lý được việc này.
trong cái form gửi kèm mình chỉ để làm minh họa thôi chứ form của mình thì listbox sẽ có nhiều dòng hơn thế. có thể tới hơn 300 dòng lận
và mỗi dòng là một mã số duy nhất không trùng lập.
thực tế thì khi mình load form lên nhiều dòng như vậy thì khi mình tìm đến mặt hàng nào thì để xem số lượng của nó thì mệt và mỏi mắt lắm
mình nghĩ là các bạn trên gpe có thể giúp mình code như ý trên dùng để tìm đến item mình cần cho nhanh
bạn có thể giúp mình code theo form trên để mình học và áp dụng vào form của mình được thì tốt

Tôi đã đọc bài #1 nhưng không quan tâm. Nếu bạn viết xanh xanh ngay ở bài #1 thì tôi đã tò mò rồi.

1. Bỏ CommandButton "FIND"

2. Đặt TextBox1 xuống Form

3. Dán code ở dưới vào module UserForm. Tôi viết để bạn dán vào ngay ở trên đầu module. Chỗ xanh xanh là mới có, chỗ đen đen là code cũ.
À mà hiện thời ListBox1.MultiSelect = 0. Tôi để nguyên thế. Tức chỉ chọn (bôi mầu) được 1 mục. Ta di chuyển qua các mục được tìm thấy bằng F3

4. Khi cần tìm thì bạn gõ vào TextBox1. Code sẽ thu thập tất cả các mục được tìm thấy và chọn mục đầu tiên. Tiếp theo:
4a. Nếu bạn nhấn F3 (thường dùng để tìm kiếm) thì mục tiếp theo sẽ được chọn nếu có > 1 mục được tìm thấy. Nếu mục cuối cùng được chọn thì nhấn F3 sẽ chọn mục đầu tiên. Cứ như thế cho tới khi chán thì thôi.
4b. Nếu bạn gõ tiếp ký tự để tìm kiếm thì nếu cụm từ mới được tìm thấy thì trò chơi lại bắt đầu từ đầu - chọn mục đầu, F3 ... Nếu cụm từ mới không được tìm thấy thì không có mục nào của ListBox được chọn.

5. Tất nhiên khi mục nào đó của ListBox được chọn thì các giá trị thích hợp sẽ được nhập xuống 3 TextBox ở dưới để chỉnh sửa. Nếu không có mục nào được tìm thấy thì không có mục nào được chọn và nội dung tronmg 3 TextBox sẽ được xóa.

6. Bạn nên rút kinh nghiệm lần sau và soạn dữ liệu. Đã viết code thì phải test. Không thể viết chay là đúng ngay hoặc đủ ngay. Tôi phải thêm nhiều dữ liệu để ListBox có thanh cuộn và có những cụm từ xuất hiện nhiều lần để test F3. Gọi là test nhưng tôi mới chỉ test vài lần, chủ yếu xem có lỗi hay không và test F3.

7.
Mã:
[COLOR=#0000ff]Option Compare Text

[/COLOR][B]Private lastRow As Long, Arr(), dieukien()[/B][COLOR=#0000ff], ArrFind(), currFindIndex As Long

Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = &H72 Then
        If currFindIndex > 0 Then
            If UBound(ArrFind) > 1 Then
                currFindIndex = currFindIndex Mod UBound(ArrFind) + 1
                ListBox1.Selected(ArrFind(currFindIndex)) = True
            End If
        End If
    End If
End Sub

Private Sub TextBox1_Change()
Dim index, FindText As String, count As Long
    ReDim ArrFind(0 To 0)
    ListBox1.ListIndex = -1
    currFindIndex = 0
    FindText = TextBox1.Value
    If FindText <> "" Then
        For index = 0 To ListBox1.ListCount - 1
            If ListBox1.List(index, 1) Like "*" & FindText & "*" Then
                count = count + 1
                ReDim Preserve ArrFind(0 To count)
                ArrFind(count) = index
            End If
        Next
    End If
    If count > 0 Then
        currFindIndex = 1
        ListBox1.Selected(ArrFind(1)) = True
    End If
End Sub[/COLOR]

[B]Private Sub ComboChange()
Dim count As Long, r As Long, c As Long, k As Long, index() As Long, tmp()
    [/B][COLOR=#0000ff]currFindIndex = 0[/COLOR][B]
    ListBox1.Clear
    txtSoluong.Text = ""
    txtCTH.Text = ""
    txtGhiChu.Text = ""
    txtDonvi.Text = ""
    If cbLenh.ListIndex <> -1 And cbNam.ListIndex <> -1 Then
        ReDim index(1 To 1)
        For r = 1 To UBound(Arr)
            If dieukien(r, 1) = cbLenh.Text And dieukien(r, 2) = cbNam.Text Then
                count = count + 1
                ReDim Preserve index(1 To count)
                index(count) = r
            End If
        Next r
        If count > 0 Then
            txtDonvi.Text = dieukien(index(1), 3)
            ReDim tmp(1 To count, 1 To UBound(Arr, 2))
            For r = 1 To count
                k = index(r)
                For c = 1 To UBound(Arr, 2)
                    tmp(r, c) = Arr(k, c)
                Next c
            Next r
'           moi dong trong ListBox co o cuoi cung chua chi so dong tren sheet cua dong do
            ListBox1.List = tmp
        End If
    End If
End Sub[/B]
 
Lần chỉnh sửa cuối:
Upvote 0
cảm ơn siwtom và các bạn trên gpe đã giúp đỡ. từ code của các bạn tôi nghiên cứu và áp dụng cho file của mình rất ok
cảm ơn tất cả
 
Upvote 0
- tiếp bước thành công của bác QHai --=0 em xin được phép "pha chế" thêm chút ít để đạt yêu cầu hơn ...
- vẫn thấy chưa khả thi khi kết quả tìm kiếm nằm ở đầu và đuôi của Listbox---> ko biết Scroll thế nào cho phải (phải dùng tay)!
View attachment 125725

Mã:
Private Sub TextBox1_Change()
    Call QHai_Find(TextBox1.Value, 0)
End Sub

Private Sub TextBox2_Change()
    Call QHai_Find(TextBox2.Value, 1)
End Sub

Private Sub QHai_Find(MyTxt As Variant, cot As Integer)
'Dim data(), i, j, Res(), Found As String
Dim iloop As Long, Found As String, i As Long

    For iloop = 1 To ListBox1.ListCount
        ListBox1.Selected(iloop - 1) = False
    Next iloop
    '-------
    With UserForm1
        Found = MyTxt '.TextBox1.Value
        If Found = "" Then Exit Sub
        '-------
        For i = 0 To .ListBox1.ListCount - 1
            If UCase(.ListBox1.List(i, cot)) Like "*" & UCase(Found) & "*" Then
                .ListBox1.Selected(i) = True
            End If
            'Exit sub
        Next
    End With
End Sub

cho mình hỏi cái nha!
code này chỉ tìm đc mấy ký tự sau, với tìm đc cột đầu k hà. có cách nào tìm tất cả các cột k bạn
 
Upvote 0
bạn phucbugis ơi có thể gộp 2 textbox vào làm 1 được không. để 2 textbox nhìn hơi rối
bạn cho mình hỏi phần khai báo biến mình thấy có biến cot as integer mà sao nhìn toàn bộ thủ tục mình không thấy biến cot được gán cho cái gì là sao nhỉ.
có thể giải thích cho mình phần khai báo biến này không nhỉ QHai_Find(MyTxt As Variant, cot As Integer)
Cốt là bạn chọn cột nào để tìm đó
 
Upvote 0
Web KT

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

Back
Top Bottom