Đây là control gì? Excel có nó không? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,725
Giới tính
Nam
Tôi thường thấy các trang web thường có các control như trong hình. Khi đặt trỏ vào nó tự động xổ danh sách, thường là dùng cho mục User Name.

attachment.php


Và khi gõ 1 ký tự đầu, nó sẽ lọc ra các cụm từ có ký tự đầu đó:

attachment.php


Nắm cái đuôi /// của nó mình có thể resize dễ dàng.

Vậy vui lòng cho hỏi, nó là Control gì, thuộc tính ra sao, và nó có thể có trong Excel hay không?


Cám ơn rất nhiều.
 

File đính kèm

  • Ctrol.jpg
    Ctrol.jpg
    4.3 KB · Đọc: 445
  • Control.jpg
    Control.jpg
    7.7 KB · Đọc: 446
Đây gọi là auto-complete combo hoặc autosearch combo. Nhìn chung là trong Excel không có cái này mà người ta có thể dùng Visual studiđê để thiết kế thêm tính năng đó thôi.
 
Đây gọi là auto-complete combo hoặc autosearch combo. Nhìn chung là trong Excel không có cái này mà người ta có thể dùng Visual studiđê để thiết kế thêm tính năng đó thôi.

Mình có thể cài đặt cho Excel như các control khác được không, giống như DTPicker chẳng hạn?
 
Đáng tiếc là có thể bạn sẽ phải mua hoặc không thì tự viết một OCX bằng VB hoặc C sử dụng VS6. Cái này ngày xưa mình cũng từng viết rồi, hiện tại trên mạng có nhiều lắm:
http://www.supreme-web-design.org/AutoComplete/AutoComplete-screen-shot.htm

Một ví dụ modifê bằng VB
http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=45914&lngWId=1
đây nữa này
http://www.vbforums.com/showthread.php?443461-Autocomplete-DB-combo.ocx-UPDATED&
Cái này cũng tốt
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?lngWId=10&txtCodeId=2934

Trang này có tất cả những gì bạn cần đối với một điều khiển OCX dạng autocomplete
http://www.planet-source-code.com/v....asp?lngWId=1&txtCriteria=auto+complete+combo

Khi đã là OCX, bạn chỉ cần đưa vào C:\windows\system32 hoặc dùng regsvr là được
 
Lần chỉnh sửa cuối:
hi anh Paul, lâu lắm mới thấy anh xuất hiện,

Em có từng suy nghĩ về cái này, nhưng không phải trên form mà là trên bảng tính.
Em nghĩ trên form thì cái này có thể thực hiện được, vụ scales kích thước của cái dropdown-list này thì em không tự tin vì chưa làm, nhưng em nghĩ không phải là không làm được.

Vấn đề là làm sao cho nó gắn kèm với môt ô hoặc một nhóm ô trên bảng tính thì sao?
Cũng có một số bài viết trên Giaiphapexcel này nhưng em chưa thấy thỏa mãn lắm. và em cũng google nhưng chưa có kết quả hơn gì.
 
Trước đây tớ có làm cái như thế - đại loại là thế này -cho 1 cái float combobox -
Khi người dùng gõ thì có 1 textbox hiển thị và chiếm chỗ của ô để kích hoạt chế độ autocomplete với combobox. Có điểm đau khổ là trông nó không được ăn nhập lắm với excel và đặc biệt là nó chạy chậm vì thế sau này tớ bỏ ý tưởng đó.
Tuy nhiên, nếu mọi người quan tâm, có thể ta nghiên cứu lại để xem có cách nào ổn thỏa không.
 
Tôi thường thấy các trang web thường có các control như trong hình. Khi đặt trỏ vào nó tự động xổ danh sách, thường là dùng cho mục User Name.
Và khi gõ 1 ký tự đầu, nó sẽ lọc ra các cụm từ có ký tự đầu đó:

attachment.php


Vậy vui lòng cho hỏi, nó là Control gì, thuộc tính ra sao, và nó có thể có trong Excel hay không?

Để giải quyết vấn đề này thì quá đơn giản, sử dụng ngay Combobox của Form2.0 tích hợp trên Excel.
Ta viết code cho combobox như sau:
PHP:
Private Sub ComboBox1_Change()
Dim i%
If Len(ComboBox1.Text) > 0 Then
For i = 0 To ComboBox1.ListCount - 1
If Mid(ComboBox1.List(i), 1, Len(ComboBox1.Text)) = ComboBox1.Text Then
ComboBox1.ListIndex = i: Exit For
End If
Next
SendKeys "%{Down}"
End If
End Sub

Private Sub UserForm_Initialize()
Dim i%
For i = 1 To 10000
ComboBox1.AddItem i
Next
End Sub
Combobox.jpg
 

File đính kèm

Lần chỉnh sửa cuối:
Để chứng minh cho chủ topic cũng như mọi người đã tham gia trả lời về sự kết hợp lọc Item theo điều kiện của Combobox hiển thị lên Listbox. Đoạn code dưới đây là sự kết hợp hài hoà và tài tình của 2 control trên, tuy nhiên cấp độ bài viết vẫn ở mức độ sơ sài, bạn nào có thời gian thì hãy chỉnh sửa thêm cho hợp lý.

ListAndCombo.PNG


PHP:
Dim t%
Private Sub Cmd1_Click()
Application.Quit
End Sub

Private Sub ComboBox1_Change()
On Error Resume Next
Dim i%
If ComboBox1.Text = "" Then ListBox1.Visible = Flase Else ListBox1.Visible = True
If ListBox1.ListCount > 0 And t = 0 Then
While ListBox1.ListCount > 0
ListBox1.RemoveItem (0)
Wend
End If
With ComboBox1
If .ListCount > 0 Then
For i = 0 To .ListCount - 1
If Mid(.List(i), 1, Len(.Text)) = .Text Then ListBox1.AddItem .List(i)
Next
End If
End With
t = 0
End Sub
Private Sub ComboBox1_Click()
ListBox1.Visible = False
End Sub

Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyTab Then ListBox1.Visible = False
If KeyCode = Chr(13) Then ListBox1.Visible = False
End Sub

Private Sub ListBox1_Click()
t = 1
ComboBox1.Text = ListBox1.Text
ListBox1.Visible = False
End Sub

Private Sub UserForm_Initialize()
Dim i%
t = 0
For i = 1 To 100
ComboBox1.AddItem Rnd * i
Next
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Để chứng minh cho chủ topic cũng như mọi người đã tham gia trả lời về sự kết hợp lọc Item theo điều kiện của Combobox hiển thị lên Listbox. Đoạn code dưới đây là sự kết hợp hài hoà và tài tình của 2 control trên, tuy nhiên cấp độ bài viết vẫn ở mức độ sơ sài, bạn nào có thời gian thì hãy chỉnh sửa thêm cho hợp lý.

View attachment 89102


PHP:
Dim t%
Private Sub Cmd1_Click()
Application.Quit
End Sub

Private Sub ComboBox1_Change()
On Error Resume Next
Dim i%
If ComboBox1.Text = "" Then ListBox1.Visible = Flase Else ListBox1.Visible = True
If ListBox1.ListCount > 0 And t = 0 Then
While ListBox1.ListCount > 0
ListBox1.RemoveItem (0)
Wend
End If
With ComboBox1
If .ListCount > 0 Then
For i = 0 To .ListCount - 1
If Mid(.List(i), 1, Len(.Text)) = .Text Then ListBox1.AddItem .List(i)
Next
End If
End With
t = 0
End Sub
Private Sub ComboBox1_Click()
ListBox1.Visible = False
End Sub

Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyTab Then ListBox1.Visible = False
If KeyCode = Chr(13) Then ListBox1.Visible = False
End Sub

Private Sub ListBox1_Click()
t = 1
ComboBox1.Text = ListBox1.Text
ListBox1.Visible = False
End Sub

Private Sub UserForm_Initialize()
Dim i%
t = 0
For i = 1 To 100
ComboBox1.AddItem Rnd * i
Next
End Sub

Đó là bạn mới thử về số, Bạn thử làm với chuỗi xem sao?
 
Sau khi thử nhiều cách để cho nó na ná giống cái AutoComplete Combo, tôi rút ra được rằng mình có thể làm trên combobox bình thường. Tuy nhiên, có 2 trường hợp:

Trường hợp 1, nếu dùng thuộc tính MatchEntry = fmMatchEntryComplete thì nó giống với cái "Web Search" hơn, tuy nhiên sẽ bị lỗi font nếu có dấu tiếng Việt (đây là 1 trong những lỗi khi gõ: không gõ được chữ LỮ nếu trước đó có chữ LƯU chẳng hạn). Nếu ta sử dụng cho nó, tốt nhất là dữ liệu không có dấu tiếng Việt.

Trường hợp 2, nếu dùng thuộc tính MatchEntry = fmMatchEntryNone, ta có thể sử dụng rộng rãi hơn, không cần phải tính toán SelLength, SelStart... và dễ dàng cho ta gõ vào tiếng Việt hơn.

Sau khi cân nhắc, tôi chọn trường hợp 2 là phương án tối ưu.

Các bạn xem file và bổ sung những gì thiếu sót cho mình nhé.
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn hãy xem kỹ đoạn code mình viết, code trên là xử lý chuỗi đấy chứ, không liên quan gì đến số cả; số chỉ là ví dụ cho nhanh thôi (nhưng số được coi như chuỗi)

Nói chung, nó cũng là một giải pháp, tuy nhiên nó không thể search để lọc như hàm Filter2DArray được, nó có thể lọc bất cứ cụm từ nào chứa trong chuỗi.
 
Lần chỉnh sửa cuối:
Cám ơn bạn file bạn tạo mình thấy hay lắm,mình xin mượn file của bạn sữa đôi chút và nhờ bạn tạo thêm vài cái hộp con,mình có viết rỏ nội dung yêu cầu trong file đính kèm
 

File đính kèm

Cám ơn bạn file bạn tạo mình thấy hay lắm,mình xin mượn file của bạn sữa đôi chút và nhờ bạn tạo thêm vài cái hộp con,mình có viết rỏ nội dung yêu cầu trong file đính kèm

Để có 4 danh sách hàng, tôi làm 4 sheet, mỗi sheet là một danh sách với cấu trúc giống nhau. Khi chạy form tôi tạo tên các danh sách này cho một combobox danh sách, và mặc định chạy Danh Sách 1:

PHP:
Private Sub UserForm_Initialize()
    Dim i As Byte
    With ComboBox1
        For i = 1 To 4
            .AddItem "Danh Sách " & i
        Next
        .SetFocus
        .ListIndex = 0
    End With
    isDrop = False
End Sub

Khi đã gán tên cho ComboBox này, thì lập tức nó sẽ truyền List cho ComboBox để lựa chọn tên hàng như sau:

PHP:
Private Sub ComboBox1_Change()
    On Error GoTo LOI
    Dim i As Byte
    i = ComboBox1.ListIndex + 1
    ComboBox2.Clear
        ComboBox2 = ""
            With Sheets("DanhSach" & i)
                sArray = Range(.[B2], .[B65536].End(xlUp)).Resize(, 5).Value
            End With
        ComboBox2.List = sArray
    ComboBox2.Locked = False
    Exit Sub
LOI:
    ComboBox2.Locked = True
    ComboBox2.Clear
    ComboBox2 = ""
End Sub

Và khi được nạp list, khi lựa chọn tên hàng, các gí trị sĩ lẻ gì đó sẽ hiện lên trên các TextBox:

PHP:
Private Sub ComboBox2_Change()
    On Error GoTo LOI
    With ComboBox2
        If .ListRows <> 10 Then .ListRows = 10
        If isDrop = False Or Len(.Text) = 1 Then .DropDown
        For i = 1 To 4
            Controls("TextBox" & i).Text = .List(, i)
        Next
    End With
    isDrop = True
    Exit Sub
LOI:
    For i = 1 To 4
        Controls("TextBox" & i).Text = ""
    Next
End Sub

Bạn xem file và điều chỉnh theo file cụ thể của bạn nhé!
 

File đính kèm

Tuyệt quá bạn ơi ::: ,mình rất cám ơn và khâm phục bạn lắm,mình xin hỏi thêm:ở hộp chọn danh sách thuốc bạn có thể gộp 4 danh sách thuốc thành 1 thôi ,ý của mình là thay vì phải chọn danh sách thuốc trước rồi mới gỏ vào hộp chọn tên thuốc thì mình gỏ trực tiếp hộp chọn tên thuốc luôn thì nó tự động dò tìm trong 4 danh sách rồi trích xuất liệt kê vào list xổ ra của hộp chọn tên thuốc,mình ví dụ nhé:ở 4 danh sách có 4 mặt hàng ampi khác nhau,khi mình gỏ chử a thì list xổ ra sẻ có đủ đồng loạt tất cả các mặt hàng gồm: ampi an,ampi ao của danh sách 1, ampi Việt nam của danh sách 2, ampi Thái của danh sách 3, ampi Mỹ của danh sách 4... Mụch đích là bớt thao tác và thời gian dò tìm, với lại danh sách thực tế của mình rất nhiều hơn 2000 mặt hàng mình không nhớ hết các mặt hàng nằm ở danh sách nào.
Câu hỏi thứ 2 : thực tế 4 danh sách trên lại không có trên cùng một file mà ở riêng trên 4 file và 4 file này lại nằm ở máy chủ, vậy bạn có cách nào liên kết từ hộp dò tìm đến những file đó không, lý do là giá luôn cập nhật hằng ngày từ máy chủ, mình chỉ có thể share 4 file đó để mở xem ở máy con và phải copy sheet danh sách giá ở từng file rồi mới dán vào file bạn tạo, như vậy cứ mổi lần muốn cập nhật giá là phải thực hiện một giai đoạn dài dòng và chưa kể lở copy sai sót hoặc không hay biết có giá vừa mới thay đổi để copy cập nhật thì củng khổ.
Mình chờ tin vui từ bạn đấy
 

File đính kèm

