Bài viết: Tạo danh sách tìm kiếm thông minh ngay trong ô

Liên hệ QC

kyo

Nguyễn Khắc Duy
Thành viên danh dự
Tham gia
4/6/06
Bài viết
901
Được thích
2,714
Tạo danh sách tìm kiếm thông minh ngay trong ô


Nếu một ngày bạn chán Data Validation vì những bất tiện của nó như là:
- Đến từng ô và click chuột vào mũi tên thì danh sách mới hiện ra.
- Danh sách càng dài thì càng khó lựa chọn vì sẽ phải kéo thanh trượt xuống để tìm.


Và bạn ước có một giải pháp nào đó khác hơn, chẳng hạn như:
- Khi đến từng ô, một bảng chọn dữ liệu sẽ tự hiện ra.
- Bảng dữ liệu này có thể như google, nghĩa là đánh vài ký tự và danh sách sẽ tự rút gọn để dễ chọn lựa.


Vậy bài viết này là dành cho bạn (cám ơn dòng code của anh quanghai1969).

Đầu tiên, bạn có thể tải file đính kèm của GPE ở dưới bài viết này. Và khi bạn mở lên, bạn sẽ thấy giao diện như sau:

9K_LicdKVF6DUF4hmNHIsSJKGGEsk-ce24rw1aamFimA742L-IWrXcalswJzAj1XOjiq-EqCyF-9mmnspAG8PPDo2b4rcHpg-bknIqTLDCUAuNiWdLv0uLZFjmWcVHeJtT2Le93_2zM-jCHpJfkzqeJ32WJ96_YuLdpgyQRNfVCmTKE_xu1MKeSm6TcNgzCeCO6lRQ48as4k2iFQ1yX5gANDnqi7h7wqcwPyPIN5didUuiXdck5IlRLPkOwLxEuT9YUxdTVIocWbuxpFGeZEjyxxE9GLCxuHBqj5Vsc6wQXJYAU9q39s38pJxBqkDLklxIVwrkpNhazzukDePz2qM-pp7Euoqs3c9U7g83nD8wemZwOrRJCqQZPTtzXEc_Wgzrr_UUI8TyKEBfqwUP7GTOBVLiCXIwbbtOPQJe1jUsfD2Y04WCOQYwXVEbhBlQomM5lM3pQHhqs258ao69w9viB08jpshHC0puUjksR4jRTekgi_pdunoC7ufz24Cknx6G9StJmGvy317q5tqSLRC0V-1PGZ2uiH_1OqP6YX-WS4NI8wsSngdsGNV3fud7AFrhKrShwuglygw-zZEz52ME9LYqejJ-r9emyS188xmWer-v8BCEE=w736-h568-no


Nếu bạn chọn vào cột C, một danh sách thông minh cùng vùng nhập dữ liệu sẽ tự hiện ra, và bạn có thể gõ vài ký tự để tìm kiếm thông minh. Đặc biệt hơn, những code trong file này đã được chỉnh sửa để có khả năng tương tác bằng bàn phím cho tiện dụng hơn với người dùng:
- Bạn có thể dùng các phím mũi tên sang phải, lên xuống để chọn kết quả.
- Sau khi chọn, nhấn Enter để nhập liệu.
- Khi không muốn chọn, nhấn Esc để thoát ra hoặc dùng chuột nhấn qua một ô khác hay bấm tiếp các phím mũi tên, danh sách dữ liệu sẽ tự động tắt để bạn có thể tương tác trực tiếp với ô.


