Chức năng tìm kiếm theo từ khóa trong Textbox VBA?

thanhphuongvip

Thành viên hoạt động
Tham gia ngày
16 Tháng một 2010
Bài viết
115
Được thích
16
Điểm
370
Tuổi
30
Xin chào gia đình GPE, mình xin trợ giúp 1 xíu!

Mình làm file Hóa đơn bán hàng, gồm có 2 sheet MaHang và HoaDon, các bạn giúp mình chức năng tìm kiếm trong Textbox Mã Vạch, để khi mình gõ một từ khóa vài con số trong mã vạch thì nó sẽ hiển thị list kết quả có chứa từ khóa kia để mình chọn (list danh sách mình có để sẵn ở sheet HoaDon, sau khi chọn xong thì dùng hàm Vlookup để lấy ra Tên sách, Đơn Vị Tính và Đơn giá vào 2 textbox bên dưới luôn.

219699

Các bạn giúp mình 2 vấn đề trên thôi (tạo chức năng tìm kiếm và hiển thị kết quả vlookup cho Tên Sách, Đơn Vị Tính, Đơn giá), còn viết code cho các nút mình học dc rồi. Xin cảm ơn nhiều!

Xin cảm ơn
 

File đính kèm

ThangCuAnh

Thành viên tích cực
Tham gia ngày
1 Tháng mười hai 2017
Bài viết
490
Được thích
373
Điểm
210
Nơi ở
Phờ lây cu
Hì hì, dân nẫu hả bạn?
Bạn nên đổi textbox thành combobox hay listbox, người dùng dễ thao tác hơn
 

snow25

Thành viên gắn bó
Tham gia ngày
24 Tháng bảy 2018
Bài viết
1,922
Được thích
1,665
Điểm
210
Xin chào gia đình GPE, mình xin trợ giúp 1 xíu!

Mình làm file Hóa đơn bán hàng, gồm có 2 sheet MaHang và HoaDon, các bạn giúp mình chức năng tìm kiếm trong Textbox Mã Vạch, để khi mình gõ một từ khóa vài con số trong mã vạch thì nó sẽ hiển thị list kết quả có chứa từ khóa kia để mình chọn (list danh sách mình có để sẵn ở sheet HoaDon, sau khi chọn xong thì dùng hàm Vlookup để lấy ra Tên sách, Đơn Vị Tính và Đơn giá vào 2 textbox bên dưới luôn.

View attachment 219699

Các bạn giúp mình 2 vấn đề trên thôi (tạo chức năng tìm kiếm và hiển thị kết quả vlookup cho Tên Sách, Đơn Vị Tính, Đơn giá), còn viết code cho các nút mình học dc rồi. Xin cảm ơn nhiều!

Xin cảm ơn
Ban thu
 

File đính kèm

thanhphuongvip

Thành viên hoạt động
Tham gia ngày
16 Tháng một 2010
Bài viết
115
Được thích
16
Điểm
370
Tuổi
30
Hi Snow, sản phẩm thực tế nó tới hàng ngàn sản phẩm nên thao tác kéo và tìm thì rất lâu, mình có thể chức năng lọc gõ theo mã vạch hoặc theo tên không Snow (Tốt nhất theo tên, hoặc theo mã và tên luôn càng tốt) ?

219702

Còn chỗ Tên Sách, Đơn Vị Tính, Đơn giá mình cho nó chạy theo Mã Vạch, vì đôi khi họ ko tìm kiếm bên cạnh mà quét mã vạch trực tiếp vào ô Mã Vạch, thì nó cũng chạy ra Tên Sách, ĐVT và Đơn Giá !!?
 

ducdoom

Thành viên mới
Tham gia ngày
24 Tháng mười hai 2018
Bài viết
41
Được thích
37
Điểm
15
Tuổi
24
Xin chào. Bạn thử add vào sự kiện textbox1_change nhé
Mã:
Private Sub TextBox1_Change()

    ListBox1.Clear
    If TextBox1.Text = vbNullString Then ListBox1.List = arr
    
    Dim arrFound() As Variant
    ReDim arrFound(1 To UBound(arr), 1 To 4)

    Dim i As Long, j As Long
    Dim searchText As String
    searchText = TextBox1.Text
    
    Dim maVach As String
    Dim tenSach As String
    
    For i = 1 To UBound(arr)
        maVach = arr(i, 1)
        tenSach = arr(i, 2)
        
        If InStr(1, maVach, searchText, vbTextCompare) > 0 Then
            a = a + 1
            For j = 1 To 4
                arrFound(a, j) = arr(i, j)
            Next j
        ElseIf InStr(1, tenSach, searchText, vbTextCompare) > 0 Then
            a = a + 1
            For j = 1 To 4
                arrFound(a, j) = arr(i, j)
            Next j
        End If
    Next i
    
    ListBox1.List = arrFound

End Sub
 

be09

TNMT_Đồng Nai
Tham gia ngày
9 Tháng tư 2011
Bài viết
7,952
Được thích
7,697
Điểm
560
Tuổi
62
Nơi ở
Biên Hòa, Đồng Nai
Hi Snow, sản phẩm thực tế nó tới hàng ngàn sản phẩm nên thao tác kéo và tìm thì rất lâu, mình có thể chức năng lọc gõ theo mã vạch hoặc theo tên không Snow (Tốt nhất theo tên, hoặc theo mã và tên luôn càng tốt) ?

View attachment 219702

Còn chỗ Tên Sách, Đơn Vị Tính, Đơn giá mình cho nó chạy theo Mã Vạch, vì đôi khi họ ko tìm kiếm bên cạnh mà quét mã vạch trực tiếp vào ô Mã Vạch, thì nó cũng chạy ra Tên Sách, ĐVT và Đơn Giá !!?
Nên phân nhóm (sử, địa, sinh ..v..v..) và tìm theo nhóm sách (mỗi nhóm có 12 dòng) tương ứng sách của 12 lớp, chứ không nên tìm theo Mã vạch vì không ai nhớ nổi mã vạch với 13 con số.
 

ongke0711

Thành viên thường trực
Tham gia ngày
7 Tháng chín 2006
Bài viết
276
Được thích
258
Điểm
710
View attachment 219702

Còn chỗ Tên Sách, Đơn Vị Tính, Đơn giá mình cho nó chạy theo Mã Vạch, vì đôi khi họ ko tìm kiếm bên cạnh mà quét mã vạch trực tiếp vào ô Mã Vạch, thì nó cũng chạy ra Tên Sách, ĐVT và Đơn Giá !!?
Bạn xem demo giống vậy ở bài #44.
Link: https://www.giaiphapexcel.com/diendan/threads/demo-form-tìm-kiếm-nhiều-cột-trong-listbox.142752/page-3#post-921729
Form này làm dạng giống ứng dụng bán hàng ở mấy shop, siêu thị dùng máy quét mã vạch, nếu quét không ra thì gõ mã vạch vô tìm kiếm và chọn.

219712
 

ThangCuAnh

Thành viên tích cực
Tham gia ngày
1 Tháng mười hai 2017
Bài viết
490
Được thích
373
Điểm
210
Nơi ở
Phờ lây cu
Bạn thanhphuongvip thiết kế lại cái form đi bạn, nói thật nhen, nhìn tệ quá.
Làm theo cái hình form bạn ongke vừa post đó
 

thanhphuongvip

Thành viên hoạt động
Tham gia ngày
16 Tháng một 2010
Bài viết
115
Được thích
16
Điểm
370
Tuổi
30
Xin chào. Bạn thử add vào sự kiện textbox1_change nhé
Mã:
Private Sub TextBox1_Change()

    ListBox1.Clear
    If TextBox1.Text = vbNullString Then ListBox1.List = arr
  
    Dim arrFound() As Variant
    ReDim arrFound(1 To UBound(arr), 1 To 4)

    Dim i As Long, j As Long
    Dim searchText As String
    searchText = TextBox1.Text
  
    Dim maVach As String
    Dim tenSach As String
  
    For i = 1 To UBound(arr)
        maVach = arr(i, 1)
        tenSach = arr(i, 2)
      
        If InStr(1, maVach, searchText, vbTextCompare) > 0 Then
            a = a + 1
            For j = 1 To 4
                arrFound(a, j) = arr(i, j)
            Next j
        ElseIf InStr(1, tenSach, searchText, vbTextCompare) > 0 Then
            a = a + 1
            For j = 1 To 4
                arrFound(a, j) = arr(i, j)
            Next j
        End If
    Next i
  
    ListBox1.List = arrFound

End Sub
Cảm ơn bạn ducdoom nhiều nhé! Đã có chức năng tìm kiếm theo mã vạch. Bạn cho mình hỏi thêm, trong code này, nếu muốn đổi sang tìm kiếm theo tên thì mình sữa chỗ nào bạn (hoặc có thể cho code tìm kiếm một lúc 2 cột thì càng hay)? Tại mình nghĩ lại là ko ai tìm kiếm theo mã vạch cả, vì nó dài và ko nhớ nổi nên tìm kiếm theo tên thì nên hơn.

Nếu được bạn giúp mình thêm chỗ này nữa nhé:
Còn chỗ Tên Sách, Đơn Vị Tính, Đơn giá mình cho nó chạy theo Mã Vạch, vì đôi khi họ ko tìm kiếm bên cạnh mà quét mã vạch trực tiếp vào ô Mã Vạch, thì nó cũng chạy ra Tên Sách, ĐVT và Đơn Giá !!?
Cảm ơn nhất nhiều!
Bài đã được tự động gộp:

Bạn thanhphuongvip thiết kế lại cái form đi bạn, nói thật nhen, nhìn tệ quá.
Làm theo cái hình form bạn ongke vừa post đó
Hello bạn, mình là dân tập sự, mình học code trước đã, rồi mình sẽ tiến hành sửa sang cho đẹp sau. Cảm ơn bạn đã góp ý nhé!
Bài đã được tự động gộp:

Bạn xem demo giống vậy ở bài #44.
Link: https://www.giaiphapexcel.com/diendan/threads/demo-form-tìm-kiếm-nhiều-cột-trong-listbox.142752/page-3#post-921729
Form này làm dạng giống ứng dụng bán hàng ở mấy shop, siêu thị dùng máy quét mã vạch, nếu quét không ra thì gõ mã vạch vô tìm kiếm và chọn.

View attachment 219712
Cảm ơn ongke, mình sẽ tìm hiểu ngay đây!
 

ducdoom

Thành viên mới
Tham gia ngày
24 Tháng mười hai 2018
Bài viết
41
Được thích
37
Điểm
15
Tuổi
24
Xin chào. Bạn thử add vào sự kiện textbox1_change nhé
Mã:
Private Sub TextBox1_Change()

    ListBox1.Clear
    If TextBox1.Text = vbNullString Then ListBox1.List = arr
   
    Dim arrFound() As Variant
    ReDim arrFound(1 To UBound(arr), 1 To 4)

    Dim i As Long, j As Long
    Dim searchText As String
    searchText = TextBox1.Text
   
    Dim maVach As String
    Dim tenSach As String
   
    For i = 1 To UBound(arr)
        maVach = arr(i, 1)
        tenSach = arr(i, 2)
       
        If InStr(1, maVach, searchText, vbTextCompare) > 0 Then
            a = a + 1
            For j = 1 To 4
                arrFound(a, j) = arr(i, j)
            Next j
        ElseIf InStr(1, tenSach, searchText, vbTextCompare) > 0 Then
            a = a + 1
            For j = 1 To 4
                arrFound(a, j) = arr(i, j)
            Next j
        End If
    Next i
   
    ListBox1.List = arrFound

End Sub
code này là tìm theo cả 2 đó bạn
vấn đề còn lại bạn thử xem file nhé
 

File đính kèm

FPT_online

Thành viên hoạt động
Tham gia ngày
27 Tháng mười 2013
Bài viết
131
Được thích
15
Điểm
370
Tuổi
36

Private Sub TextBox1_Change()

ListBox1.Clear
If TextBox1.Text = vbNullString Then ListBox1.List = arr

Dim arrFound() As Variant
ReDim arrFound(1 To UBound(arr), 1 To 4)

Dim i As Long, j As Long
Dim searchText As String
searchText = TextBox1.Text

Dim MaVach As String
Dim TenSach As String

For i = 1 To UBound(arr)
MaVach = arr(i, 1)
TenSach = arr(i, 2)

If InStr(1, MaVach, searchText, vbTextCompare) > 0 Then
a = a + 1
For j = 1 To 4
arrFound(a, j) = arr(i, j)
Next j
ElseIf InStr(1, TenSach, searchText, vbTextCompare) > 0 Then
a = a + 1
For j = 1 To 4
arrFound(a, j) = arr(i, j)
Next j
End If
Next i
ListBox1.List = arrFound
End Sub

Có cách nào để Redim lại mảng ArrFound Sau khi đã biết chiều cao tương ứng là a không ạ?
Bài đã được tự động gộp:

Rich (BB code):
Private Sub TextBox1_Change()

    ListBox1.Clear
    If TextBox1.Text = vbNullString Then ListBox1.List = arr
    
    Dim arrFound() As Variant
    ReDim arrFound(1 To UBound(arr), 1 To 4)

    Dim i As Long, j As Long
    Dim searchText As String
    searchText = TextBox1.Text
    
    Dim MaVach As String
    Dim TenSach As String
    
    For i = 1 To UBound(arr)
        MaVach = arr(i, 1)
        TenSach = arr(i, 2)
        
        If InStr(1, MaVach, searchText, vbTextCompare) > 0 Then
            a = a + 1
            For j = 1 To 4
                arrFound(a, j) = arr(i, j)
            Next j
        ElseIf InStr(1, TenSach, searchText, vbTextCompare) > 0 Then
            a = a + 1
            For j = 1 To 4
                arrFound(a, j) = arr(i, j)
            Next j
        End If
    Next i
    ListBox1.List = arrFound
End Sub
Bài đã được tự động gộp:

 

ongke0711

Thành viên thường trực
Tham gia ngày
7 Tháng chín 2006
Bài viết
276
Được thích
258
Điểm
710
Mình đã kiểm tra và thấy rất ok, cảm ơn bạn nhiều nhé!!!
:) tôi có một nhận xét là phần lớn nhiều bạn thường code cho từng cái Form, cái control riêng biệt nào đó chứ không viết thành một Sub hay hàm để có thể gọi lại (tái sử dụng) ở mọi form mà không cần phải viết lặp lại toàn bộ cái code đó. Như ví dụ trên bạn viết code tìm đích danh "mavach, tensach.." ngay trong code, nếu trong cùng 1 Form có thên cái listbox tìm tên nhà xuất bản, tìm tác giả --> lại phải viết lại một đống code tìm kiếm cho các listbox mới.
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
6,612
Được thích
7,695
Điểm
560
:) tôi có một nhận xét là phần lớn nhiều bạn thường code cho từng cái Form, cái control riêng biệt nào đó chứ không viết thành một Sub hay hàm để có thể gọi lại (tái sử dụng) ở mọi form mà không cần phải viết lặp lại toàn bộ cái code đó. Như ví dụ trên bạn viết code tìm đích danh "mavach, tensach.." ngay trong code, nếu trong cùng 1 Form có thên cái listbox tìm tên nhà xuất bản, tìm tác giả --> lại phải viết lại một đống code tìm kiếm cho các listbox mới.
Có nhiều lý do:
1. lý do lớn nhất là hầu hết các code đều là loại code chữa cháy, không có thiết kế theo giải thuật. Và vì vậy chẳng xứng đáng giữ đó dùng lại.
2. lý do kế tiếp là code được viết theo kỹ thuật mì ăn liền thì tìm đích danh cho nó khoẻ.
3. lý do thứ ba là ở đây không có được mấy người có căn bản lập trình cho nên cụm từ "quản lý code" đối với họ là điều xa lạ.
4. các lý do khác... (càng xa lạ hơn nữa)
 