Tuyệt quá bạn ơi ::: ,mình rất cám ơn và khâm phục bạn lắm,mình xin hỏi thêm:ở hộp chọn danh sách thuốc bạn có thể gộp 4 danh sách thuốc thành 1 thôi ,ý của mình là thay vì phải chọn danh sách thuốc trước rồi mới gỏ vào hộp chọn tên thuốc thì mình gỏ trực tiếp hộp chọn tên thuốc luôn thì nó tự động dò tìm trong 4 danh sách rồi trích xuất liệt kê vào list xổ ra của hộp chọn tên thuốc,mình ví dụ nhé:ở 4 danh sách có 4 mặt hàng ampi khác nhau,khi mình gỏ chử a thì list xổ ra sẻ có đủ đồng loạt tất cả các mặt hàng gồm: ampi an,ampi ao của danh sách 1, ampi Việt nam của danh sách 2, ampi Thái của danh sách 3, ampi Mỹ của danh sách 4... Mụch đích là bớt thao tác và thời gian dò tìm, với lại danh sách thực tế của mình rất nhiều hơn 2000 mặt hàng mình không nhớ hết các mặt hàng nằm ở danh sách nào.
Câu hỏi thứ 2 : thực tế 4 danh sách trên lại không có trên cùng một file mà ở riêng trên 4 file và 4 file này lại nằm ở máy chủ, vậy bạn có cách nào liên kết từ hộp dò tìm đến những file đó không, lý do là giá luôn cập nhật hằng ngày từ máy chủ, mình chỉ có thể share 4 file đó để mở xem ở máy con và phải copy sheet danh sách giá ở từng file rồi mới dán vào file bạn tạo, như vậy cứ mổi lần muốn cập nhật giá là phải thực hiện một giai đoạn dài dòng và chưa kể lở copy sai sót hoặc không hay biết có giá vừa mới thay đổi để copy cập nhật thì củng khổ.
Mình chờ tin vui từ bạn đấy

Vì không có các file thật cũng như nguyên tắc kết nối, đường dẫn của file bạn đến các file khác như thế nào nên tôi không thể thực hiện cho bạn ở câu hỏi thứ 2.

Tuy nhiên tôi có giải pháp cho bạn ở file này là: Copy các danh sách ở các sheet về 1 sheet ở danh sách tổng hợp, sắp xếp lại theo thứ tự tên thuốc, gán mảng này vào cobobox.

PHP:
Private Sub UserForm_Initialize()
      Dim i As Long, sArray
      Sheets("DanhSachTongHop").Cells.Clear
      For i = 1 To 4
            With Sheets("DanhSach" & i)
                  sArray = Range(.[B2], .[B65536].End(xlUp)).Resize(, 5).Value
            End With
            Sheets("DanhSachTongHop").Range("A65536").End(xlUp).Offset(1) _
            .Resize(UBound(sArray, 1), UBound(sArray, 2)).Value = sArray
      Next
      With Sheets("DanhSachTongHop")
            With Range(.[A2], .[A65536].End(xlUp)).Resize(, 5)
                  .Sort Sheets("DanhSachTongHop").[A2], xlAscending, , , , , , xlNo
                  GenArray = .Value
            End With
            .Cells.Clear
      End With
      ComboBox2.List = GenArray
      isDrop = False
End Sub

Tùy vào trường hợp mà ứng biến thôi. Nếu không thể kết nối, bạn buộc phải copy từ máy chủ để làm việc với file của mình.
 

File đính kèm

Vì không có các file thật cũng như nguyên tắc kết nối, đường dẫn của file bạn đến các file khác như thế nào nên tôi không thể thực hiện cho bạn ở câu hỏi thứ 2.

Tuy nhiên tôi có giải pháp cho bạn ở file này là: Copy các danh sách ở các sheet về 1 sheet ở danh sách tổng hợp, sắp xếp lại theo thứ tự tên thuốc, gán mảng này vào cobobox.

PHP:
Private Sub UserForm_Initialize()
      Dim i As Long, sArray
      Sheets("DanhSachTongHop").Cells.Clear
      For i = 1 To 4
            With Sheets("DanhSach" & i)
                  sArray = Range(.[B2], .[B65536].End(xlUp)).Resize(, 5).Value
            End With
            Sheets("DanhSachTongHop").Range("A65536").End(xlUp).Offset(1) _
            .Resize(UBound(sArray, 1), UBound(sArray, 2)).Value = sArray
      Next
      With Sheets("DanhSachTongHop")
            With Range(.[A2], .[A65536].End(xlUp)).Resize(, 5)
                  .Sort Sheets("DanhSachTongHop").[A2], xlAscending, , , , , , xlNo
                  GenArray = .Value
            End With
            .Cells.Clear
      End With
      ComboBox2.List = GenArray
      isDrop = False
End Sub

Tùy vào trường hợp mà ứng biến thôi. Nếu không thể kết nối, bạn buộc phải copy từ máy chủ để làm việc với file của mình.


Bạn giỏi thật 4 danh sách bây giờ đã nằm gọn trong list rồi cám ơn bạn nhé, mình còn thắc mắc theo hướng dẫn của bạn vì sao mình copy danh sách thuốc vào sheet DanhSachTongHop (vào file đính kèm KeyUp2_THU_NGHIEM_2.xls ) xong qua sheet Danhsach1 bấm nút show form nó không ra thêm phần danh sách mới copy vào, quay về sheet DanhsachTongHop danh sách copy vào lúc nảy tự động xóa mất tiêu rồi, còn nếu copy vào 1 trong 4 sheet danhsach 1-4 thì danh sách thuốc copy thêm, được thêm vào như vậy mình có làm gì sai không bạn ? Còn phần mảng code bạn bảo mình gán thêm vào combobox gì đó mình không rành VBA mình không biết làm.
Phần câu hỏi 2 mình đành bó tay vì không được can thiệp trực tiếp máy chủ, nhưng mình sẻ dùng record Macro để ghi lại thao tác chép thủ công để xử dụng tiếp cho lần copy sau tuy nhiên cách này sẻ gặp rắc rối trong trường hợp danh sách thuốc thêm bớt mặt hàng, macro không được chỉ định chép ở dòng kế cuối danh sách của sheet trứơc mà chép chồng lên 1 trong những dòng cuối cua danh sách trước như vậy dử liệu không còn đầy đủ chính xác nữa,mình chỉ mới suy luận thôi chưa record thử bạn trợ giúp mình trường hợp này luôn nhé.
 
Bạn giỏi thật 4 danh sách bây giờ đã nằm gọn trong list rồi cám ơn bạn nhé, mình còn thắc mắc theo hướng dẫn của bạn vì sao mình copy danh sách thuốc vào sheet DanhSachTongHop (vào file đính kèm KeyUp2_THU_NGHIEM_2.xls ) xong qua sheet Danhsach1 bấm nút show form nó không ra thêm phần danh sách mới copy vào, quay về sheet DanhsachTongHop danh sách copy vào lúc nảy tự động xóa mất tiêu rồi, còn nếu copy vào 1 trong 4 sheet danhsach 1-4 thì danh sách thuốc copy thêm, được thêm vào như vậy mình có làm gì sai không bạn ? Còn phần mảng code bạn bảo mình gán thêm vào combobox gì đó mình không rành VBA mình không biết làm.
Phần câu hỏi 2 mình đành bó tay vì không được can thiệp trực tiếp máy chủ, nhưng mình sẻ dùng record Macro để ghi lại thao tác chép thủ công để xử dụng tiếp cho lần copy sau tuy nhiên cách này sẻ gặp rắc rối trong trường hợp danh sách thuốc thêm bớt mặt hàng, macro không được chỉ định chép ở dòng kế cuối danh sách của sheet trứơc mà chép chồng lên 1 trong những dòng cuối cua danh sách trước như vậy dử liệu không còn đầy đủ chính xác nữa,mình chỉ mới suy luận thôi chưa record thử bạn trợ giúp mình trường hợp này luôn nhé.

DanhSachTongHop là một sheet tạm để copy dữ liệu từ các sheet DanhSachX, sau khi đưa tất cả danh sách về một đầu mối rồi truyền danh sách tổng đó cho list của ComboBox thì sheet này sẽ bị xóa dữ liệu ngay sau đó nên bạn sẽ không thấy gì được.

Vì bạn có 4 danh sách từ 4 file khác nhau nên bạn cứ copy lên 4 sheet tương ứng với 4 file đó, đừng đụng gì tới sheet DanhSachTongHop cả, nó chẳng liên quan với nhau, chép vào sẽ bị xóa cũng vậy à.

Việc dùng macro cho việc sao chép này, tôi không nghĩ là khó, tuy nhiên cấu trúc của mỗi file có giống nhau không? Bạn có thể copy 1 sheet có cấu trúc thật và post lên đây hay không? Tên các file thật đó là gì? Ít nhiều gì tôi cũng nghiên cứu làm được cho bạn.
 
DanhSachTongHop là một sheet tạm để copy dữ liệu từ các sheet DanhSachX, sau khi đưa tất cả danh sách về một đầu mối rồi truyền danh sách tổng đó cho list của ComboBox thì sheet này sẽ bị xóa dữ liệu ngay sau đó nên bạn sẽ không thấy gì được.

Vì bạn có 4 danh sách từ 4 file khác nhau nên bạn cứ copy lên 4 sheet tương ứng với 4 file đó, đừng đụng gì tới sheet DanhSachTongHop cả, nó chẳng liên quan với nhau, chép vào sẽ bị xóa cũng vậy à.

Việc dùng macro cho việc sao chép này, tôi không nghĩ là khó, tuy nhiên cấu trúc của mỗi file có giống nhau không? Bạn có thể copy 1 sheet có cấu trúc thật và post lên đây hay không? Tên các file thật đó là gì? Ít nhiều gì tôi cũng nghiên cứu làm được cho bạn.

Mình gởi file lên bạn xem giúp nhé cám ơn trước nhe
 

File đính kèm

DanhSachTongHop là một sheet tạm để copy dữ liệu từ các sheet DanhSachX, sau khi đưa tất cả danh sách về một đầu mối rồi truyền danh sách tổng đó cho list của ComboBox thì sheet này sẽ bị xóa dữ liệu ngay sau đó nên bạn sẽ không thấy gì được.

Vì bạn có 4 danh sách từ 4 file khác nhau nên bạn cứ copy lên 4 sheet tương ứng với 4 file đó, đừng đụng gì tới sheet DanhSachTongHop cả, nó chẳng liên quan với nhau, chép vào sẽ bị xóa cũng vậy à.

Việc dùng macro cho việc sao chép này, tôi không nghĩ là khó, tuy nhiên cấu trúc của mỗi file có giống nhau không? Bạn có thể copy 1 sheet có cấu trúc thật và post lên đây hay không? Tên các file thật đó là gì? Ít nhiều gì tôi cũng nghiên cứu làm được cho bạn.

Bạn Hoàng Trọng Nghĩa ơi mình đã post file thật lên rồi cấu trúc giống nhau cả bạn giúp mình nhé
 
Mình gởi file lên bạn xem giúp nhé cám ơn trước nhe

Mỗi bảng (mỗi file) mỗi kiểu sao mà copy cho bạn được? Bảng thì có tiêu đề, bảng lại không, bảng có tên thuốc, có giá, bảng lại không có tên thuốc lại có giá, bảng có STT, bảng lại không, ... mà mỗi loại thuốc không có mã thuốc hay sao?

Nếu không đồng nhất kết cấu bảng thì làm sao copy cho đầy đủ cho bạn được đây?

Tôi có một đề nghị:

1) Phải có tiêu đề cho mỗi file

2) Cấu trúc phải giống nhau

3) Tên sheet cần kết nối phải giống nhau

4) Chỉ cần tên gọi (tên thuốc), quy cách, giá gốc, các thứ còn lại tự form sẽ tính. Trong file của bạn công thức fill lê thê hình như đến 65 ngàn dòng luôn thì phải, đã vậy còn dùng màu nền định dạng cho hết các dòng, cột luôn thì dung lượng file quá lớn, tính toán rất ì ạch.
 
Lần chỉnh sửa cuối:


Mình cám ơn bạn nhiều nhiều..., bạn Hoàng Trọng Nghĩa ơi file KeyUp2_THU_NGHIEM_3 mình dùng thử đúng là quá tuyệt nhưng sao mình copy riêng file KeyUp2_THU_NGHIEM_3.xls của bạn vào thư mục chứa 4 file của mình và dù đã kiểm tra tiêu đề cột và tên sheet ở 4 file, khi bấm show form nó báo không kết nối mình không biết lổi của mình ở đâu nữa bạn xem giúp nhé, à rồi khi cần thay đổi % giá mình vào chổ nào để sửa vậy bạn ?. Mình nhờ bạn thêm một việc này, bạn có thể tạo bảng thông báo những mặt hàng sắp hết hạn sử dụng được không ? nội dung yêu cầu cụ thể mình có ghi gỏ trong file BLM ở sheet báo hạng sử dụng.
 

File đính kèm

Lần chỉnh sửa cuối:
Mình cám ơn bạn nhiều nhiều..., bạn Hoàng Trọng Nghĩa ơi file KeyUp2_THU_NGHIEM_3 mình dùng thử đúng là quá tuyệt nhưng sao mình copy riêng file KeyUp2_THU_NGHIEM_3.xls của bạn vào thư mục chứa 4 file của mình và dù đã kiểm tra tiêu đề cột và tên sheet ở 4 file, khi bấm show form nó báo không kết nối mình không biết lổi của mình ở đâu nữa bạn xem giúp nhé, à rồi khi cần thay đổi % giá mình vào chổ nào để sửa vậy bạn ?. Mình nhờ bạn thêm một việc này, bạn có thể tạo bảng thông báo những mặt hàng sắp hết hạn sử dụng được không ? nội dung yêu cầu cụ thể mình có ghi gỏ trong file BLM ở sheet báo hạng sử dụng.

Bạn kiểm tra đường dẫn, các đường dẫn của mỗi file như thế nào, ổ đĩa nào, thì bạn phải thay đổi ở các AppPath1 đến AppPath4.

Thay vì:

AppPath1 = ThisWorkbook.Path
AppPath2 = ThisWorkbook.Path & "\Level1"
AppPath3 = ThisWorkbook.Path & "\Level2"
AppPath4 = ThisWorkbook.Path & "\Level3"

Thì theo thực tế bạn có thể sửa lại:

AppPath1 = "D:\NGHIA\Nam 2012\Thang 11"
AppPath2 = "C:\Documents and Settings\Admin\Desktop\FileThu"
AppPath3 = "D:\Downloads\Documents"
AppPath4 = "F:\HOANG_TRONG_NGHIA"
 
Lần chỉnh sửa cuối:
Bạn kiểm tra đường dẫn, các đường dẫn của mỗi file như thế nào, ổ đĩa nào, thì bạn phải thay đổi ở các AppPath1 đến AppPath4.

Thay vì:

AppPath1 = ThisWorkbook.Path
AppPath2 = ThisWorkbook.Path & "\Level1"
AppPath3 = ThisWorkbook.Path & "\Level2"
AppPath4 = ThisWorkbook.Path & "\Level3"

Thì theo thực tế bạn có thể sửa lại:

