Hỏi cách tạo combo box thông minh

Liên hệ QC
Oh không phải vậy đâu anh Trọng Nghĩa ơi. Em đang làm 1 combo box tại ô C2, combo box này để tìm tên khách hàng theo cách mà anh quanghai1969 trình bày tại topic này (đánh 1 text box nó sẽ list ra tên khách hàng chứa text mình vừa nhập). sau khi đã chọn được khách hàng thì nó sẽ kết xuất ra mã kh tương ứng tại ô B2.
Làm vui chơi thế này rồi tính tiếp. Chọn C2, xuất hiện cái Textbox, muốn nhập gì tùy ý. Nhập xong nhấp đúp chuột tại tên khách hàng muốn chọn >> hên xui nha
 

File đính kèm

  • Copy of combo box.rar
    16.6 KB · Đọc: 210
Lần chỉnh sửa cuối:
Cám ơn anh Quanghai1969 đã giúp đỡ. nhưng anh có thể sửa lại giúp em giống như cách anh đã làm ở những bài hướng dẫn trên được không ạ (khi chọn và nhập dữ liệu vào ô C2 sẽ đổ ra danh sách nội dung chứa giá trị vừa gõ). Cách của anh đang làm sẽ làm mất hết dữ liệu phía dưới (B3:E3) của em. rất mong anh giúp thêm.
 
Các Bác giúp E chỉ cho nhập ở 2 ô theo 2 list khác nhau như mình ghi ở file đính kèm đc không ạ, loay hoay thử sửa mãi mà không được...
 

File đính kèm

  • Copy of xin huong dan chi cach tạo listbox.xlsm
    28.3 KB · Đọc: 26

File đính kèm

  • Copy of xin huong dan chi cach tạo listbox.xlsm
    28.7 KB · Đọc: 144
Lần chỉnh sửa cuối:
trong khi chờ đợi quanghai1969, dùng tạm file kèm này đi
tôi chỉ sửa chút code thui, xem sẽ hiểu
Chắc là đúng ý bạn rui

Tuyệt vời cám ơn bạn rất nhiều.. Mình vừa xem thử nhưng hình như có lúc nó lọc chưa chính xác thì phải.. lọc tương đối đúng thôi, như vậy nếu dữ liệu nhiều cái tên giống giống nhau chắc tìm toét mắt. Mình đang định sử dụng để lọc phụ tùng xe Ô tô: Trên 20 nghìn loại phụ tùng, kể ra Bác có cách nào lọc chính xác những từ mình gõ vào thì đúng là No1.

Dù sao cũng cảm ơn Bác rất nhiều...!
 
Tuyệt vời cám ơn bạn rất nhiều.. Mình vừa xem thử nhưng hình như có lúc nó lọc chưa chính xác thì phải.. lọc tương đối đúng thôi, như vậy nếu dữ liệu nhiều cái tên giống giống nhau chắc tìm toét mắt. Mình đang định sử dụng để lọc phụ tùng xe Ô tô: Trên 20 nghìn loại phụ tùng, kể ra Bác có cách nào lọc chính xác những từ mình gõ vào thì đúng là No1.

Dù sao cũng cảm ơn Bác rất nhiều...!

Vì đó là cách lập chính của quanghai là tìm và liệt kê các item gần đúng mà thôi,