thanhphuongvip

Thành viên hoạt động
Tham gia ngày
16 Tháng một 2010
Bài viết
115
Được thích
16
Điểm
370
Tuổi
30
:) tôi có một nhận xét là phần lớn nhiều bạn thường code cho từng cái Form, cái control riêng biệt nào đó chứ không viết thành một Sub hay hàm để có thể gọi lại (tái sử dụng) ở mọi form mà không cần phải viết lặp lại toàn bộ cái code đó. Như ví dụ trên bạn viết code tìm đích danh "mavach, tensach.." ngay trong code, nếu trong cùng 1 Form có thên cái listbox tìm tên nhà xuất bản, tìm tác giả --> lại phải viết lại một đống code tìm kiếm cho các listbox mới.
Bạn nói rất đúng, mình cũng có ý làm như bạn, có nghĩa là tái sử dụng cho bảng khác, nhưng mình mới học lập trình nên tìm đc cách viết code trước đã, sau một thời gian làm rồi mình sẽ rút kinh nghiệm sẽ tối ưu hóa chỗ nào, và làm cách nào để tái sử dụng. Vấn đề này thuộc về kỹ năng thực tế.
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
6,612
Được thích
7,695
Điểm
560
... Vấn đề này thuộc về kỹ năng thực tế.
Sao bạn biết nó là thực tế?
"thực tế" theo ngữ cảnh của kỹ năng làm việc là phương pháp/quy trình mà đã được thống kê chứng minh là thành công. Tức là tỷ lệ thành công của phương pháp tương đối cao.
Chính bài #17 ngụ ý rằng phương pháp này khó thành công.

Ở diễn đàn này chỉ có một phương pháp được chứng minh thành công là "kỹ năng hỏi tới hỏi lui". Gần như bất cứ vấn đề gì, cứ lên đây hỏi miết, tống thêm vài câu "chắc đề bài này khó", "up... up... [sic]" là thể nào cũng có code giải quyết.
Như vậy suy ra đâu có cần "tái sử dụng" hay gì cả.

Một khi GPE còn tồn tại thì tất cả "kỹ năng thực tế" chỉ túm lại trong cụm từ "heo mi".
 
Top