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

Liên hệ QC

thanhphuongvip

Mới học VBA, hỏi ngu anh chị đừng chửi ạ
Tham gia
16/1/10
Bài viết
136
Được thích
22
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

  • 1561203294824.png
    1561203294824.png
    69.7 KB · Đọc: 6
  • Hoa Don Ban Hang.xlsb
    23.3 KB · Đọc: 8
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
 
Upvote 0
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

  • Hoa Don Ban Hang.xlsb
    24.2 KB · Đọc: 36
Upvote 0
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á !!?
 
Upvote 0
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
 
Upvote 0
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ố.
 
Upvote 0
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/diend...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
 
Upvote 0
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 đó
 
Upvote 0
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/diend...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!
 
Upvote 0
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

  • Hoa Don Ban Hang.xlsb
    32.3 KB · Đọc: 29
Upvote 0
À, code của bạn ducdoom và snow25 có bug đấy, do cái đoạn Redim và List = arrxxx
 
Upvote 0
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:

 
Upvote 0
Kg có cách nào resize cho nó nhỏ lại được bạn à, chỉ có cách ReDim 1 array khác rồi copy số dòng cần qua
 
Upvote 0
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.
 
Upvote 0
:) 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)
 
Upvote 0
:) 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ế.
 
Upvote 0
... 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".
 
Upvote 0
Web KT
Back
Top Bottom