AppPath1 = "D:\NGHIA\Nam 2012\Thang 11"
AppPath2 = "C:\Documents and Settings\Admin\Desktop\FileThu"
AppPath3 = "D:\Downloads\Documents"
AppPath4 = "F:\HOANG_TRONG_NGHIA"


Bạn chỉ dẫn rất chính xác mình làm được rồi, không có bạn mình như bị lạc giữa rừng âm ưu vậy, cám ơn bạn nhé. Khi cần thay đổi giá sỉ 4% 5% và giá lẻ thì mình vào đâu sửa vậy bạn ?
 
Lần chỉnh sửa cuối:
Bạn chỉ dẫn rất chính xác mình làm được rồi, không có bạn mình như bị lạc giữa rừng âm ưu vậy, cám ơn bạn nhé. Khi cần thay đổi giá sỉ 4% 5% và giá lẻ thì mình vào đâu sửa vậy bạn ?

Mã:
Private Sub ComboBox1_Change()
      On Error GoTo LOI
      Dim b As Byte, dongia As Long, Ham
      Set Ham = Application.WorksheetFunction
      With ComboBox1
            If isDrop = False Or Len(.Text) = 1 Then .DropDown
            [COLOR=#ff0000][B]dongia = .List(, 1)[/B][/COLOR]
[COLOR=#0000ff][B]            TextBox1 = dongia
            TextBox2 = Ham.Round(dongia [/B][/COLOR][COLOR=#ff0000][B]* 1.04[/B][/COLOR][COLOR=#0000ff][B], -2)
            TextBox3 = Ham.Round(dongia [/B][/COLOR][COLOR=#ff0000][B]* 1.05[/B][/COLOR][COLOR=#0000ff][B], -2)
            TextBox4 = Ham.Round(dongia [/B][/COLOR][COLOR=#ff0000][B]* 1.1[/B][/COLOR][COLOR=#0000ff][B], -2)[/B][/COLOR]
      End With
      isDrop = True
      Exit Sub
LOI:
      For b = 1 To 4
            Controls("TextBox" & b).Text = ""
      Next
End Sub


Đó, bạn tự biết mà sửa vào nhé!
 
Mã:
Private Sub ComboBox1_Change()
      On Error GoTo LOI
      Dim b As Byte, dongia As Long, Ham
      Set Ham = Application.WorksheetFunction
      With ComboBox1
            If isDrop = False Or Len(.Text) = 1 Then .DropDown
            [COLOR=#ff0000][B]dongia = .List(, 1)[/B][/COLOR]
[COLOR=#0000ff][B]            TextBox1 = dongia
            TextBox2 = Ham.Round(dongia [/B][/COLOR][COLOR=#ff0000][B]* 1.04[/B][/COLOR][COLOR=#0000ff][B], -2)
            TextBox3 = Ham.Round(dongia [/B][/COLOR][COLOR=#ff0000][B]* 1.05[/B][/COLOR][COLOR=#0000ff][B], -2)
            TextBox4 = Ham.Round(dongia [/B][/COLOR][COLOR=#ff0000][B]* 1.1[/B][/COLOR][COLOR=#0000ff][B], -2)[/B][/COLOR]
      End With
      isDrop = True
      Exit Sub
LOI:
      For b = 1 To 4
            Controls("TextBox" & b).Text = ""
      Next
End Sub


Đó, bạn tự biết mà sửa vào nhé!




Mình làm đươc rồi cám ơn bạn nhiều, à mình còn tạo đường dẫn để file KeyUp2_THU_NGHIEM_3 kết nối đến 4 file máy chủ đươc luôn, công nhận bạn giỏi thật mình khâm phục bạn sát đất luôn.
 
Mình làm đươc rồi cám ơn bạn nhiều, à mình còn tạo đường dẫn để file KeyUp2_THU_NGHIEM_3 kết nối đến 4 file máy chủ đươc luôn, công nhận bạn giỏi thật mình khâm phục bạn sát đất luôn.

Chẳng có gì phải "khâm phục sát đất" cả! Tất cả kiến thức tôi có được nhờ vào sự giúp đỡ, hướng dẫn của những thành viên trong diễn đàn này đấy. Bản thân mình chịu khó nghiên cứu, mày mò, chỉnh sửa ... thì sẽ có một ngày kiến thức từ "FALSE" sẽ dần dần trở thành "TRUE" mà thôi.
 
Bạn Hoàng Trọng Nghĩa mếm , Mình nhờ bạn tạo bảng thông báo những mặt hàng sắp hết hạn sử dụng bạn đã xem chưa ? giúp mình luôn nhé bạn.
 
chào anh xuanha e làm theo đoạn code của a nhung chi duoc so 1 den 10 thoi, a chi e doan code viết cho " chuỗi" đi a.
em cám ơn a
 
Sau khi thử nhiều cách để cho nó na ná giống cái AutoComplete Combo, tôi rút ra được rằng mình có thể làm trên combobox bình thường. Tuy nhiên, có 2 trường hợp:

Trường hợp 1, nếu dùng thuộc tính MatchEntry = fmMatchEntryComplete thì nó giống với cái "Web Search" hơn, tuy nhiên sẽ bị lỗi font nếu có dấu tiếng Việt (đây là 1 trong những lỗi khi gõ: không gõ được chữ LỮ nếu trước đó có chữ LƯU chẳng hạn). Nếu ta sử dụng cho nó, tốt nhất là dữ liệu không có dấu tiếng Việt.

Trường hợp 2, nếu dùng thuộc tính MatchEntry = fmMatchEntryNone, ta có thể sử dụng rộng rãi hơn, không cần phải tính toán SelLength, SelStart... và dễ dàng cho ta gõ vào tiếng Việt hơn.

Sau khi cân nhắc, tôi chọn trường hợp 2 là phương án tối ưu.

Các bạn xem file và bổ sung những gì thiếu sót cho mình nhé.

Chào anh Hoàng Trọng Nghĩa, tôi có xem qua vài mẩu combobox nhưng chỉ có mẩu của anh là phù hợp với yêu cầu sử dụng của tôi. Vậy xin anh giúp tôi:

1.Tạo 1 combobox như trong file mẩu của anh KeyUp2.rar ở trang # 10 lưu ý phải bấm nút Show Form màu xanh mới thấy combobox, đặt nó ở vị trí ô B2.

2.Khi gõ 1 hai ký tự đầu, nó sẽ lọc ra các cụm từ có 1 hai ký tự đó. Các cụm từ trong bài này chính là các họ tên.

3.Khi list combobox mở xuống, ta di chuyễn dòng chọn màu xanh đến họ tên cần chọn,trong bài này tôi ví dụ chọn tên Nguyễn Hoài Thanh, yêu cầu lúc này là tạo lệnh sao cho khi bấm tiếp phím enter là khung chọn ô của bảng tính nhãy đúng ngay vị trí ô chứa cái tên Nguyễn Hoài Thanh trong cột HỌ TÊN.

Tôi có gửi file lên minh họa yêu cầu, anh xem và giúp tôi nhé. Tôi xin cám ơn anh nhiều.
 

File đính kèm

Lần chỉnh sửa cuối:
Chào anh Hoàng Trọng Nghĩa, tôi có xem qua vài mẩu combobox nhưng chỉ có mẩu của anh là phù hợp với yêu cầu sử dụng của tôi. Vậy xin anh giúp tôi:

1.Tạo 1 combobox như trong file mẩu của anh KeyUp2.rar ở trang # 10 lưu ý phải bấm nút Show Form màu xanh mới thấy combobox, đặt nó ở vị trí ô B2.

2.Khi gõ 1 hai ký tự đầu, nó sẽ lọc ra các cụm từ có 1 hai ký tự đó. Các cụm từ trong bài này chính là các họ tên.

3.Khi list combobox mở xuống, ta di chuyễn dòng chọn màu xanh đến họ tên cần chọn,trong bài này tôi ví dụ chọn tên Nguyễn Hoài Thanh, yêu cầu lúc này là tạo lệnh sao cho khi bấm tiếp phím enter là khung chọn ô của bảng tính nhãy đúng ngay vị trí ô chứa cái tên Nguyễn Hoài Thanh trong cột HỌ TÊN.

Tôi có gửi file lên minh họa yêu cầu, anh xem và giúp tôi nhé. Tôi xin cám ơn anh nhiều.

Để tôi nói ngắn gọn yêu cầu của bạn xem có đúng không nhé.

1) Đặt 1 ComboBox (ActiveX Controls) vào trong sheet.

2) Viết các thủ tục để lọc tên cần tìm.

3) Khi chọn vào một tên nào đó, thì tại ô chứa tên sẽ được chọn vào.


Nếu đúng như trên, các yêu cầu của bạn đều có thể đáp ứng, tuy nhiên, trong một danh sách tên thì sẽ có tên họ trùng nhau, vậy cho nên khó có thể xác định chính xác là tên nào; đây cũng chính là điều tôi cho là khó cho bạn.
 
Để tôi nói ngắn gọn yêu cầu của bạn xem có đúng không nhé.

1) Đặt 1 ComboBox (ActiveX Controls) vào trong sheet.

2) Viết các thủ tục để lọc tên cần tìm.

3) Khi chọn vào một tên nào đó, thì tại ô chứa tên sẽ được chọn vào.


Nếu đúng như trên, các yêu cầu của bạn đều có thể đáp ứng, tuy nhiên, trong một danh sách tên thì sẽ có tên họ trùng nhau, vậy cho nên khó có thể xác định chính xác là tên nào; đây cũng chính là điều tôi cho là khó cho bạn.

Chào anh Hoàng Trọng Nghĩa, vâng anh tóm tắt yêu cầu trên là đúng rồi ạ, việc tên họ trùng nhau không sao đâu anh tôi sẻ chú thích cho đừng trùng nhau. Cám ơn anh nhiều nhé.
 
Chào anh Hoàng Trọng Nghĩa, vâng anh tóm tắt yêu cầu trên là đúng rồi ạ, việc tên họ trùng nhau không sao đâu anh tôi sẻ chú thích cho đừng trùng nhau. Cám ơn anh nhiều nhé.

Tôi đã làm theo yêu cầu của bạn như sau:

- Bấm nút lệnh màu xanh để hiện ComboBox tìm kiếm

- Gõ tên cần tìm, rồi chọn tên trong danh sách

- Enter để tìm vị trí tên.

Với các thủ tục sau:

Thủ tục hiện ComboBox:

Mã:
Sub HienComboBox()
      
      Dim posCell As Range
      ActiveWindow.ScrollRow = 3

      With Sheet1
      
            Set posCell = .[B2]
            sArray = Range(.[B3], .[B65536].End(xlUp)).Value
            
            With .ComboBox1
                  .Top = posCell.Top
                  .Left = posCell.Left
                  .Height = posCell.Height
                  .Width = posCell.Width
                  .Visible = True
                  .List = sArray
                  .Text = ""
                  .Activate
            End With
            
      End With
      
End Sub

Thủ tục gõ vào ComboBox để lọc tên, lọc xong chỉ việc Enter:

Mã:
Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
      On Error GoTo Loi
      
      With ComboBox1
      
            Select Case KeyCode
                  Case 8
                        If .Text = "" Then
                              .List = sArray: Exit Sub
                        End If
                  Case 13
                        If .MatchFound = True Then
                              Range(Sheet1.[B3], Sheet1.[B65536].End(xlUp)) _
                                    .Find(.Text, LookIn:=xlValues, LookAt:=xlWhole).Select
                                    .Visible = False
                              Exit Sub
                        End If
                  Case 37 To 40: Exit Sub
            End Select
            
            If .Text = "" Then GoTo Loi
                  .List = Filter2DArray(sArray, 1, "*" & .Text & "*", False)
            Exit Sub
Loi:
            .List = Array("")
            .Clear
            
      End With
      
End Sub

Toàn bộ code chỉ là vậy, thế nhưng bạn có hỏi tại sao gõ chữ Thanh mà không hiện lên các chữ liên quan có dấu, xin thưa với bạn là ở đây lọc xác định, nếu bạn muốn lọc tên có dấu thì bạn thêm dấu vào khi gõ!
 

File đính kèm

Anh Hoàng Trọng Nghĩa file anh làm vừa gọn đẹp và rất hay, cám ơn anh lắm nhe.

Anh cho tôi hỏi thêm nếu tôi có thêm 1 file danh_sach2 có định dạng thứ tự cột, có nhu cầu tìm tên hoàn toàn giống như file của anh làm, vậy ta có thể biến combobox anh vừa làm thành công cụ dùng chung cho cả 2 file được không anh ? làm được như thế ta không cần tạo thêm combobox cho file danh_sach2.
 
Anh Hoàng Trọng Nghĩa file anh làm vừa gọn đẹp và rất hay, cám ơn anh lắm nhe.

Anh cho tôi hỏi thêm nếu tôi có thêm 1 file danh_sach2 có định dạng thứ tự cột, có nhu cầu tìm tên hoàn toàn giống như file của anh làm, vậy ta có thể biến combobox anh vừa làm thành công cụ dùng chung cho cả 2 file được không anh ? làm được như thế ta không cần tạo thêm combobox cho file danh_sach2.


Hè hè, bạn này được voi đòi "2 bà Trưng" hen! Tôi có một đề nghị, sao bạn không tìm tên với công cụ có sẳn FIND hả bạn? Chỉ cần Ctrl+F và gõ vào Find What cụm từ cần tìm rồi Find Next thôi!
 
Hè hè, bạn này được voi đòi "2 bà Trưng" hen! Tôi có một đề nghị, sao bạn không tìm tên với công cụ có sẳn FIND hả bạn? Chỉ cần Ctrl+F và gõ vào Find What cụm từ cần tìm rồi Find Next thôi!
Chà chà , anh Trọng Nghĩa không những giỏi mà còn vui tính nữa. Voi thì muốn chứ “ 2 bà Trưng ” thì hỏng dám đâu, phục vụ không xong có nước mà… chết anh ạ. Công cụ có sẳn FIND tuy tiện lợi nhưng khi danh sách tên dài và tên gần giống nhau thì bấm Find Next rất là mỏi tay, nhìn danh sách muốn lồi mắt luôn, gõ sai kí tự nó tìm không ra.
 
Chà chà , anh Trọng Nghĩa không những giỏi mà còn vui tính nữa. Voi thì muốn chứ “ 2 bà Trưng ” thì hỏng dám đâu, phục vụ không xong có nước mà… chết anh ạ. Công cụ có sẳn FIND tuy tiện lợi nhưng khi danh sách tên dài và tên gần giống nhau thì bấm Find Next rất là mỏi tay, nhìn danh sách muốn lồi mắt luôn, gõ sai kí tự nó tìm không ra.

Vậy bạn có biết xài Addins không? Tôi lại có một đề nghị, không cần đặt cái combobox ở trong sheet, chỉ cần sau khi cài Addins vào thư mục Addins, rồi trong option check vào nó, thì lúc sử dụng bạn chỉ cần bấm phím tắt để chon hiện một form lên, cần tra từ nào thì tra rồi enter nó sẽ tìm đúng với mục đó. Bạn thấy như thế nào?
 
Vậy bạn có biết xài Addins không? Tôi lại có một đề nghị, không cần đặt cái combobox ở trong sheet, chỉ cần sau khi cài Addins vào thư mục Addins, rồi trong option check vào nó, thì lúc sử dụng bạn chỉ cần bấm phím tắt để chon hiện một form lên, cần tra từ nào thì tra rồi enter nó sẽ tìm đúng với mục đó. Bạn thấy như thế nào?

Addins tôi chưa xài, Anh mô tả công dụng thấy hợp lý, Anh hướng dẫn cho tôi nhé. Tôi đang xài Excel 2003.
 
Lần chỉnh sửa cuối:
Addins tôi chưa xài, Anh mô tả công dụng thấy hợp lý, Anh hướng dẫn cho tôi nhé.

Trước tiên hết tôi hướng dẫn bạn cách sử dụng file Addins:

Chép file FileAddIns.xla vào đường dẫn dưới đây:

(Với "\TRONGNGHIA\" là tên của máy tính người dùng)

Với Excel 2003:

C:\Document and Setting\TRONGNGHIA\Application Data\Microsoft\AddIns\

Trên thanh Menu, chọn Tool, chọn tiếp Add-Ins, tại đây check vào tên file "FileAddIns".

Với Excel 2007 trở về sau:

C:\Users\TRONGNGHIA\AppData\Roaming\Microsoft\AddIns\

Bấm vào nút trên cùng bên trái của dãy Ribbon, Chọn Excel Options, bấm vào nút Add-Ins, phía dưới cùng của hộp thoại này, chọn vào nút Go... và cuối cùng là check vào tên file "FileAddIns".


Chút nữa làm xong file tôi sẽ gửi lên sau và hướng dẫn sử dụng file AddIn tôi sắp gửi cho bạn.
 
Vậy bạn có biết xài Addins không? Tôi lại có một đề nghị, không cần đặt cái combobox ở trong sheet, chỉ cần sau khi cài Addins vào thư mục Addins, rồi trong option check vào nó, thì lúc sử dụng bạn chỉ cần bấm phím tắt để chon hiện một form lên, cần tra từ nào thì tra rồi enter nó sẽ tìm đúng với mục đó. Bạn thấy như thế nào?

Như bài viết trên, tôi giới thiệu cho bạn cách làm mới:

Sau khi tải file về, giải nén và chép vào thư mục Addins như tôi đã hướng dẫn ở bài trước.

Bạn không cần mở file Addins này đâu, khi mở bất kỳ file nào thì nó cũng đã mở (ngầm) trước rồi vì thế chỉ cần thực hiện thao tác thôi.

Khi cần chọn cột cần tìm nào, bạn đặt con trỏ về ô đầu tiên của khối dữ liệu, ví dụ khối họ tên của bạn có họ tên đầu tiên ở ô B3 thì bạn đặt con trỏ tại ô B3 là ô hiện hành, sau đó bấm tổ hợp phím Ctrl+Shift+S để cho hiện Form.

Tại form có 1 textbox ghi lại địa chỉ ô hiện hành (bạn có thể thay đổi ô này nếu bạn muốn chọn cột khác), sau đó bạn chỉ bấm Enter hoặc nhấn vào nút Tạo List.

Lúc này trên form sẽ xuất hiện combobox và list danh sách đã được nạp vào, bạn chỉ việc gõ và Enter để tìm nhanh thôi.

Bất kỳ file nào bạn muốn tìm kiếm đều được, không chỉ riêng 2 file đâu, chỉ cần cài đặt Addins như đã hướng dẫn!

Chúc bạn vui khi sử dụng file này!
 

File đính kèm

Tôi làm được rồi cám ơn anh nhiều nhé, Anh Trọng Nghĩa ơi anh có nhiều chiêu hay làm tôi bất ngờ quá.

Khi tìm 1 tên phải bấm ctrl-shift-s, nếu tìm 10 tên phải bấm 10 lần, vậy mình có điều chỉnh cho form kéo dài thời gian xuất hiện đến khi tên cuối cùng tìm xong mới mất đi được không anh ?
 
Tôi làm được rồi cám ơn anh nhiều nhé, Anh Trọng Nghĩa ơi anh có nhiều chiêu hay làm tôi bất ngờ quá.

Khi tìm 1 tên phải bấm ctrl-shift-s, nếu tìm 10 tên phải bấm 10 lần, vậy mình có điều chỉnh cho form kéo dài thời gian xuất hiện đến khi tên cuối cùng tìm xong mới mất đi được không anh ?

Bạn đúng là được voi đòi 2 bà Trưng, giờ đòi tiếp bà Triệu mà!

Thôi, lỡ nuôi voi rồi, lên núi với bạn một chuyến luôn!

Tìm đã đi, không tìm nữa bấm nút thoát X cua form!
 

File đính kèm

Anh Trọng Nghĩa! Anh không chỉ giỏi excel mà còn là nghệ sỉ hài hước nữa, đọc mấy câu thoại tôi cười lăn ra luôn nè. Ai làm bạn với anh sẻ không bao giờ buồn. Một lần nữa cám ơn Anh Trọng Nghĩa nhé.
 
Toàn bộ code chỉ là vậy, thế nhưng bạn có hỏi tại sao gõ chữ Thanh mà không hiện lên các chữ liên quan có dấu, xin thưa với bạn là ở đây lọc xác định, nếu bạn muốn lọc tên có dấu thì bạn thêm dấu vào khi gõ!
Bạn Hoàng Trọng Nghĩa ơi để gõ chữ Thanh mà hiện lên các chữ liên quan có dấu như Thành, Thảnh... không biết cái code này có áp dụng được không? mình quên là đã tải nó ở đâu rồi chỉ biết textbox hay listbox thì dùng được

Function TV(ByVal Text As String) As String
Dim CharCode, ResText As String, i As Long, tmp As String
On Error Resume Next
tmp = Text
CharCode = Array(ChrW(7855), ChrW(7857), ChrW(7859), ChrW(7861), ChrW(7863), ChrW(7845), ChrW(7847), _
ChrW(7849), ChrW(7851), ChrW(7853), ChrW(225), ChrW(224), ChrW(7843), ChrW(227), ChrW(7841), _
ChrW(259), ChrW(226), ChrW(273), ChrW(7871), ChrW(7873), ChrW(7875), ChrW(7877), ChrW(7879), _
ChrW(233), ChrW(232), ChrW(7867), ChrW(7869), ChrW(7865), ChrW(234), ChrW(237), ChrW(236), _
ChrW(7881), ChrW(297), ChrW(7883), ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), _
ChrW(7899), ChrW(7901), ChrW(7903), ChrW(7905), ChrW(7907), ChrW(243), ChrW(242), ChrW(7887), _
ChrW(245), ChrW(7885), ChrW(244), ChrW(417), ChrW(7913), ChrW(7915), ChrW(7917), ChrW(7919), _
ChrW(7921), ChrW(250), ChrW(249), ChrW(7911), ChrW(361), ChrW(7909), ChrW(432), ChrW(253), _
ChrW(7923), ChrW(7927), ChrW(7929), ChrW(7925))
ResText = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyy"
For i = 0 To UBound(CharCode)
tmp = Replace(tmp, CharCode(i), Mid(ResText, i + 1, 1))
tmp = Replace(tmp, UCase(CharCode(i)), UCase(Mid(ResText, i + 1, 1)))
Next
TV = tmp
End Function
 
Bạn Hoàng Trọng Nghĩa ơi để gõ chữ Thanh mà hiện lên các chữ liên quan có dấu như Thành, Thảnh... không biết cái code này có áp dụng được không? mình quên là đã tải nó ở đâu rồi chỉ biết textbox hay listbox thì dùng được

Function TV(ByVal Text As String) As String
Dim CharCode, ResText As String, i As Long, tmp As String
On Error Resume Next
tmp = Text
CharCode = Array(ChrW(7855), ChrW(7857), ChrW(7859), ChrW(7861), ChrW(7863), ChrW(7845), ChrW(7847), _
ChrW(7849), ChrW(7851), ChrW(7853), ChrW(225), ChrW(224), ChrW(7843), ChrW(227), ChrW(7841), _
ChrW(259), ChrW(226), ChrW(273), ChrW(7871), ChrW(7873), ChrW(7875), ChrW(7877), ChrW(7879), _
ChrW(233), ChrW(232), ChrW(7867), ChrW(7869), ChrW(7865), ChrW(234), ChrW(237), ChrW(236), _
ChrW(7881), ChrW(297), ChrW(7883), ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), _
ChrW(7899), ChrW(7901), ChrW(7903), ChrW(7905), ChrW(7907), ChrW(243), ChrW(242), ChrW(7887), _
ChrW(245), ChrW(7885), ChrW(244), ChrW(417), ChrW(7913), ChrW(7915), ChrW(7917), ChrW(7919), _
ChrW(7921), ChrW(250), ChrW(249), ChrW(7911), ChrW(361), ChrW(7909), ChrW(432), ChrW(253), _
ChrW(7923), ChrW(7927), ChrW(7929), ChrW(7925))
ResText = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyy"
For i = 0 To UBound(CharCode)
tmp = Replace(tmp, CharCode(i), Mid(ResText, i + 1, 1))
tmp = Replace(tmp, UCase(CharCode(i)), UCase(Mid(ResText, i + 1, 1)))
Next
TV = tmp
End Function

Thật ra vấn đề này tôi đã nghiên cứu từ lâu, song chưa hoàn toàn chính xác nên tôi chưa gửi lên thôi. Nhưng với hàm này tôi không nghĩ là ứng dụng được với Lọc trong ComboBox được đâu.
 
tool nhập tên nhanh chính xác

Mến chào anh Trọng Nghĩa các anh chị và các bạn!
Trải qua thời gian dùng tool TimTenTool.rar của anh Trọng Nghĩa em thấy tool này rất hay, nay em thấy nó không chỉ dừng lại ở chức năng tìm tên nhanh mà nó còn có thể dùng nhập tên nhanh và chính xác nữa, nhưng em không biết lập trình nên em nhờ anh Trọng Nghĩa và các anh chị giúp đở ạ.

Cụ thể em muốn có một cái tool addin tương tự như TimTenTool của anh Trọng Nghĩa,tool gồm có một listbox,nút nạp list và nút nạp vùng nhập tên. Em lấy file toolnhapten để minh họa.

Tại sheet danh sách bấm phím tắc(phím nóng) cho tool hiện ra, trên tool có 1 nút nạp list và 1 nút nạp vùng nhập tênlistbox. Nhấp chọn ô B1 bấm nút nạp list,nguyên danh sách tên từ ô B2(Nguyễn Hải Chi) trở xuống được nạp vào tool. Tiếp đến tại sheet2 (hoặc một sheet bất kỳ của file excel khác đang mở), quét 1 khối ô bất kỳ cần nhập tên cụ thể là B3:B23, rồi bấm nút nạp vùng nhập tên , tool sẻ ghi nhận hiểu những ô này cần nhập tên từ list của tool, tại vùng cần nhập tên: ô B3 ta muốn nhập tên Phan Đình Phương chỉ cần gỏ P,H,A tool xổ list hiện dần cho đến khi ta thấy tên cần tìm Phan Đình Phương, ta chỉ cần dời chọn đến Phan Đình Phương gỏ phím enter cái tên này được nhập ngay vào ô B3, tại ô B4 muốn nhập tên Phạm Minh Tiến chỉ cần gỏ vào ô B4 P,H tool hiện list dần cho đến khi có tên Phạm Minh Tiến ta dời đến dòng Phạm Minh Tiến rồi gỏ enter cái tên Phạm Minh Tiến sẻ nhập ngay vào ô B4 cứ thế tiếp tục cho đến khi thôi hoặc hết vùng ô cần nhập tên, nếu muốn nhập tên cho sheet3 hoặc một sheet đang mở của một file excel đang mở khác chỉ việc chọn khối ô của sheet đó rồi bấm nút nạp vùng nhập tên để nhập tên tiếp, khi thôi nhập nữa bấm nút thoát X của tool.

Một lần nữa xin anh Trọng Nghĩa cùng các anh chị và các bạn thương giúp em nhé, em rất chân thành cám ơn.
 

File đính kèm

Lần chỉnh sửa cuối:
Mến chào anh Trọng Nghĩa các anh chị và các bạn!
Trải qua thời gian dùng tool TimTenTool.rar của anh Trọng Nghĩa em thấy tool này rất hay, nay em thấy nó không chỉ dừng lại ở chức năng tìm tên nhanh mà nó còn có thể dùng nhập tên nhanh và chính xác nữa, nhưng em không biết lập trình nên em nhờ anh Trọng Nghĩa và các anh chị giúp đở ạ.

Cụ thể em muốn có một cái tool addin tương tự như TimTenTool của anh Trọng Nghĩa,tool gồm có một listbox,nút nạp list và nút nạp vùng nhập tên. Em lấy file toolnhapten để minh họa.

Tại sheet danh sách bấm phím tắc(phím nóng) cho tool hiện ra, trên tool có 1 nút nạp list và 1 nút nạp vùng nhập tênlistbox. Nhấp chọn ô B1 bấm nút nạp list,nguyên danh sách tên từ ô B2(Nguyễn Hải Chi) trở xuống được nạp vào tool. Tiếp đến tại sheet2 (hoặc một sheet bất kỳ của file excel khác đang mở), quét 1 khối ô bất kỳ cần nhập tên cụ thể là B3:B23, rồi bấm nút nạp vùng nhập tên , tool sẻ ghi nhận hiểu những ô này cần nhập tên từ list của tool, tại vùng cần nhập tên: ô B3 ta muốn nhập tên Phan Đình Phương chỉ cần gỏ P,H,A tool xổ list hiện dần cho đến khi ta thấy tên cần tìm Phan Đình Phương, ta chỉ cần dời chọn đến Phan Đình Phương gỏ phím enter cái tên này được nhập ngay vào ô B3, tại ô B4 muốn nhập tên Phạm Minh Tiến chỉ cần gỏ vào ô B4 P,H tool hiện list dần cho đến khi có tên Phạm Minh Tiến ta dời đến dòng Phạm Minh Tiến rồi gỏ enter cái tên Phạm Minh Tiến sẻ nhập ngay vào ô B4 cứ thế tiếp tục cho đến khi thôi hoặc hết vùng ô cần nhập tên, nếu muốn nhập tên cho sheet3 hoặc một sheet đang mở của một file excel đang mở khác chỉ việc chọn khối ô của sheet đó rồi bấm nút nạp vùng nhập tên để nhập tên tiếp, khi thôi nhập nữa bấm nút thoát X của tool.

Một lần nữa xin anh Trọng Nghĩa cùng các anh chị và các bạn thương giúp em nhé, em rất chân thành cám ơn.
Tôi làm một cái form, khi form được load lên thì nó đã nhập tên trong sheet DanhSach vào trong combobox. Gõ tên hay bấm cho xổ xuống tên cần chọn, sau đó chọn ô nào muốn nhập tên rồi bấm nút. Khi form đang show, bạn có thể chọn bất cứ sheet nào hoặc sheet của bất cứ file nào đang mở để nhập tên cũng được! Thế thôi.

Toàn bộ Code thế này:

Mã:
Option Explicit
Private ArrDanhSach, ubd As Long

Private Sub UserForm_Initialize()
    ArrDanhSach = Range(DanhSach.Range("B2"), DanhSach.Range("B65536").End(xlUp))
    ubd = UBound(ArrDanhSach)
    ComboBox1.List = ArrDanhSach
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode <> 1 Then Cancel = 1
End Sub

Private Sub ComboBox1_Change()

    If ComboBox1 > "" Then
        ComboBox1.DropDown
    End If
    
    Dim strType As String
    Dim n As Long, r As Long
    Dim ArrFilter()

    ReDim ArrFilter(1 To ubd)
    strType = "*" & UCase(ComboBox1) & "*"
    For r = 1 To ubd
        If UCase(ArrDanhSach(r, 1)) Like strType Then
            n = n + 1
            ArrFilter(n) = ArrDanhSach(r, 1)
        End If
    Next
    
    If n Then
        ReDim Preserve ArrFilter(1 To n)
        ComboBox1.List = ArrFilter
    End If
    
End Sub

Private Sub CommandButton1_Click()
    If Trim(ComboBox1) = "" Then
        MsgBox "Ban phai nhap ten vao ComboBox"
    Else
        Selection = ComboBox1
        ComboBox1 = ""
    End If
    ComboBox1.SetFocus
End Sub

Private Sub CommandButton2_Click()
    ComboBox1 = ""
    Me.Hide
End Sub

Xin tải file ở bài sau!
 
Lần chỉnh sửa cuối:
Tôi làm một cái form, khi form được load lên thì nó đã nhập tên trong sheet DanhSach vào trong combobox. Gõ tên hay bấm cho xổ xuống tên cần chọn, sau đó chọn ô nào muốn nhập tên rồi bấm nút. Khi form đang show, bạn có thể chọn bất cứ sheet nào hoặc sheet của bất cứ file nào đang mở để nhập tên cũng được! Thế thôi.

Toàn bộ Code thế này:

Mã:
Option Explicit
Private ArrDanhSach, ubd As Long

Private Sub UserForm_Initialize()
    ArrDanhSach = Range(DanhSach.Range("B2"), DanhSach.Range("B65536").End(xlUp))
    ubd = UBound(ArrDanhSach)
    ComboBox1.List = ArrDanhSach
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode <> 1 Then Cancel = 1
End Sub

Private Sub ComboBox1_Change()

    If ComboBox1 > "" Then
        ComboBox1.DropDown
    End If
    
    Dim strType As String
    Dim n As Long, r As Long
    Dim ArrFilter()

    ReDim ArrFilter(1 To ubd)
    strType = "*" & UCase(ComboBox1) & "*"
    For r = 1 To ubd
        If UCase(ArrDanhSach(r, 1)) Like strType Then
            n = n + 1
            ArrFilter(n) = ArrDanhSach(r, 1)
        End If
    Next
    
    If n Then
        ReDim Preserve ArrFilter(1 To n)
        ComboBox1.List = ArrFilter
    End If
    
End Sub

Private Sub CommandButton1_Click()
    If Trim(ComboBox1) = "" Then
        MsgBox "Ban phai nhap ten vao ComboBox"
    Else
        Selection = ComboBox1
        ComboBox1 = ""
    End If
    ComboBox1.SetFocus
End Sub

Private Sub CommandButton2_Click()
    ComboBox1 = ""
    Me.Hide
End Sub

À, bạn thêm thủ tục này vào trong form nữa nhé! Đây là thủ tục để lấy lại Array nếu ArrDanhSach bị "đuối":

Mã:
Private Sub UserForm_Activate()
    If Not IsArray(ArrDanhSach) Then
        ArrDanhSach = Range(DanhSach.Range("B2"), DanhSach.Range("B65536").End(xlUp))
        ubd = UBound(ArrDanhSach)
        ComboBox1.List = ArrDanhSach
    End If
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
hong loi đã viết:
hoàng trọng nghĩa đã viết:
ok, tôi đã thực hiện cho bạn rồi đấy! Dao này tôi bận việc nhiều lắm, không có thời gian nhiều để trả lời!

chào anh trọng nghĩa ! Em biết anh rất bận nhưng em xin anh ít phút để đọc nhé.

đáng lẻ em nên post yêu cầu lên giao diện web nhưng sợ bị anh la rầy ê mặt với các thành viên khác, vì vậy em quyết định gửi bên này, có bị trách cũng không sao anh há.

Em rất vui:clap2: Cám ơn anh lắm nhe, dù không có thời gian nhưng anh vẫn rất nhiệt tình giúp em, form anh làm rất hay.

Cái hay thứ nhất form chạy nhanh nhẹ ghê luôn.

Cái hay thứ 2 là khi nhập xong một tên, combobox cũng được tự động xóa sạch nội dung sẳn sàng cho gỏ một tên mới mà không cần phải xóa bằng tay như ở combobox của tool tìm tên nhanh.

Cái hay thứ 3 khi form đã hiện ra thì được dùng chung thoải mái cho tất cả các sheet các file đang mở.

Cái hay thứ 4 khi tên được chọn vào combobox gỏ enter 2 lần là tên đó cũng được nhập vào ô đã chọn.

Còn giao diện form không cần phải nói nhiều, đẹp gọn khỏi chê luôn.

Bên cạnh những cái hay trên em thấy nếu được cải thiện thêm đôi chúc thì form càng đặc sắc hơn.

Thứ nhất lúc gỏ tên vào combobox, khi thấy tên trong list, thay vì dùng chuột click chọn tên vào combobox anh giúp em thêm cách chọn tên bằng bộ phím lên xuống qua lại trên bàn phím,cách chọn này anh có làm rồi trong tool tìm tên nhanh.

Thứ 2 cái này “được voi đòi hai bà trưng đây” : Anh có thể viết thêm 1 thủ tục để khi tên vừa nhập vào ô đã chọn, xong kế tiếp cái khung chọn ô tự động dời xuống ô kế dưới.

Ví dụ : ở sheet2 file nhaptenvaosheet khi vừa nhập xong tên phan đình phương vào ô b3 thì khung chọn từ ô b3 tự động dời xuống ô b4, như vậy khi nhập tên phạm minh tiến vào b4 ta không cần dời bằng tay cái khung chọn từ b3 xuống b4,nhập xong phạm minh tiến vào b4 khung lại tự động xuống ô b5….

Thứ 3 cái này “đòi lên đỉnh olpimpia luôn nè” thay vì em nhờ anh cải tiến nâng cấp lại form nhập tên trên file nhaptenvaosheet, anh có thể làm lại cái mới dưới dạng cái file addin như anh đã làm cho em dùng tìm tên nhanh không ?, file timtentool.rar ở mục số #43 đó. Em xin trích mục số #41 nguyên văn đoạn này để diễn giải cho anh hiểu rỏ yêu cầu của em:” bạn không cần mở file addins này đâu, khi mở bất kỳ file nào thì nó cũng đã mở (ngầm) trước rồi vì thế chỉ cần thực hiện thao tác thôi.

khi cần chọn cột cần tìm nào, bạn đặt con trỏ về ô đầu tiên của khối dữ liệu, ví dụ khối họ tên của bạn có họ tên đầu tiên ở ô b3 thì bạn đặt con trỏ tại ô b3 là ô hiện hành, sau đó bấm tổ hợp phím ctrl+shift+s để cho hiện form.

tại form có 1 textbox ghi lại địa chỉ ô hiện hành (bạn có thể thay đổi ô này nếu bạn muốn chọn cột khác), sau đó bạn chỉ bấm enter hoặc nhấn vào nút tạo list.

lúc này trên form sẽ xuất hiện combobox và list danh sách đã được nạp vào, bạn chỉ việc gõ và enter để tìm nhanh thôi.

bất kỳ file nào bạn muốn tìm kiếm đều được, không chỉ riêng 2 file đâu, chỉ cần cài đặt addins như đã hướng dẫn!”


nếu làm được cái addin giống như vậy thì sẻ thêm những tiện lợi sau:

- form sẻ nhập bất cứ danh sách ở cột nào của sheet nào đang mở chứ không chỉ là danh sách từ file nhaptenvaosheet.

- như vậy cứ mổi lần cần nhập tên không nhất thiếc phải mở file nhaptenvaosheet lên thì mới nhập cho sheet khác được.

- bỏ qua bước enable macro khi mở file.

Vậy đó anh trọng nghĩa ơi xin anh giành chút thời gian quí báo “ra tay” giúp em lần nữa nhe em rất biết ơn anh ạ.

Bạn làm ơn cái gì hỏi thì hỏi thẳng trên đây, đừng mất công viết tin nhắn riêng nữa nhé!

Theo như tôi nghĩ thì bạn cần làm một cái file AddIns. Mà đã là file dạng này thì chỉ nên chứa code thực thi, chứ không có dữ liệu gì trong đó. Vì vậy tôi phải sửa lại tất cả code đã viết cho bạn.

Trước hết sau khi bạn tải về, chép vào thư mục Addins như đã hướng dẫn ở bài #40 (lần này check vào NhapTenVaoSheet)

Để sử dụng, bấm phím tắt Ctrl+Shift+Z để load form.

Khi form mở lên, list chưa được nạp nên có một thông báo nhắc bạn phải nạp danh sách vào list.

Để nạp danh sách, bạn mở sheet có chứa danh sách ra, chọn vào ô đầu tiên chứa họ tên của danh sách rồi bấm nút ADD LIST (dĩ nhiên nó cũng sẽ hỏi gì gì đó để xác định việc add list này).

Khi đã có danh sách rồi thì form sẽ không hiện thông báo mỗi khi mở form nữa, nhưng nó sẽ lại thông báo nếu biến mảng bị giải phóng.

Bạn cũng có thể thay đổi danh sách mới bằng cách Add vào danh sách khác.

Khi list đã được Add thì ComboBox mới được sử dụng. Bạn chọn tên trên list của nó, chọn ô cần nhập tên, bấm vào nút lệnh. Lúc này ô được chọn sẽ được nhập, đồng thời cũng tự xuống hàng để bạn nhập tên khác, khỏi mất công phải chọn tới chọn lui.

Sau đây là toàn bộ code của file:

Mã:
Option Explicit
Private ArrDanhSach, ubd As Long


Private Sub UserForm_Activate()
    If Not IsArray(ArrDanhSach) Then
        Application.OnTime Now + TimeValue("0:0:1"), "AddListWarning"
        cbxDanhSach.Enabled = False
    End If
End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode <> 1 Then Cancel = 1
End Sub


Private Sub cbxDanhSach_Change()
    If cbxDanhSach > "" Then
        cbxDanhSach.DropDown
    End If
    Dim strType As String
    Dim n As Long, r As Long
    Dim ArrFilter()
    ReDim ArrFilter(1 To ubd)
    strType = "*" & UCase(cbxDanhSach) & "*"
    For r = 1 To ubd
        If UCase(ArrDanhSach(r, 1)) Like strType Then
            n = n + 1
            ArrFilter(n) = ArrDanhSach(r, 1)
        End If
    Next
    If n Then
        ReDim Preserve ArrFilter(1 To n)
        cbxDanhSach.List = ArrFilter
    End If
End Sub


Private Sub cmdAddList_Click()
    If cbxDanhSach.ListCount = 0 Then
AddList:
        Dim r As Long, c As Long, endRow As Long
        r = Selection.Row
        c = Selection.Column
        endRow = Cells(65536, c).End(xlUp).Row
        If endRow < r Then
            MsgBox "Danh sach khong kha dung!" & vbLf & _
            "Ban phai chon lai ten dau tien cua danh sach."
        Else
            If MsgBox("Ban co chac nap vao list danh sach nay khong?", _
                vbQuestion + vbYesNo, "Thông báo") = vbYes Then
                ArrDanhSach = Range(Cells(r, c), Cells(endRow, c))
                ubd = UBound(ArrDanhSach)
                cbxDanhSach.List = ArrDanhSach
                cbxDanhSach.Enabled = True
                cbxDanhSach.SetFocus
            End If
        End If
    Else
        If MsgBox("Danh sach da duoc nap roi, ban co chac nap lai danh sach moi khong?", _
            vbQuestion + vbYesNo, "Thông báo") = vbYes Then
            GoTo AddList
        End If
    End If
End Sub


Private Sub cmdNhapTen_Click()
    If cbxDanhSach.ListCount = 0 Then
        Call AddListWarning
        Exit Sub
    End If
    If Trim(cbxDanhSach) = "" Then
        MsgBox "Ban phai nhap ten vao ComboBox"
    Else
        Selection = cbxDanhSach
        cbxDanhSach = ""
        Selection.Offset(1).Select
    End If
    cbxDanhSach.SetFocus
End Sub


Private Sub cmdHide_Click()
    cbxDanhSach = ""
    Me.Hide
End Sub

=================================================
P/s: Tăng cường cho bạn thêm 2 nút "điều hướng", để điều khiển trên sheet, bạn bấm vào nút mũi tên một lần sẽ theo chiều mũi tên mà lên xuống hoặc qua lại 1 ô, nếu nhấn và giữ thì nó chạy cho đến khi nào bạn buông ra thì thôi.
 

File đính kèm

Lần chỉnh sửa cuối:
:clapping::clapping::clapping:Vui ơi là vui ! , cám ơn anh Trọng Nghĩa nhiều lắm nhe, file addin anh làm very good y như dân chuyên nghiệp làm vậy vượt qua mong đợi của em luôn, à anh Trọng Nghĩa ơi hình như anh bỏ xót yêu cầu chọn tên trong list xổ ra bằng các phím lên xuống qua lại trên bàn phím, trong yêu cầu thứ nhất đó anh.

Em xin giải thích thêm vì sao em lại thích kiểu chọn bằng bàn phím nhé.

Khi ta gỏ tên cần tìm đương nhiên bàn tay phải ở nơi bàn phím,như vậy khi list xổ ra ta chỉ cần xê dịch ngón tay đến vị trí bộ phím lên xuống qua lại, bấm phím xuống hoặc lên để di chuyển dòng chọn tên màu xanh trên list đến tên cần nhập.

Bây giờ bàn tay vẫn còn ở bàn phím và rất gần với phím enter,nếu như có thể gỏ enter 1 hoặc 2 lần là tên được nhập vào ô, thì ta có một cái lợi là rút ngắn phạm vi hoặc động của đôi tay đồng nghĩa với việc giúp ta điều khiển dể dàng rút ngắn thời giang và tăng tốc độ nhập tên lên thêm nhiều nhất là khi cần nhập một danh sách dài.

Em có tìm 2 đoạn code từ tool tìm tên nhanh và tool mới làm nhaptenvaosheet của anh

Private Sub cbxDanhSach_Change()
If cbxDanhSach > "" Then
cbxDanhSach.DropDown
End If
Dim strType As String
Dim n As Long, r As Long
Dim ArrFilter()
ReDim ArrFilter(1 To ubd)
strType = "*" & UCase(cbxDanhSach) & "*"
For r = 1 To ubd
If UCase(ArrDanhSach(r, 1)) Like strType Then
n = n + 1
ArrFilter(n) = ArrDanhSach(r, 1)
End If
Next
If n Then
ReDim Preserve ArrFilter(1 To n)
cbxDanhSach.List = ArrFilter
End If
End Sub




Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
On Error GoTo XuLyLoi
With ComboBox1
Select Case KeyCode
Case 8
If .Text = "" Then
.List = sArray: Exit Sub
Else
GoTo CaseElse
End If
Case 13
If .MatchFound = True Then
FindRange.Find(.Text, LookIn:=xlValues, LookAt:=xlWhole).Select
'Unload Me
Exit Sub
End If
Case 37 To 40: Exit Sub
Case Else
CaseElse:
.List = Filter2DArray(sArray, 1, "*" & .Text & "*", False)
End Select
Exit Sub
XuLyLoi:
.List = Array("")
.Clear
End With
End Sub

Không biết có phải là phần em đang nói đến hay không, vì không biết lập trình nên em không dám chạm vào lở hư là đi têu công sức của anh.
 
Lần chỉnh sửa cuối:
:clapping::clapping::clapping:Vui ơi là vui ! , cám ơn anh Trọng Nghĩa nhiều lắm nhe, file addin anh làm very good y như dân chuyên nghiệp làm vậy vượt qua mong đợi của em luôn, à anh Trọng Nghĩa ơi hình như anh bỏ xót yêu cầu chọn tên trong list xổ ra bằng các phím lên xuống qua lại trên bàn phím, trong yêu cầu thứ nhất đó anh.

Em xin giải thích thêm vì sao em lại thích kiểu chọn bằng bàn phím nhé.

Khi ta gỏ tên cần tìm đương nhiên bàn tay phải ở nơi bàn phím,như vậy khi list xổ ra ta chỉ cần xê dịch ngón tay đến vị trí bộ phím lên xuống qua lại, bấm phím xuống hoặc lên để di chuyển dòng chọn tên màu xanh trên list đến tên cần nhập.

Bây giờ bàn tay vẫn còn ở bàn phím và rất gần với phím enter,nếu như có thể gỏ enter 1 hoặc 2 lần là tên được nhập vào ô, thì ta có một cái lợi là rút ngắn phạm vi hoặc động của đôi tay đồng nghĩa với việc giúp ta điều khiển dể dàng rút ngắn thời giang và tăng tốc độ nhập tên lên thêm nhiều nhất là khi cần nhập một danh sách dài.

Bạn giải thích dài dòng mà tôi chẳng hiểu rõ ý bạn dùng nút mũi tên để làm gì ở những bài trước! Giờ mới hiểu ý của bạn đó! Chẳng khó gì đâu, thay thằng Change bằng thằng KeyUp thôi!

Mã:
[COLOR=#0000ff]''Tranh phai Filter khi su dung cac nut chuc nang:[/COLOR]
Private Sub cbxDanhSach_Change()
    IsChange = True
End Sub


Private Sub cbxDanhSach_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
[COLOR=#008080]    If IsChange = False Then Exit Sub
    IsChange = False[/COLOR]
    Select Case KeyCode
    Case 9, 13, 37 To 40
    Case Else
        If cbxDanhSach > "" Then
            cbxDanhSach.DropDown
        End If
        Dim strType As String
        Dim n As Long, r As Long
        Dim ArrFilter()
        ReDim ArrFilter(1 To Ubd)
        strType = "*" & UCase(cbxDanhSach) & "*"
        For r = 1 To Ubd
            If UCase(ArrDanhSach(r, 1)) Like strType Then
                n = n + 1
                ArrFilter(n) = ArrDanhSach(r, 1)
            End If
        Next
        If n Then
            ReDim Preserve ArrFilter(1 To n)
            cbxDanhSach.List = ArrFilter
        Else
            cbxDanhSach.List = Array("")
        End If
    End Select
End Sub

Bổ sung vào nút nhập:

Mã:
Private Sub cmdAddList_Click()
    If cbxDanhSach.ListCount = 0 Then
AddList:
        Dim r As Long, c As Long, endRow As Long
        r = Selection.Row
        c = Selection.Column
        endRow = Cells(65536, c).End(xlUp).Row
        If endRow < r Then
            MsgBox "Danh sach khong kha dung!" & vbLf & _
            "Ban phai chon lai ten dau tien cua danh sach."
        Else
            If MsgBox("Ban co chac nap vao list danh sach nay khong?", _
                vbQuestion + vbYesNo, "Thông báo") = vbYes Then
                ArrDanhSach = Range(Cells(r, c), Cells(endRow, c))
[COLOR=#0000ff]                ''Truong hop vung duoc chon chi co 1 o duy nhat:[/COLOR]
                If Not IsArray(ArrDanhSach) Then
[COLOR=#0000ff]                    ''Ma o nay lai rong:[/COLOR]
                    If ArrDanhSach = "" Then
                        MsgBox "Danh sach khong kha dung!" & vbLf & _
                        "Ban phai chon lai ten dau tien cua danh sach."
                        Exit Sub
                    Else
[COLOR=#0000ff]                        ''Neu khong thi danh sach cung duoc cap nhat voi 1 ten:[/COLOR]
                        ReDim ArrDanhSach(1 To 1, 1 To 1)
                        ArrDanhSach(1, 1) = Range(Cells(r, c), Cells(endRow, c))
                    End If
                End If
                Ubd = UBound(ArrDanhSach)
                cbxDanhSach.List = ArrDanhSach
                cbxDanhSach.Enabled = True
                cbxDanhSach.SetFocus
            End If
        End If
    Else
        If MsgBox("Danh sach da duoc nap roi, ban co chac nap lai danh sach moi khong?", _
            vbQuestion + vbYesNo, "Thông báo") = vbYes Then
            GoTo AddList
        End If
    End If
End Sub


Xóa file cũ đi, thay vào file mới này! Lưu ý, nút nhập rất nhạy khi bạn bấm Enter đấy nhé! (giảm cho bạn 1 lần Enter đấy).
 

File đính kèm

Lần chỉnh sửa cuối:
Ôi! anh Trọng Nghĩa ơi vậy là yêu cầu của em đã thành hiện thực cả rồi em hạnh phúc quá anh ạ, em thấy em rất may mắn gặp được một người vừa giỏi vừa tốt như anh. Cám ơn anh nhiều nhé.

"việc hôm nay không nên để đến ngày mai" nhưng nếu công việc nhiều quá phải để ngày mai làm tiếp chứ anh đừng thức khuya rất có hại cho sức khỏe, sức khỏe mất đi dù có vàng bạc châu báu củng chưa chắc mua lại được đâu anh.
 
Anh Trọng Nghĩa ơi cho em hỏi thêm một tí nhe, ở cái addin tìm tên timtentool TimTenTool.rar mục #43
khi gõ tên tìm xong, muốn gõ tiếp ta phải xóa bằng tay cái tên củ trong combobox mới gõ tên khác tìm tiếp như vậy hơi thừa thao tác, không biết anh có thể thêm một thủ tục để sau khi gỏ enter khung chọn chỉ đúng tên rồi thì thủ tục này sẻ tự động xóa sạch tên củ trong combobox sẵn sàng cho ta gõ tên mới.

Có phải sửa lại code này không anh ?
Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
On Error GoTo XuLyLoi
With ComboBox1
Select Case KeyCode
Case 8
If .Text = "" Then
.List = sArray: Exit Sub
Else
GoTo CaseElse
End If
Case 13
If .MatchFound = True Then
FindRange.Find(.Text, LookIn:=xlValues, LookAt:=xlWhole).Select
'Unload Me
Exit Sub
End If
Case 37 To 40: Exit Sub
Case Else
CaseElse:
.List = Filter2DArray(sArray, 1, "*" & .Text & "*", False)
End Select
Exit Sub
XuLyLoi:
.List = Array("")
.Clear
End With
End Sub
 
Lần chỉnh sửa cuối:
Anh Trọng Nghĩa ơi cho em hỏi thêm một tí nhe, ở cái addin tìm tên timtentool TimTenTool.rar mục #43
khi gõ tên tìm xong, muốn gõ tiếp ta phải xóa bằng tay cái tên củ trong combobox mới gõ tên khác tìm tiếp như vậy hơi thừa thao tác, không biết anh có thể thêm một thủ tục để sau khi gỏ enter khung chọn chỉ đúng tên rồi thì thủ tục này sẻ tự động xóa sạch tên củ trong combobox sẵn sàng cho ta gõ tên mới.

Có phải sửa lại code này không anh ?
Giờ mới đọc bài này! (đã cùi rồi cho lở luôn chứ biết làm sao với bạn bây giờ!).

Tại ngay cái file đó, bạn thêm cái dòng đỏ vào là xong!

Mã:
Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
      On Error GoTo XuLyLoi
      With ComboBox1
            Select Case KeyCode
                  Case 8
                        If .Text = "" Then
                              .List = sArray: Exit Sub
                        Else
                              GoTo CaseElse
                        End If
                  Case 13
                        If .MatchFound = True Then
                              FindRange.Find(.Text, LookIn:=xlValues, LookAt:=xlWhole).Select
[COLOR=#ff0000][B]                              .Text = ""[/B][/COLOR]
                              Exit Sub
                        End If
                  Case 37 To 40: Exit Sub
                  Case Else
CaseElse:
                  .List = Filter2DArray(sArray, 1, "*" & .Text & "*", False)
            End Select
            Exit Sub
XuLyLoi:
            .List = Array("")
            .Clear
      End With
End Sub

Đơn giản thế mà bạn cũng không thực hiện được nữa, hic ... hic ... hic.
 
Giờ mới đọc bài này! (đã cùi rồi cho lở luôn chứ biết làm sao với bạn bây giờ!).

Tại ngay cái file đó, bạn thêm cái dòng đỏ vào là xong!

Mã:
Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
      On Error GoTo XuLyLoi
      With ComboBox1
            Select Case KeyCode
                  Case 8
                        If .Text = "" Then
                              .List = sArray: Exit Sub
                        Else
                              GoTo CaseElse
                        End If
                  Case 13
                        If .MatchFound = True Then
                              FindRange.Find(.Text, LookIn:=xlValues, LookAt:=xlWhole).Select
[COLOR=#ff0000][B]                              .Text = ""[/B][/COLOR]
                              Exit Sub
                        End If
                  Case 37 To 40: Exit Sub
                  Case Else
CaseElse:
                  .List = Filter2DArray(sArray, 1, "*" & .Text & "*", False)
            End Select
            Exit Sub
XuLyLoi:
            .List = Array("")
            .Clear
      End With
End Sub

Đơn giản thế mà bạn cũng không thực hiện được nữa, hic ... hic ... hic.

Ồ! hay quá chỉ đơn giãn thế hả anh thế mà anh lại cho em chờ từng ngày, từng ngày... đây nè, hì...hì...hì ,nói đùa thôi nhé em biết anh bận rộn lắm.

Nói thật với anh em đã tìm hoa cả mắt mấy cái code anh tạo ở trên nhưng vẫn không thể đoán được hàng code nào liên quan đến phần xóa nội dung trong combobox. Nay anh hướng dẫn em làm được rồi, càng tiếp xúc với anh em thấy mình càng ngu càng nhỏ bé lại.

Cám ơn Trọng Nghĩa lắm nhe, nhờ có "lở cùi" anh đã giúp em mở rộng tầm nhìn, giúp em tiến bộ hơn rất nhiều.
 
Em tìm được cách sử dụng rồi. Cám ơn các anh nhé. Em cũng là một số 0. Nhưng khi phải bắt tay vào xây dựng một ứng dụng quản lý hồ sơ của dự án thì phải lên GPE hỏi liên tục. Giờ ứng dụng cũng gần xong. Nhìn lại có 2 tuần từ ban đầu không biết code là gì mà giờ không nghĩ là mình thay đổi nhanh đến thế. Cảm ơn GPE và những người tâm huyết giúp đỡ mọi người như anh Hoàng Trọng Nghĩa.
 
Lần chỉnh sửa cuối:
quote_icon.png
Nguyên văn bởi Hoàng Trọng NghĩaTôi làm một cái form, khi form được load lên thì nó đã nhập tên trong sheet DanhSach vào trong combobox. Gõ tên hay bấm cho xổ xuống tên cần chọn, sau đó chọn ô nào muốn nhập tên rồi bấm nút. Khi form đang show, bạn có thể chọn bất cứ sheet nào hoặc sheet của bất cứ file nào đang mở để nhập tên cũng được! Thế thôi.

Toàn bộ Code thế này:

Code:
Option Explicit
Private ArrDanhSach, ubd As Long

Private Sub UserForm_Initialize()
ArrDanhSach = Range(DanhSach.Range("B2"), DanhSach.Range("B65536").End(xlUp))
ubd = UBound(ArrDanhSach)
ComboBox1.List = ArrDanhSach
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode <> 1 Then Cancel = 1
End Sub

Private Sub ComboBox1_Change()

If ComboBox1 > "" Then
ComboBox1.DropDown
End If

Dim strType As String
Dim n As Long, r As Long
Dim ArrFilter()

ReDim ArrFilter(1 To ubd)
strType = "*" & UCase(ComboBox1) & "*"
For r = 1 To ubd
If UCase(ArrDanhSach(r, 1)) Like strType Then
n = n + 1
ArrFilter(n) = ArrDanhSach(r, 1)
End If
Next

If n Then
ReDim Preserve ArrFilter(1 To n)
ComboBox1.List = ArrFilter
End If

End Sub

Private Sub CommandButton1_Click()
If Trim(ComboBox1) = "" Then
MsgBox "Ban phai nhap ten vao ComboBox"
Else
Selection = ComboBox1
ComboBox1 = ""
End If
ComboBox1.SetFocus
End Sub

Private Sub CommandButton2_Click()
ComboBox1 = ""
Me.Hide
End Sub

/cod[e]

À, bạn thêm thủ tục này vào trong form nữa nhé! Đây là thủ tục để lấy lại Array nếu ArrDanhSach bị "đuối":

Code:
Private Sub UserForm_Activate()
If Not IsArray(ArrDanhSach) Then
ArrDanhSach = Range(DanhSach.Range("B2"), DanhSach.Range("B65536").End(xlUp))
ubd = UBound(ArrDanhSach)
ComboBox1.List = ArrDanhSach
End If
End Sub

Mến chào anh Trọng Nghĩa! Nếu có thời gian anh xem giúp em cái bài này nhé.

Em nhận thấy trong trường hợp chỉ dùng duy nhất một danh sách cho duy nhất một file thì form NhapTenVaoSheet.xls#49 là chọn lựa hay nhất. Nhưng do form này chưa được cải tiến vì vậy em “săn quần săn áo làm liều xuống ao mò…code ” cuối cùng em làm như thế này.

Để đổi chức năng chọn tên bằng chuột qua bằng bàn phím em đổi code này

Private Sub ComboBox1_Change() If ComboBox1 > "" Then ComboBox1.DropDown End If Dim strType As String Dim n As Long, r As Long Dim ArrFilter() ReDim ArrFilter(1 To ubd) strType = "*" & UCase(ComboBox1) & "*" For r = 1 To ubd If UCase(ArrDanhSach(r, 1)) Like strType Then n = n + 1 ArrFilter(n) = ArrDanhSach(r, 1) End If Next If n Then ReDim Preserve ArrFilter(1 To n) ComboBox1.List = ArrFilter End If End Sub
Thành code này

Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Select Case KeyCode
Case 9, 13, 37 To 40
Case Else
If ComboBox1 > "" Then
ComboBox1.DropDown
End If
Dim strType As String
Dim n As Long, r As Long
Dim ArrFilter()
ReDim ArrFilter(1 To ubd)
strType = "*" & UCase(ComboBox1) & "*"
For r = 1 To ubd
If UCase(ArrDanhSach(r, 1)) Like strType Then
n = n + 1
ArrFilter(n) = ArrDanhSach(r, 1)
End If
Next
If n Then
ReDim Preserve ArrFilter(1 To n)
ComboBox1.List = ArrFilter
Else
ComboBox1.List = Array("")
End If
End Select
End Sub

Em đã xóa đi cái này
If IsChange = False Then Exit Sub
IsChange = False

vì để vào là bị báo lổi code khi gỏ chử vào combobox.

Để tự xuống dòng em thay code

Private Sub CommandButton1_Click() If Trim(ComboBox1) = "" Then MsgBox "Ban phai nhap ten vao ComboBox" Else Selection = ComboBox1 ComboBox1 = "" End If ComboBox1.SetFocusEnd Sub

Bằng code này
Private Sub CommandButton1_Click()
If Trim(ComboBox1) = "" Then
MsgBox "Ban phai nhap ten vao ComboBox"
Else
Selection = ComboBox1
ComboBox1 = ""
Selection.Offset(1).Select
End If
ComboBox1.SetFocus
End Sub

Để giảm bớt một lần enter hì..hì…bó tay không tìm ra.

Kết quả form vẫn chạy nhưng khi gõ chữ list xổ ra không đúng qui tắc củ nữa ra lung tung, khi chọn tên bằng bàn phím nếu lở bấm giữ phím chạy xuống hơi lâu dòng chọn tên màu xanh trong list xuống tới cuối list thì list cũng mất tiêu luôn.
 

File đính kèm

Lần chỉnh sửa cuối:
Mến chào anh Trọng Nghĩa! Nếu có thời gian anh xem giúp em cái bài này nhé.

Em nhận thấy trong trường hợp chỉ dùng duy nhất một danh sách cho duy nhất một file thì form NhapTenVaoSheet.xls#49 là chọn lựa hay nhất. Nhưng do form này chưa được cải tiến vì vậy em “săn quần săn áo làm liều xuống ao mò…code ” cuối cùng em làm như thế này.


Để giảm bớt một lần enter hì..hì…bó tay không tìm ra.

Kết quả form vẫn chạy nhưng khi gõ chữ list xổ ra không đúng qui tắc củ nữa ra lung tung, khi chọn tên bằng bàn phím nếu lở bấm giữ phím chạy xuống hơi lâu dòng chọn tên màu xanh trong list xuống tới cuối list thì list cũng mất tiêu luôn.

Để code chạy đừng có "ra lung tung" thì bạn thay thủ tục KeyDown thành KeyUp:

Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Thế là xong!

Để tiết kiệm 1 lần Enter, Chọn vào Nút lệnh, Properties chọn Default=True là xong! Ẹc ẹc ...
 
Để code chạy đừng có "ra lung tung" thì bạn thay thủ tục KeyDown thành KeyUp:

Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Thế là xong!

Để tiết kiệm 1 lần Enter, Chọn vào Nút lệnh, Properties chọn Default=True là xong! Ẹc ẹc ...

Ha...Ha...@$@!^% dzời ơi vui quá em làm được rồi! Thật không ngờ anh Trọng Nghĩa có "nhiều chiêu" đơn giãn nhưng lại rất hay.

Một lần nữa em cám ơn anh nhiều nhe.
 
Anh Trọng Nghĩa mến! Lúc này anh khỏe không ? em thấy có bài này dùng nhập tên cũng hay lắm, tuy nhiên còn bị hạn chế về tốc độ xử lý dò tìm dử liệu, vì vậy em muốn hỏi anh : ở bài này http://www.giaiphapexcel.com/forum/showthread.php?72633-Hỏi-cách-tạo-combo-box-thông-minh/page5 Trang #41
Người ta dùng textbox kết hợp listbox, vậy anh có thể thay textbox kết hợp listbox bằng combox anh tạo cho em dùng bấy lâu nay không? Em thấy combox của anh chạy rất nhẹ rất nhanh trong khi textbox kết hợp listbox chạy rất nặng nề nhất là khi danh sách dài khoảng 1000 dòng ,danh sách càng dài chạy càng nặng. Em đã thử mày mò lắp ghép đủ thứ nhưng nó cứ báo lổi hoặc không nhút nhít gì hết, tóm lại là không thể làm được gì cả.
Vậy em xin anh dành chút thời gian quý báu xem thử có thể giúp em không nhé, em rất cám ơn anh.
 
Lần chỉnh sửa cuối:
Anh Trọng Nghĩa mến! Lúc này anh khỏe không ? em thấy có bài này dùng nhập tên cũng hay lắm, tuy nhiên còn bị hạn chế về tốc độ xử lý dò tìm dử liệu, vì vậy em muốn hỏi anh : ở bài này http://www.giaiphapexcel.com/forum/showthread.php?72633-Hỏi-cách-tạo-combo-box-thông-minh/page5 Trang #41
Người ta dùng textbox kết hợp listbox, vậy anh có thể thay textbox kết hợp listbox bằng combox anh tạo cho em dùng bấy lâu nay không? Em thấy combox của anh chạy rất nhẹ rất nhanh trong khi textbox kết hợp listbox chạy rất nặng nề nhất là khi danh sách dài khoảng 1000 dòng ,danh sách càng dài chạy càng nặng. Em đã thử mày mò lắp ghép đủ thứ nhưng nó cứ báo lổi hoặc không nhút nhít gì hết, tóm lại là không thể làm được gì cả.
Vậy em xin anh dành chút thời gian quý báu xem thử có thể giúp em không nhé, em rất cám ơn anh.

bạn hỏi anh Nghĩa, nhưng tôi thất nghiệp quá, trả lời đại luôn nha
tôi thấy việc nó nhanh hay chậm ko phụ thuộc vào textbox, listbox hay combobox, mà do bạn sử dụng bao nhiêu cái vòng lặp, lặp càng nhiều thì chạy càng chậm
ở sub loc (module 2), tôi thấy anh QuangHai có sử dụng cái function TV, tôi ko rỏ mục đích cuả function này là gì. nhưng bạn thử bỏ nó xem có nhanh hơn ko
Mã:
Sub loc()
Dim dl(), i As Long, c As Byte
dl = Sheet2.[A4:D1000].Value
ActiveSheet.ListBox1.Clear
c = ActiveCell.Column - 2
For i = 1 To UBound(dl)
   If dl(i, c) <> "" Then
      If LCase(dl(i, c)) Like "*" & LCase(ActiveSheet.TextBox1.Value) & "*" Then
         ActiveSheet.ListBox1.AddItem dl(i, c)
      End If
   End If
Next
End Sub
 
bạn hỏi anh Nghĩa, nhưng tôi thất nghiệp quá, trả lời đại luôn nha
tôi thấy việc nó nhanh hay chậm ko phụ thuộc vào textbox, listbox hay combobox, mà do bạn sử dụng bao nhiêu cái vòng lặp, lặp càng nhiều thì chạy càng chậm
ở sub loc (module 2), tôi thấy anh QuangHai có sử dụng cái function TV, tôi ko rỏ mục đích cuả function này là gì. nhưng bạn thử bỏ nó xem có nhanh hơn ko
Mã:
Sub loc()
Dim dl(), i As Long, c As Byte
dl = Sheet2.[A4:D1000].Value
ActiveSheet.ListBox1.Clear
c = ActiveCell.Column - 2
For i = 1 To UBound(dl)
   If dl(i, c) <> "" Then
      If LCase(dl(i, c)) Like "*" & LCase(ActiveSheet.TextBox1.Value) & "*" Then
         ActiveSheet.ListBox1.AddItem dl(i, c)
      End If
   End If
Next
End Sub



Cám ơn anh Let'GâuGâu nhé đúng là có cải thiện về tốc độ rồi đấy nhưng vẫn chưa bằng combox box của anh Trọng Nghĩa, combox của anh Trọng Nghĩa có dùng hàm lọc rất nhanh nhẹ là Filter2Darray gì gì đó của anh Siwtom. Còn cái function TV theo em biết nó dùng hổ trợ gỏ từ không dấu khi lọc ra có thêm các từ có dấu, ví dụ hiện tại không dùng cái function TV, nếu gỏ THI listbox sẻ cho ra các tên với chử I không có dấu ví dụ như THI THINH THIÊN… .Khi dùng cái function TV nếu gỏ THI không những chỉ ra THI THINH THIÊN mà còn có thêm THÍ THÌ THĨNH THỊNH tức là ghỏ THI chử I không có dấu nhưng vẩn ra I Í Ì Ĩ Ị…
 
Cám ơn anh Let'GâuGâu nhé đúng là có cải thiện về tốc độ rồi đấy nhưng vẫn chưa bằng combox box của anh Trọng Nghĩa, combox của anh Trọng Nghĩa có dùng hàm lọc rất nhanh nhẹ là Filter2Darray gì gì đó của anh Siwtom. Còn cái function TV theo em biết nó dùng hổ trợ gỏ từ không dấu khi lọc ra có thêm các từ có dấu, ví dụ hiện tại không dùng cái function TV, nếu gỏ THI listbox sẻ cho ra các tên với chử I không có dấu ví dụ như THI THINH THIÊN… .Khi dùng cái function TV nếu gỏ THI không những chỉ ra THI THINH THIÊN mà còn có thêm THÍ THÌ THĨNH THỊNH tức là ghỏ THI chử I không có dấu nhưng vẩn ra I Í Ì Ĩ Ị…

Anh Let'GâuGâu ơi anh còn thất nghiệp không ? em nhờ anh sửa code sao cho textbox listbox hiện ra cho ta gỏ nhập tên chỉ khi có gỏ kí tự vào ô(nghĩa là chỉ show ra khi gỏ tên cần tìm), còn lúc ta click hoặc di chuyễn bằng bàn phím mà chưa gỏ kí tự tìm tên vào thì ô sẻ không show ra testbox – listbox .

Nếu làm được việc này excel sẻ chạy nhẹ hơn vì không cần phải luôn hiện listbox-testbox đồng thời nhìn đọc cũng khỏe mắt hơn do không bị testbox-listbox che các ô.
 
Anh Let'GâuGâu ơi anh còn thất nghiệp không ? em nhờ anh sửa code sao cho textbox listbox hiện ra cho ta gỏ nhập tên chỉ khi có gỏ kí tự vào ô(nghĩa là chỉ show ra khi gỏ tên cần tìm), còn lúc ta click hoặc di chuyễn bằng bàn phím mà chưa gỏ kí tự tìm tên vào thì ô sẻ không show ra testbox – listbox .

Nếu làm được việc này excel sẻ chạy nhẹ hơn vì không cần phải luôn hiện listbox-testbox đồng thời nhìn đọc cũng khỏe mắt hơn do không bị testbox-listbox che các ô.

ở module 1 (thaydoi)
bỏ đi đoạn code listbox1
Mã:
Sub thaydoi()
With ActiveSheet.TextBox1
        .Visible = False
        .Visible = True
        .Left = ActiveCell.Left
        .Top = ActiveCell.Top
        .Width = ActiveCell.Width
        .Height = ActiveCell.Height
        .Value = ""
        .Activate
End With
'With ActiveSheet.ListBox1
        '.Visible = False
        '.Visible = True
        '.Left = ActiveCell.Offset(1).Left
        '.Top = ActiveCell.Offset(1).Top
       ' .Width = ActiveCell.Offset(1).Width
        '.Clear
'End With
End Sub
chuyển nó qua sheet nào có sử dụng Textbox& listbox
Mã:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
With ActiveSheet.ListBox1
        .Visible = False
        .Visible = True
        .Left = ActiveCell.Offset(1).Left
        .Top = ActiveCell.Offset(1).Top
        .Width = ActiveCell.Offset(1).Width
        .Clear
End With
End Sub

chừng nào siêng tôi chuyển qua combobox cho bạn (nhưng chưa có cái filter2Darray nha, tôi chua học hàm đó)
 
ở module 1 (thaydoi)
bỏ đi đoạn code listbox1
Mã:
Sub thaydoi()
With ActiveSheet.TextBox1
        .Visible = False
        .Visible = True
        .Left = ActiveCell.Left
        .Top = ActiveCell.Top
        .Width = ActiveCell.Width
        .Height = ActiveCell.Height
        .Value = ""
        .Activate
End With
'With ActiveSheet.ListBox1
        '.Visible = False
        '.Visible = True
        '.Left = ActiveCell.Offset(1).Left
        '.Top = ActiveCell.Offset(1).Top
       ' .Width = ActiveCell.Offset(1).Width
        '.Clear
'End With
End Sub
chuyển nó qua sheet nào có sử dụng Textbox& listbox
Mã:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
With ActiveSheet.ListBox1
        .Visible = False
        .Visible = True
        .Left = ActiveCell.Offset(1).Left
        .Top = ActiveCell.Offset(1).Top
        .Width = ActiveCell.Offset(1).Width
        .Clear
End With
End Sub

chừng nào siêng tôi chuyển qua combobox cho bạn (nhưng chưa có cái filter2Darray nha, tôi chua học hàm đó)

Anh Let'GâuGâu ơi cách hướng dẫn của anh không đáp ứng đúng yêu cầu của em rồi, bỏ nó đi chỉ làm mất đi textbox thôi anh ạ, yêu cầu của em là muốn nó show ra khi cân thiết chứ không bỏ đi.
 
Anh Let'GâuGâu ơi cách hướng dẫn của anh không đáp ứng đúng yêu cầu của em rồi, bỏ nó đi chỉ làm mất đi textbox thôi anh ạ, yêu cầu của em là muốn nó show ra khi cân thiết chứ không bỏ đi.

không biết là bạn làm sao? tôi khoá code của listbox mà có liên quan gì tới textbox đâu?
khi gõ chữ vào tẽxtbox thì listbox mới xuất hiện (là do sự kiện keypress)
 
không biết là bạn làm sao? tôi khoá code của listbox mà có liên quan gì tới textbox đâu?
khi gõ chữ vào tẽxtbox thì listbox mới xuất hiện (là do sự kiện keypress)

Vì chưa hiểu hướng dẫn của anh nên em trách nhầm, cho em xin lổi nhé, bây giờ trông khỏe mắt hơn nhiều rồi cám ơn anh nhiều ạ.

Anh giỏi về textbox listbox quá ta. Nhân đây em nhờ anh rở rối giúp nhé:

1.Em mài mò chắp ghép được đoạn code này :

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 3 Then
    If Target.Rows.Count = 1 Then
        If Target <> "" Then
            Target.Offset(, 2).Activate
        End If
    End If
ElseIf Target.Column = 5 Then
    If Target.Rows.Count = 1 Then
        If Target <> "" Then
            Target.Offset(, 1).Activate
        End If
    End If
ElseIf Target.Column = 6 Then
    If Target.Rows.Count = 1 Then
        If Target <> "" Then
            Target.Offset(1, -3).Activate
        End If
    End If
End If
End Sub

Với mong muốn là khung chọn ô di chuyễn có qui luật đúng theo thứ tự như ta cài đặt. ở đây em bắt nó di chuyễn theo cột C --> cột E --> cột F --> xuống dòng quay về cột C tiếp tục chu kỳ mới.

Nhưng em gặp phải lổi: khi khung chọn ô xuống dòng nhảy đến cột C có textbox, lẻ ra nó phải hiện ra , không hiểu sao nó biến đi đâu mất cả khung chọn ô cũng biến luôn.

2.Em nhờ anh giúp em chỉnh lại cái listbox sao cho khi hiện ra có thêm mấy cột kế tiếp, lưu ý chỉ hiện view ra để xem thêm thôi còn mọi cái khác không có gì thay đổi. Em lấy file củ sửa sheet Lenh.giao.hang và DANHMUC đôi chút để minh họa anh xem giúp nhé.
 

File đính kèm

Lần chỉnh sửa cuối:
Vì chưa hiểu hướng dẫn của anh nên em trách nhầm, cho em xin lổi nhé, bây giờ trông khỏe mắt hơn nhiều rồi cám ơn anh nhiều ạ.

Với mong muốn là khung chọn ô di chuyễn có qui luật đúng theo thứ tự như ta cài đặt. ở đây em bắt nó di chuyễn theo cột C --> cột E --> cột F --> xuống dòng quay về cột C tiếp tục chu kỳ mới.

Nhưng em gặp phải lổi: khi khung chọn ô xuống dòng nhảy đến cột C có textbox, lẻ ra nó phải hiện ra , không hiểu sao nó biến đi đâu mất cả khung chọn ô cũng biến luôn.

2.Em nhờ anh giúp em chỉnh lại cái listbox sao cho khi hiện ra có thêm mấy cột kế tiếp, lưu ý chỉ hiện view ra để xem thêm thôi còn mọi cái khác không có gì thay đổi. Em lấy file củ sửa sheet Lenh.giao.hang và DANHMUC đôi chút để minh họa anh xem giúp nhé.

bạn xem thử có vừa ý ko?, ở sheet "lenh giao hang"
 

File đính kèm

bạn xem thử có vừa ý ko?, ở sheet "lenh giao hang"


Cám ơn anh Let'GâuGâu nhiều ạ! em xin nói lại nhé:

* khi gõ ký tự(ví dụ chử a) listbox hiện như thế là đúng rồi.


* Cái chưa đúng:

- khi chọn tên--> enter -->chỉ cần nhập vào cột tên hàng (tức chỉ nhập nguyễn văn an thôi) , các cột còn lại em phải nhập gõ bằng tay.
Ví dụ: em gõ vào texbox tìm nhập tên hàng hóa ở cột tên hàng, các cột còn lại là số lương thùng, số lượng hộp, đương nhiên phải gõ nhập bằng tay.


-Vì vậy khi gõ nhập bằng tay em muốn: sau khi enter nhập xong tên hàng khung chọn ô nó tự nhảy từ cột C (cột tên hàng) ----> cột E(cột kho hàng <=> cột số lượng thùng)ví dụ nhập 1(thùng) --> enter --> khung chọn ô nhảy ngang qua cột F(cột khách hàng <=> cột số lượng hộp)ví dụ nhập 10(hộp) --> enter --> khung chọn ô tự xuống dòng ở cột C -->tự hiện texbox chờ ta gỏ nhập tên hàng kế tiếp -->cột E--> cột F, tức là sau khi xuống dòng lập lại chu kỳ nhập tên hàng, số lượng thùng, số lượng hộp kế tiếp.

Anh sửa lại giúp em nhé.
 
Lần chỉnh sửa cuối:
Em đã sửa lại file ở bài #68 mô tả chi tiết hơn đính kèm vào đây, các anh xem giúp em nhé em rất cám ơn ạ.
 

File đính kèm

Em đã sửa lại file ở bài #68 mô tả chi tiết hơn đính kèm vào đây, các anh xem giúp em nhé em rất cám ơn ạ.

lúc đầu tôi nghĩ nó đơn giản chỉ là offset, nhưng khi làm thì mới thấy khó.
tôi có đem vấn đề của bạn hỏi ở đây
http://www.giaiphapexcel.com/forum/showthread.php?85576-Chuyên-mục-xử-lý-gỡ-rối-code-VBA/page10
có được 2 vị Hoang Trong Nghia và ThanhLanh tra lời, bạn tham khảo thêm.
từ các góp ý của các anh ấy tôi thử làm như trong file,
nhưng bạn fải đảm bảo là kết thúc bằng phím Enter nha, dùng mũi tên phải hoặc tab sẽ ko đúng
 

File đính kèm

Lần chỉnh sửa cuối:
lúc đầu tôi nghĩ nó đơn giản chỉ là offset, nhưng khi làm thì mới thấy khó.
tôi có đem vấn đề của bạn hỏi ở đây
http://www.giaiphapexcel.com/forum/showthread.php?85576-Chuyên-mục-xử-lý-gỡ-rối-code-VBA/page10
có được 2 vị Hoang Trong Nghia và ThanhLanh tra lời, bạn tham khảo thêm.
từ các góp ý của các anh ấy tôi thử làm như trong file,
nhưng bạn fải đảm bảo là kết thúc bằng phím Enter nha, dùng mũi tên phải hoặc tab sẽ ko đúng

Em cám ơn anh Let'GâuGâu rất nhiệt tình giúp em , nhưng rất tiếc file anh làm chưa đúng ý em, hiện tại em còn bận việc, xong việc em sẻ trình bài tường tận file em yêu cầu đã làm được gì, chưa làm được gì ,công dụng của những yêu cầu đó để anh và các anh chị khác muốn giúp mới hiểu rỏ và giúp chính xác hơn. Xin cám ơn tất cả anh chị nhé!
 
Em cám ơn anh Let'GâuGâu rất nhiệt tình giúp em , nhưng rất tiếc file anh làm chưa đúng ý em, hiện tại em còn bận việc, xong việc em sẻ trình bài tường tận file em yêu cầu đã làm được gì, chưa làm được gì ,công dụng của những yêu cầu đó để anh và các anh chị khác muốn giúp mới hiểu rỏ và giúp chính xác hơn. Xin cám ơn tất cả anh chị nhé!

Em đã chỉnh sửa lại chi tiết hơn nhờ các anh xem giúp em nhé.
 

File đính kèm

Chào các anh! em xin hỏi ở bài #69 file Listbox.rar

2.Em nhờ anh giúp em chỉnh lại cái listbox sao cho khi hiện ra có thêm mấy cột kế tiếp, lưu ý chỉ hiện view ra để xem thêm thôi còn mọi cái khác không có gì thay đổi. Em lấy file củ sửa sheet Lenh.giao.hang và DANHMUC đôi chút để minh họa anh xem giúp nhé.

bạn xem thử có vừa ý ko?, ở sheet "lenh giao hang"

Cái sub loc em muốn nó hiển thị từ cột thứ tư đến thứ 7 nên em sữa thành như vầy

Mã:
Sub loc()Dim dl(), i As Long, c As Byte
dl = danhsach.[A4:G3000].Value
ActiveSheet.ListBox1.Clear
For i = 1 To UBound(dl)
   If dl(i, 1) <> "" Then
      If LCase(dl(i, 1)) Like "*" & LCase(ActiveSheet.TextBox1.Value) & "*" Then
         With ActiveSheet.ListBox1
            .AddItem dl(i, 1)
            .List(.ListCount - 1, 3) = dl(i, 4)
            .List(.ListCount - 1, 4) = dl(i, 5)
            .List(.ListCount - 1, 5) = dl(i, 6)
            [COLOR=#0000ff].List(.ListCount - 1, 6)[/COLOR] = dl(i, [B][COLOR=#ff0000]7[/COLOR][/B])
          End With
      End If
   End If
Next
End Sub

Cho nên em gặp lỗi ở dòng màu xanh .List(.ListCount - 1, 6)= dl(i, 7) khi gỏ tăng đến số 7 (bôi màu đỏ), vì thế không thể hiện ra cột thứ 7, như vậy có phải em làm sai hay lại là hạn chế nữa phải không hả anh ?
 
Lần chỉnh sửa cuối:
Mến chào anh Trọng Nghĩa! Lúc này anh vẫn khỏe chứ ? thời gian qua cái addin TimTenTool ở bài #43 của anh làm chạy rất tốt. Do có thêm chút nhu cầu mới là khi list hiện ra có thêm 4 cột rồi khi tìm thấy tên ---> enter---> khung chọn ô chọn cả đoạn 5 ô( thay vì chỉ 1 ô như ở addin TimTenTool #43) em đã mày mò mãi mà không làm được.

Em đã thêm Resize(, 4) vào FindRange.Value cũng không xong nay xin nhờ anh giúp em thêm 1 lần nhé ,em có trình bài chi tiết trong file mong anh giúp em nhé em rất cám ơn anh.
 

File đính kèm

Lần chỉnh sửa cuối:
Mến chào anh Trọng Nghĩa! Lúc này anh vẫn khỏe chứ ? thời gian qua cái addin TimTenTool ở bài #43 của anh làm chạy rất tốt. Do có thêm chút nhu cầu mới là khi list hiện ra có thêm 4 cột rồi khi tìm thấy tên ---> enter---> khung chọn ô chọn cả đoạn 5 ô( thay vì chỉ 1 ô như ở addin TimTenTool #43) em đã mày mò mãi mà không làm được.

Em đã thêm Resize(, 4) vào FindRange.Value cũng không xong nay xin nhờ anh giúp em thêm 1 lần nhé ,em có trình bài chi tiết trong file mong anh giúp em nhé em rất cám ơn anh.
Bạn phải sửa như thế này:

Set FindRange = Range(Rng, Cells(65536, c).End(xlUp)).Resize(, 5)

Sau đó kéo form cho chiều cao giản cao ra để thấy combobox. Chọn thuộc tính của combobox tại mục:

+ ColumnCount là: 5

+ ColumnWidths: 162 pt;72 pt;72 pt;72 pt

+ ListWidth: 450

Thế là xong.
 
Bạn phải sửa như thế này:

Set FindRange = Range(Rng, Cells(65536, c).End(xlUp)).Resize(, 5)

Sau đó kéo form cho chiều cao giản cao ra để thấy combobox. Chọn thuộc tính của combobox tại mục:

+ ColumnCount là: 5

+ ColumnWidths: 162 pt;72 pt;72 pt;72 pt

+ ListWidth: 450

Thế là xong.

Cám ơn anh Trọng Nghĩa nhiều ạ, theo hướng dẫn của anh em làm được rồi còn yêu cầu thứ 2 khung chọn ô chọn cả đoạn 5 ô có làm được luôn không anh ?
 
Cám ơn anh Trọng Nghĩa nhiều ạ, theo hướng dẫn của anh em làm được rồi còn yêu cầu thứ 2 khung chọn ô chọn cả đoạn 5 ô có làm được luôn không anh ?
Tại sự kiện KeyUp, bạn sửa thành:

FindRange.Find(.Text, LookIn:=xlValues, LookAt:=xlWhole).Resize(, 5).Select
 
Tại sự kiện KeyUp, bạn sửa thành:

FindRange.Find(.Text, LookIn:=xlValues, LookAt:=xlWhole).Resize(, 5).Select


:clap:Ôi mừng quá ! Anh Trọng Nghĩa giỏi thật anh chỉ dẫn rất hay rất gọn em làm được ngay, không có anh em lọ mọ loay hoay mải vẫn không biết làm thế nào. Cám ơn anh nhiều lắm nhe.
 

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

Back
Top Bottom