TY5phusfpn03pfxfE2hRUkz4zky8PaxVeSzwLXQkHUdOfomfZ4ANB2IZp__lhjjeQHefnNauec82OA47FrLuuBedZbpPOt4oIpu8RLgjxbVnshy4zQI3FkTzPe1igyfkH3gfdMt8g80au9NvIPjCOd42miL7SQPAh7FrJQyXdTiSanObNuPVRPXbgMPKXEsbGs7oB2qbr5sxrhNtkx5R7e-aTgcS1NoXoDyGdHK7r7wUVKrKgPFezcJXcMp7ECJDuaCcXTFFsTi0AD4_UlMRMRN7xmlQWhgbE9vM8WBKRJ97pUWhJaHP6mSQuz0Co62aVYm3UT1U86nLD7LMoc3uDe2gPfH0OPIdoQD8Y1fiGvaO6O_M_N-9FHHv7YrFr3ngQDUHw_p-AcjqMIyfBRqzZlLip8MBkUSFQy89f2hwmvz_z-dfukQh9Y3uIwmkFjLwKPAvQI_VSopoxSwkqdgkMryDMaUjNkZbm103UDt0GAV8RF1nCRrElPGSGVec9fzI4p6pr331eVrH0X3DfqjdIDQX4HWiRoAMjwxBE-x_BE3Ezrt2OMjgKrEa0xycUpDS0V3d20aVcuajIbVmfQCkqUKTW30TSIBvnUsJAB01kyJIk2-sX9k=w757-h609-no


Ngoài ra, để thêm bớt các hạng mục trong danh sách, bạn có thể qua sheet DM.khach.hang để chỉnh sửa tương ứng. Danh sách dữ liệu của bạn chính là cột A trong sheet này.

Vậy làm cách nào để tùy biến, chỉnh sửa cho danh sách xuất hiện ở một chỗ khác? Để làm được điều này, bạn cần một chút căn bản về VBA, cụ thể bạn nhìn đoạn code sau

Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row > 8 And Target.Row < [B]18[/B] Then
   If Target.Column = 3 Then
      thaydoi
   Else
      Hide
   End If
Else
   Hide
End If
End Sub

Đoạn code này cho thấy từ hàng thứ 9 cho đến hàng thứ 17 và trong cột số 3 tương ứng cột C thì sẽ kích hoạt thủ tục thaydoi, hay là bảng chọn sẽ hiện ra. Do đó, bạn có thể thay đổi những giá trị này cho phù hợp với bảng chọn của bạn.

Ngoài ra, nếu muốn bạn có thể tiếp tục thảo luận đề tài này thông qua topic này.

Chúc bạn thành công.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Em muốn list danh sách chọn có độ rộng hơn thì sửa code thế nào ạ?
 
Ý bạn là cái khung to ra? Bạn vào thẻ Developer của Excel -> chọn Design -> nắm cái ô đó kéo dài ra -> bấm Design một lần nữa để code chạy bình thường.
 
Mình muốn listbox hiển thị 2 cột hoặc nhiều hơn nữa để xem thông tin dễ hơn? Nếu mình muốn chọn 1 mã hàng nào đó đúng tên hàng của mã đó thì làm thế nào ạ?
 