Nếu bạn thích chính xác cũng được thôi, quá đơn giản, bạn bỏ các dấu * trong câu lệnh đi, (hoặc chỉ bỏ dấu * cuối là xong,

Dù sao dù sao cũng là dù sao là máy khôgn phải con người
 
Vì đó là cách lập chính của quanghai là tìm và liệt kê các item gần đúng mà thôi,

Nếu bạn thích chính xác cũng được thôi, quá đơn giản, bạn bỏ các dấu * trong câu lệnh đi, (hoặc chỉ bỏ dấu * cuối là xong,

Dù sao dù sao cũng là dù sao là máy khôgn phải con người

Vâng, có phải bỏ đi thế này không ạ?

Mã:
Sub Loc()    Dim kq(), i, j, sT As String
    sT = "*" & UCase(Sheet1.TextBox1.Value) & ""
    For i = 1 To UBound(dl)
       If dl(i, 1) <> "" Then
          If UCase(dl(i, 1)) Like sT Then
             j = j + 1
             ReDim Preserve kq(1 To j)
             kq(j) = dl(i, 1)
          End If
       End If
    Next
    If j Then Sheet1.ListBox1.List = kq
End Sub

Nhưng khi nhập nó vẫn chưa tìm chính xác tên được Bác ạ. VD E gõ chữ Thiên và dấu cách thì nó vẫn thể hiện cả loạt như hình dưới đây %#^#$. Có cách nào fix được không Bác? Với lại E xin hỏi thêm muốn kéo rộng cái ô combobox (vì tên dữ liệu dài, combobox ngắn không đọc được hết chữ) thì làm thế nào ạ..?

22.jpg
 
Lần chỉnh sửa cuối:
Vâng, có phải bỏ đi thế này không ạ?

Mã:
Sub Loc()    Dim kq(), i, j, sT As String
    sT = "*" & UCase(Sheet1.TextBox1.Value) & ""
    For i = 1 To UBound(dl)
       If dl(i, 1) <> "" Then
          If UCase(dl(i, 1)) Like sT Then
             j = j + 1
             ReDim Preserve kq(1 To j)
             kq(j) = dl(i, 1)
          End If
       End If
    Next
    If j Then Sheet1.ListBox1.List = kq
End Sub

Nhưng khi nhập nó vẫn chưa tìm chính xác tên được Bác ạ. VD E gõ chữ Thiên và dấu cách thì nó vẫn thể hiện cả loạt như hình dưới đây %#^#$. Có cách nào fix được không Bác?

sai một li đi 1 dặm, hihihi
tôi nhầm phải giữ lại dấu sao cuối và bỏ dấu * đầu,

sửa lệnh
PHP:
sT = "*" & UCase(Sheet1.TextBox1.Value) & "*"
thành
PHP:
sT = UCase(Sheet1.TextBox1.Value) & "*"
Khi này listbox sẽ liệt kê các item có phần text đầu giống bạn gõ

--------------
Với lại E xin hỏi thêm muốn kéo rộng cái ô combobox (vì tên dữ liệu dài, combobox ngắn không đọc được hết chữ) thì làm thế nào ạ..?

xem file kèm, độ rộng textbox cũng như listbox bằng với độ rộng cột nhập dữ liệu

trong file này đã sửa cả 2 vđề trên
 

File đính kèm

  • Copy of xin huong dan chi cach tạo listbox.xlsm
    30.7 KB · Đọc: 206
Lần chỉnh sửa cuối:
Rất rất cảm ơn Bác. Em đã lấy về và đã xem. Độ rộng của ComboBox Bác sửa như vậy quá tuyệt rồi miễn chê.. Nhưng cái vụ tìm chính xác tên E vừa thử và thấy vẫn chưa ổn Bác ạ..

Thông thường, theo cách hiểu chung, mỗi lần gõ phím Space bar cón nghĩa là câu vừa gõ trước đó đã được hoàn thành. Như vậy, vẫn trong file trên em thử gõ thiện và dấu cách thì nó mới chỉ hiện ra tên thanh phương dù trong list có 2 tên thỏa mãn chữ thiệnhoàng thiện nhật thiện. Như vậy có nghĩa vẫn chưa đáp ứng được yêu cầu đúng không Bác.

Em không biết là có thể cải tiến tìm chính xác được không, nếu được thì E rất mong và nhờ Bác sửa thêm giúp E vì như E nói, dữ liệu của E để cập nhật là rất lớn. Nếu tìm đúng tên gõ vào đã rất nhiều rồi. Nếu hiện cả tên gần đúng chắc lại oải...

E xin trân trọng cảm ơn.
 
Lần chỉnh sửa cuối:
. Nhưng cái vụ tìm chính xác tên E vừa thử và thấy vẫn chưa ổn Bác ạ..

Thông thường, theo cách hiểu chung, mỗi lần gõ phím Space bar cón nghĩa là câu vừa gõ trước đó đã được hoàn thành. Như vậy, vẫn trong file trên em thử gõ thiện và dấu cách thì nó mới chỉ hiện ra tên thanh phương dù trong list có 2 tên thỏa mãn chữ thiệnhoàng thiện nhật thiện. Như vậy có nghĩa vẫn chưa đáp ứng được yêu cầu đúng không Bác.

E xin trân trọng cảm ơn.

Không hiểu chính xác của bạn là sao, bạn cứ nói không vậy cần thì đưa file nên,

giờ tạm sửa câu lệnh sT=.... thành như sau
sT = "*" & Trim(UCase(Sheet1.TextBox1.Value)) & "*"

sửa chỗ câu lệnh If thành như sau

If UCase(Trim(dl(i, 1))) Like sT Then


xem sao

còn vẫn chưa được, thì bạn phải định nghĩa chính xác thế nào
 
Không hiểu chính xác của bạn là sao, bạn cứ nói không vậy cần thì đưa file nên,

giờ tạm sửa câu lệnh sT=.... thành như sau
sT = "*" & Trim(UCase(Sheet1.TextBox1.Value)) & "*"

sửa chỗ câu lệnh If thành như sau

If UCase(Trim(dl(i, 1))) Like sT Then


xem sao

còn vẫn chưa được, thì bạn phải định nghĩa chính xác thế nào

Vâng, sorry Bác E cũng hơi dài dòng. Ý em muốn là tìm chính xác những từ mình nhập vào, chứ không phải tìm gần đúng từ nhập vào. Ở file đính kèm dưới đây, Ô B9 khi E gõ chữ thiên, nó lại list ra 2 từ có chữ thiện (khác nhau dấu nặng) - như vậy là nó đang tìm gần đúng.

Bác xem hình và file:

111.jpg

File đính kèm của E đây ạ: (vẫn file cũ, em sửa lại 2 câu lệnh của Bác phía trên).

E nhờ Bác xem thêm hộ E chút xíu..!
 

File đính kèm

  • Copy of xin huong dan chi cach tạo listbox.xlsm
    29.9 KB · Đọc: 46
Lần chỉnh sửa cuối:
Vâng, sorry Bác E cũng hơi dài dòng. Ý em muốn là tìm chính xác những từ mình nhập vào, chứ không phải tìm gần đúng từ nhập vào. Ở file đính kèm dưới đây, Ô B9 khi E gõ chữ thiên, nó lại list ra 2 từ có chữ thiện (khác nhau dấu nặng) - như vậy là nó đang tìm gần đúng.

Bác xem hình và file:

View attachment 104777

File đính kèm của E đây ạ: (vẫn file cũ, em sửa lại 2 câu lệnh của Bác phía trên).

E nhờ Bác xem thêm hộ E chút xíu..!


Tìm gần đúng để thấy rằng

Khi bạn gõ chữ thiên nó sẽ liệt kê hết các cái gần sát vào chọn

Ví dụ có 5 chữ

Trầm lặng
Trầm my
Trầm Ngâm

-----------> khi ta gõ chữ "Trầm" thì nó phải liệt kê cho chúng ta sẽ chọn

dĩ nhiêm nếu chúng ta gõ chính xác chữ "Trầm my" ==> nó chỉ liệt kê chữ này mà thôi

VẬY mới gọi là thông minh chứ sao, gõ ký tự nào nó sẽ liệt kê các item chứa ký tự đó có để ta chọn lựa nhanh chóng, chứ nó lại hiện đúng thì cần thì phải chọn nữa

Vậy ý bạn muốn chính xác là sao

bạn gõ chữ "thiên" ==> chỉ cần gõ chữ thi ==> "thiện" đã hiện ra rùi - sau đó không tìm thấy chữ "thiện" nên 2 dòng có chữ thiện vẫn hiện ra ,
thế thôi


tôi vẫn chưa hiểu ý bạn muốn gì,

NÊU chính xác 100% thì sao không dùng VALIDATION cho xong?????????????
 
Vâng, cám ơn Bác để em thử thêm... thực ra cách nghĩ của E là muốn tìm kiếm theo kiểu danh bạ điện thoại thôi. Validation thì không đáp ứng được.

Ôi! lại phát sinh vấn đề khi thử rồi, Bác ngó hộ E cái file E gửi kèm. Càng gõ ở B9+B11 thì ô list box lại càng nhỏ lại là sao ấy Bác nhỉ..?

https://www.dropbox.com/s/ecyw5shxhek9ytp/Gia xe.xlsm
 
Vâng, cám ơn Bác để em thử thêm... thực ra cách nghĩ của E là muốn tìm kiếm theo kiểu danh bạ điện thoại thôi. Validation thì không đáp ứng được.

Ôi! lại phát sinh vấn đề khi thử rồi, Bác ngó hộ E cái file E gửi kèm. Càng gõ ở B9+B11 thì ô list box lại càng nhỏ lại là sao ấy Bác nhỉ..?

https://www.dropbox.com/s/ecyw5shxhek9ytp/Gia xe.xlsm


đổi lại SUB Sub Loc() như sau
PHP:
Sub Loc()
    Dim kq(), i, j, sT As String
    
    '''sT = "*" & Trim(UCase(Sheet1.TextBox1.Value)) & "*"
    sT = Trim(UCase(Sheet1.TextBox1.Value)) & "*"
    For i = 1 To UBound(dl)
       If dl(i, 1) <> "" Then
          If UCase(Trim(dl(i, 1))) Like sT Then
             j = j + 1
             ReDim Preserve kq(1 To j)
             kq(j) = dl(i, 1)
          End If
       End If
    Next
    If j Then
        With Sheet1.ListBox1
            .List = kq
            .Width = ActiveCell.Width
            .Height = 250
        End With
    End If
End Sub

tôi nghĩ là khi gõ nên gõ "từ đầu" nên đã đổi thành
sT = Trim(UCase(Sheet1.TextBox1.Value)) & "*"

như thế bạn chỉ cần gõ BMV sẽ liệt kê các tên bắt đầu BMV, tương tự gõ Daew là hiện các tên Daewoo... chẳng hạn..
 
đổi lại SUB Sub Loc() như sau
PHP:
Sub Loc()
    Dim kq(), i, j, sT As String
    
    '''sT = "*" & Trim(UCase(Sheet1.TextBox1.Value)) & "*"
    sT = Trim(UCase(Sheet1.TextBox1.Value)) & "*"
    For i = 1 To UBound(dl)
       If dl(i, 1) <> "" Then
          If UCase(Trim(dl(i, 1))) Like sT Then
             j = j + 1
             ReDim Preserve kq(1 To j)
             kq(j) = dl(i, 1)
          End If
       End If
    Next
    If j Then
        With Sheet1.ListBox1
            .List = kq
            .Width = ActiveCell.Width
            .Height = 250
        End With
    End If
End Sub

tôi nghĩ là khi gõ nên gõ "từ đầu" nên đã đổi thành
sT = Trim(UCase(Sheet1.TextBox1.Value)) & "*"

như thế bạn chỉ cần gõ BMV sẽ liệt kê các tên bắt đầu BMV, tương tự gõ Daew là hiện các tên Daewoo... chẳng hạn..

Vâng, tên xe thì thế nhưng tên phụ tùng thì quá nhiều, chẳng thể nhớ hết được. VD như khi tìm tên trong danh bạ điện thoại cũng vậy, có hàng nghìn tên nhưng khi cần tìm mình không nhớ chính xác 1 ai và chỉ nhớ mang máng là làm ở Khách sạn và khi đặt tên đã ghi tên tắt là KS rồi. Lúc đó chỉ cần gõ KS và tìm là ok.

Trường hợp như Bác E sợ lại quay về tìm như ban đầu ạ. Nghĩa là kiểu tìm kiếm giống như validation ấy ạ.. E xin giữ nguyên:

sT = "*" & Trim(UCase(Sheet1.TextBox1.Value)) & "*"

là rất ổn rồi ạ. Cảm ơn bác rất nhiều...!
 
Trường hợp như Bác E sợ lại quay về tìm như ban đầu ạ. Nghĩa là kiểu tìm kiếm giống như validation ấy ạ.. E xin giữ nguyên:
sT = "*" & Trim(UCase(Sheet1.TextBox1.Value)) & "*"
là rất ổn rồi ạ. Cảm ơn bác rất nhiều...!

Vậy thì bạn dùng cho phù hợp với yêu cầu của mình thui

Nhưng như thế thì là tìm gần đúng đó,
 
Vậy thì bạn dùng cho phù hợp với yêu cầu của mình thui

Nhưng như thế thì là tìm gần đúng đó,

OK, túm lại là rất ngon rồi.

Tiện đây Bác cho E hỏi thêm tý xíu nữa được không ạ..

Hiện cái file trên E nhờ bác là tại ô B9 gắn Combo tìm Loại xe, B12 gắn Combo tìm danh mục, giờ E muốn thêm Ô B2 cũng tìm loại xe và Ô B14 cũng tìm danh mục xe thì tại 2 Ô này ta làm thế nào để gán macro vào được ạ.. Bác chỉ giúp E cách làm luôn nhé để E có thể tùy biến sử dụng ở những trường hợp khác.

E cảm ơn Bác nhiều...!
 
OK, túm lại là rất ngon rồi.

Tiện đây Bác cho E hỏi thêm tý xíu nữa được không ạ..

Hiện cái file trên E nhờ bác là tại ô B9 gắn Combo tìm Loại xe, B12 gắn Combo tìm danh mục, giờ E muốn thêm Ô B2 cũng tìm loại xe và Ô B14 cũng tìm danh mục xe thì tại 2 Ô này ta làm thế nào để gán macro vào được ạ.. Bác chỉ giúp E cách làm luôn nhé để E có thể tùy biến sử dụng ở những trường hợp khác.

E cảm ơn Bác nhiều...!

Nháy phải lên tab sheet NHAP ==> chọn view code
thêm đoạn đỏ sau vào trong Sub Worksheet_SelectionChange (hoặc copy toàn bộ sub mới thay sub cũ), như sau:
(bạn có thể làm tương tự cho các ô nào mong muốn)
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim nCol As Long
    If Target.Address = "$B$9" [COLOR="#FF0000"]Or Target.Address = "$B$2"[/COLOR] Then
        nCol = 1
        With Sheet2
            dl = .Range(.[a1], .[a65536].End(3)).Resize(, nCol).Value
        End With
        Sheet1.ListBox1.ColumnCount = nCol
        Thaydoi
    ElseIf Target.Address = "$B$12" [COLOR="#FF0000"]Or Target.Address = "$B$14"[/COLOR] Then
        nCol = 2
        With Sheet3
            dl = .Range(.[a1], .[a65536].End(3)).Resize(, nCol).Value
        End With
        Sheet1.ListBox1.ColumnCount = nCol
        Thaydoi
    Else
        If Sheet1.TextBox1.Visible Or Sheet1.ListBox1.Visible Then
            Hide
            Erase dl
        End If
    End If
End Sub
 
Web KT

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

Back
Top Bottom