Cám ơn anh. Em đang rất cần file như thế này. Khi thay đổi theo yêu cầu, em gặp 2 vấn đề sau:
- Trong sheet DM Khách hàng, em copy danh sách của em để thay vào. Cột C xổ ra danh sách chọn nhưng em chọn 1 tên trong đó thì không được.
- Khi chọn từ danh sách, em phải nhập chính xác, cả chữ thường hay chữ hoa. Ví dụ: em chọn Lâm Chí Dĩnh (phải gõ chữ thường "lâm" mới ra, còn nếu gõ "Lâm" thì không ra.
Anh hướng dẫn giúp em cách giải quyết 2 vấn đề trên với.
Cám ơn anh!
 
Lần chỉnh sửa cuối:
Chào bạn bebeen,

kyo đã upload thêm file trên bài viết, bạn có thể vào down lại nhé. Trong file đó kyo đã thêm 1 cột B bên sheet dữ liệu để bạn có thể điền thêm thông tin nếu bạn muốn. Một số chỗ bạn để ý để chỉnh sửa theo ý bạn đó là:
- Bạn vào properties của Listbox, phần ColumnCount, bạn chỉnh lại con số tùy theo bạn cần bao nhiêu cột hiện ra. Ví dụ ở đây kyo chỉ chỉnh 2, nhưng bạn hoàn toàn có thể lên 3, 4.
- Về code, bạn nhìn vào đây nhé:

Mã:
Sub loc()Dim dl(), i As Long, c As Byte, j As Long
With Sheet2
   dl = .[A2:B1000].Value 'Chỉnh lại dữ liệu nguồn trong trường hợp muốn có thêm, ví dụ như để hiện thêm thông tin trong listbox ở cột 3, 4 thì cần quét thành C1000 hay D1000.
End With
Sheet1.ListBox1.Clear
c = 1
j = 1
For i = 1 To UBound(dl)
   If dl(i, c) <> "" Then
      If UCase(TV(dl(i, c))) Like UCase(TV("*" & Sheet1.TextBox1.Value & "*")) Then
         Sheet1.ListBox1.AddItem dl(i, c)
         Sheet1.ListBox1.List(Sheet1.ListBox1.ListCount - 1, [SIZE=3][B]1[/B][/SIZE]) = dl(i, c + 1) 'Đây là dòng code để thêm cột cho Listbox hiện ra, nếu bạn muốn thêm cột nữa thì copy paste thêm, đồng thời chỉnh số 1 kyo tô đậm thành số 2, 3 tương ứng.
         j = j + 1
      End If
   End If
Next
End Sub

Chào bạn Khanh Dung,

Về câu 1 của bạn: bạn chọn bằng mũi tên và phím Enter nhé.
Về câu 2: Bạn cũng down lại file kyo vừa upload nhé, trong đó kyo đã sửa cho bạn tìm được cả chữ hoa và thường.

kyo.
 
Cám ơn kyo nhiều!
Mình làm theo hướng dẫn của kyo để thêm 1 cột đơn vị tính nữa mà không được:
Mã:
Sub loc()
Dim dl(), i As Long, c As Byte, j As Long
With Sheet2
   dl = .[A2:C1000].Value 'Chỉnh lại dữ liệu nguồn trong trường hợp muốn có thêm, ví dụ như để hiện thêm thông tin trong listbox ở cột 3, 4 thì cần quét thành C1000 hay D1000.
End With
Sheet1.ListBox1.Clear
c = 1
j = 1
For i = 1 To UBound(dl)
   If dl(i, c) <> "" Then
      If UCase(TV(dl(i, c))) Like UCase(TV("*" & Sheet1.TextBox1.Value & "*")) Then
         Sheet1.ListBox1.AddItem dl(i, c)
         Sheet1.ListBox1.List(Sheet1.ListBox1.ListCount - 1, [SIZE=3]1[/SIZE]) = dl(i, c + 1)
         Sheet1.Listbox1.List(Sheet1.ListBox1.ListCount - 1, 2) = dl(i,c + 1)
         j = j + 1
      End If
   End If
Next
End Sub
 
Lần chỉnh sửa cuối:
Chào bạn,

kyo nghĩ vấn đề nằm ở chỗ bạn quên không chỉnh lại properties của Listbox. Giả sử nếu bạn thêm 1 cột nữa thì bạn cần phải vào properties của Listbox và chỉnh ColumnCount từ 2 thành 3 nhé.

kyo.
 
Chào bạn,

kyo nghĩ vấn đề nằm ở chỗ bạn quên không chỉnh lại properties của Listbox. Giả sử nếu bạn thêm 1 cột nữa thì bạn cần phải vào properties của Listbox và chỉnh ColumnCount từ 2 thành 3 nhé.

kyo.

Mình đã sửa chỗ này:
Mã:
Sub thaydoi()
With S2.TextBox1
        .Visible = False
        .Visible = True
        .Left = ActiveCell.Left
        .Top = ActiveCell.Top
        .Width = ActiveCell.Width
        .Height = ActiveCell.Height
        .Value = ""
        .Activate
End With
With S2.ListBox1
        .Visible = False
        .Visible = True
[COLOR=#0000cd][B]        .ColumnCount = 3[/B][/COLOR]
[COLOR=#0000cd][B]        .ColumnWidths = "50;200;20"[/B][/COLOR]
        .Width = "300"
        .Left = ActiveCell.Offset(, 1).Left
        .Top = ActiveCell.Offset(, 1).Top
        .Clear
End With
End Sub
 
Bạn sửa như thế cũng được bạn. Vậy bạn còn gặp lỗi không?
 
Vẫn không được kyo ạ! Không biết còn nguyên nhận nào khác nữa không?
Load_DL.jpg
Vậy kyo sửa lại file mẫu với hiển thị 3 cột?
 
Lần chỉnh sửa cuối:
Mình đưa file lên nhờ kyo xem dùm ha. Mình đã lập ở sheet PN.
Click to download
 

File đính kèm

  • QLHH.rar
    71.7 KB · Đọc: 94
Lần chỉnh sửa cuối:
Mình đưa file lên nhờ kyo xem dùm ha. Mình đã lập ở sheet PN.
Click to download

trong cái sub loc () có 2 dòng giống nhau

Mã:
S2.ListBox1.List(S2.ListBox1.ListCount - 1, 1) = dl(i, c + 1)
S2.ListBox1.List(S2.ListBox1.ListCount - 1, 2) = dl(i, c + [COLOR=#ff0000][SIZE=4][B]1[/B][/SIZE][/COLOR])

có lẽ nó nên viết là

Mã:
S2.ListBox1.List(S2.ListBox1.ListCount - 1, 1) = dl(i, c + 1)
S2.ListBox1.List(S2.ListBox1.ListCount - 1, 2) = dl(i, c + [COLOR=#ff0000][SIZE=4][B]2[/B][/SIZE][/COLOR])

nói chung thì cách viết code trên mang tính chất khai mở để làm quen khái niệm sử dụng ô tìm kiếm bằng VBA
còn để áp dụng được trên các file số lượng mã hàng lớn thì còn phải sửa nhiều .
 
e đã tải về và dùng thử khi sửa lại chạy trên file của mình thì nó bị lỗi như này, thì phải xử lý như thế nào ạ
Untitled_zps8g2pdvbi.png
[/URL][/IMG]
 
Nhờ chỉnh sửa file Tìm kiếm và nhập dữ liệu

Chào Kyo,
Tớ thấy file tìm dữ liệu thông minh của bạn rất hay và tiện. Tớ đang mày mò để chỉnh nó sao cho phù hợp công việc của mình.
Tuy nhiên, đang loay hoay và muốn thêm 1 số chức năng như:

  1. Click vào Kết quả tìm bên phải thì nó sẽ nhập luôn vào ô đó. (Đang có dữ liệu rồi thì hiện xác nhận. Có sửa không? OK à Replace; Nếu đang là ô trắng thì nhập luôn vào ô)
  2. Bảng dữ liệu của mình khá rộng, từ B2 đến H1000 (Bên Sheet 2) à Có thể chỉnh cách nào để chỉ chọn 1 ô lỗi thôi. VD: Ô B2:B2 Hoặc H3:H3 thôi. Và nhập vào ô đã chọn bên Sheet 1.
Bạn chỉ tớ với nhé
Kiem soat Loi Ver 3.rar
 

File đính kèm

  • Kiem soat Loi Ver 3.rar
    22.6 KB · Đọc: 75
Lần chỉnh sửa cuối:
Chào anh/ chị: Kyo
Em thấy bài viết này rất hay và hữu ích, em chỉ muốn sửa một chút như này thì làm thế nào ạ:
Giả sử tại DM.Khach.hang em có 3 cột
Cột A: mã khách ( VD: KH001,KH002...)
Cột B: Tên khách (như cột A của anh chị)
Cột C: Địa chỉ ( như cột B của anh chị)
Tại sheet Lẹnh.giao.hang em muốn tìm tên khách hàng nhưng khi điền thì điền mã khách thì sửa lại code trên như nào ạ
 
Anh chị cho em hỏi làm thế nào để khắc phục lỗi: Run-time error '1004' khi em chia sẻ file đó thì macro bị lỗi
 
Xin chào bạn Kyo !
Mình muốn xin bạn Video hướng dẫn làm Tạo danh sách tìm kiếm thông minh ngay trong ô

Mình chưa hiểu bạn giúp mình nhé.
Thanks bạn nhiều.
 
cho em hỏi. tại phần này "*" & Sheet1.TextBox1.Value & "*"
mình viết thế nào để khi tìm kiếm
ví dụ
TextBox1.Value = "Nguyễn Anh"
thì danh sách trả về
Khanh Nguyễn
Nguyễn Khải Anh
Nguyễn Văn Nhường
tức là tìm kiếm giống trên google vậy ấy.
hễ có từ nào trong đoạn text tìm kiếm thì cho vô hết
 
Web KT
Back
Top Bottom