Hỗ trợ viết code ComboBox tùy chọn (1 người xem)

Liên hệ QC

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

tuanhuycntt

Thành viên chính thức
Tham gia
5/7/15
Bài viết
65
Được thích
5
Em muốn tạo 1 ComboBox tùy chọn 1 danh sách không có trên bảng tính . Em nghĩ là phải thiết kết từ code VBA và gán Marco vào ComboBox nhưng chưa tìm được giải thuật cụ thể.
Các bác cho em xin ý tưởng với ạ.
 
Em muốn tạo 1 ComboBox tùy chọn 1 danh sách không có trên bảng tính . Em nghĩ là phải thiết kết từ code VBA và gán Marco vào ComboBox nhưng chưa tìm được giải thuật cụ thể.
Các bác cho em xin ý tưởng với ạ.
Muốn giúp phải có file mẫu mới được bạn nhé.
 
Upvote 0
Em muốn tạo 1 ComboBox tùy chọn 1 danh sách không có trên bảng tính . Em nghĩ là phải thiết kết từ code VBA và gán Marco vào ComboBox nhưng chưa tìm được giải thuật cụ thể.
Các bác cho em xin ý tưởng với ạ.
Góp ý cho bạn:
Muốn làm cái gì thì cũng nên đính kèm File với 1 sheet theo dõi (với tiêu đề đầy đủ và 1 ít dữ liệu), dữ liệu có thể là giả định, 1 sheet danh sách cần lấy vào ComboBox.
Chứ nêu vấn đề khơi khơi thì chẳng có thành viên nào giúp đươc.
 
Upvote 0
Vậy danh sách ấy có.. ở đâu?
Danh sách đó và em tự nhập trong công thức.

VD như là các danh sách đó nằm trong 1 mảng

PHP:
Arr = Array("a", "b", "c", "d")

Khi ấn vào ComboBox tự hiển thị các giá trị "a", "b", "c", "d" để lựa chọn

@giaiphap
@be09

E đang cần 1 chức năng cho ComboBox như vậy bác ạ. VD như trong file Attach bác xem giúp em xem cách làm như thế nào cho nó đúng ạ
 

File đính kèm

Upvote 0
Em insert ComboBox ở dạng Form Controls sau khi gán Array vào thì nó báo lỗi
Còn insert ở dạng ActiveX Controls thì câu lệnh đã thực hiện được rồi ạ

Anh/Chị có thể giải thích giúp em về 2 dạng đó được không ạ. Khi nào thì dùng dạng nào khi nào dùng dạng kia

PHP:
Private Sub ComboBox1_Change()
    ComboBox1.List = Array("a", "b", "c", "d")
End Sub

Và giờ e muốn lấy giá trị của ComboBox đó để liên kết sử dụng cho công thức khác thì làm như thế nào ạ.

VD như bài trên là sau khi chọn loại hàng xong thì các range ("A6:E23") ở bên dưới sẽ tự động lọc in ra kèm theo đó là khung của ô tự động co lại
 
Lần chỉnh sửa cuối:
Upvote 0
mình làm dropbox, nhưng có 100 sản phảm thì tìm rất mất thời gian. có cách nào để mình gõ chữ cái đầu nó hiện ra các dòng có liên quan ko vậy mọi người
 
Upvote 0
Em insert ComboBox ở dạng Form Controls sau khi gán Array vào thì nó báo lỗi
Còn insert ở dạng ActiveX Controls thì câu lệnh đã thực hiện được rồi ạ

Anh/Chị có thể giải thích giúp em về 2 dạng đó được không ạ. Khi nào thì dùng dạng nào khi nào dùng dạng kia

PHP:
Private Sub ComboBox1_Change()
    ComboBox1.List = Array("a", "b", "c", "d")
End Sub

Và giờ e muốn lấy giá trị của ComboBox đó để liên kết sử dụng cho công thức khác thì làm như thế nào ạ.

VD như bài trên là sau khi chọn loại hàng xong thì các range ("A6:E23") ở bên dưới sẽ tự động lọc in ra kèm theo đó là khung của ô tự động co lại
Đối với object thuộc Form Controls bạn không làm vậy được! Cụ thể với ComboBox trong file của bạn, ta phải làm thế này:
1> Tạo 1 module với code:
Mã:
Sub CreateCboList()
  Dim drp As DropDown
  Set drp = Sheet1.DropDowns("Drop Down 1")
  drp.List = Array("a", "b", "c", "d")
End Sub
Hoặc ngắn gọn:
Mã:
Sub CreateCboList()
  Sheet1.DropDowns("Drop Down 1").List = Array("a", "b", "c", "d")
End Sub
Trong đó cái tên "Drop Down 1" là tên mà bạn nhìn thấy trong hộp Name box (khi click chọn vào ComboBox)

Capture.JPG

2> Tiếp theo chạy sub trên rồi ra ngoài bảng tính, kiểm tra combobox sẽ thấy list đã được thêm vào
----------------------
Trong 2 cách viết code, tôi thích cách ở trên hơn, vì khi bạn khai báo drp as DropDown xong, lúc gõ drp và dấu chấm.... ngay sau dấu chấm bạn sẽ nhìn thấy tooltip xổ xuống gợi ý các thuộc tính và phương thức. Như vậy sẽ đở mất công thuộc lòng

Untitled.jpg
 
Upvote 0
Đối với object thuộc Form Controls bạn không làm vậy được! Cụ thể với ComboBox trong file của bạn, ta phải làm thế này:
1> Tạo 1 module với code:
Mã:
Sub CreateCboList()
  Dim drp As DropDown
  Set drp = Sheet1.DropDowns("Drop Down 1")
  drp.List = Array("a", "b", "c", "d")
End Sub
Hoặc ngắn gọn:
Mã:
Sub CreateCboList()
  Sheet1.DropDowns("Drop Down 1").List = Array("a", "b", "c", "d")
End Sub
Trong đó cái tên "Drop Down 1" là tên mà bạn nhìn thấy trong hộp Name box (khi click chọn vào ComboBox)

View attachment 181499

2> Tiếp theo chạy sub trên rồi ra ngoài bảng tính, kiểm tra combobox sẽ thấy list đã được thêm vào
----------------------
Trong 2 cách viết code, tôi thích cách ở trên hơn, vì khi bạn khai báo drp as DropDown xong, lúc gõ drp và dấu chấm.... ngay sau dấu chấm bạn sẽ nhìn thấy tooltip xổ xuống gợi ý các thuộc tính và phương thức. Như vậy sẽ đở mất công thuộc lòng

View attachment 181500
Bác quá siêu. E quá phục bác luôn :)

bác cho e hỏi giờ muốn lấy giá trị trong mảng đó và kiểm tra điều kiện và lọc với mảng bên dưới để in danh sách thì phải khai báo kiểu gì để lấy được ra ạ. Em chưa kiểu rõ lắm
 
Upvote 0
Bác quá siêu. E quá phục bác luôn :)

bác cho e hỏi giờ muốn lấy giá trị trong mảng đó và kiểm tra điều kiện và lọc với mảng bên dưới để in danh sách thì phải khai báo kiểu gì để lấy được ra ạ. Em chưa kiểu rõ lắm
Làm như sau:
1> Cho toàn bộ code dưới đây vào 1 module:
Mã:
Public drp As DropDown
Private Sub Auto_Open()
  Set drp = Sheet1.DropDowns("Drop Down 1")
  CreateCboList
End Sub
Private Sub CreateCboList()
  drp.List = Array("*", "a", "b", "c", "d")
End Sub
Sub CboFilter()
  If drp Is Nothing Then Auto_Open
  Dim sFilter As String, rng As Range
  Set rng = Sheet1.Range("A5", Sheet1.Range("E60000").End(xlUp))
  sFilter = drp.List(drp.Value)
  If sFilter = "*" Then
    rng.AutoFilter 3
  Else
    rng.AutoFilter 3, sFilter
  End If
End Sub
2> Ra ngoài bảng tính, click phải chuột vào ComboBox, chọn Assign Macro, chọn macro name "CboFilter" rồi bấm OK
3> Tiếp theo, đóng vào lưu file
4> Mở lại file (đương nhiên phải Enable Macro) và... trải nghiệm
 
Upvote 0
Mã:
 Public drp As DropDown
Khai báo cái này có phải là khai báo biến này dùng chung trong toàn Marco đó phải không ạ?

Mã:
If sFilter = "*" Then
   rng.AutoFilter 3
  Else
   rng.AutoFilter 3, sFilter
  End If
Em chưa hiểu đoạn code này lắm ạ. AutoFiter 3 tức là chức năng Unique Record Ony phải không anh? Em chưa hiểu chức năng đó
 
Upvote 0
Mã:
 Public drp As DropDown
Khai báo cái này có phải là khai báo biến này dùng chung trong toàn Marco đó phải không ạ?
Đúng là như vậy! Vì các sub điều có dùng đến biến drp nên khai báo chung 1 lần luôn
Mã:
If sFilter = "*" Then
   rng.AutoFilter 3
  Else
   rng.AutoFilter 3, sFilter
  End If
Em chưa hiểu đoạn code này lắm ạ. AutoFiter 3 tức là chức năng Unique Record Ony phải không anh? Em chưa hiểu chức năng đó
AutoFilter 3 nghĩa là ShowAll dữ liệu tại cột 3 ấy mà
 
Upvote 0
mình làm dropbox, nhưng có 100 sản phảm thì tìm rất mất thời gian. có cách nào để mình gõ chữ cái đầu nó hiện ra các dòng có liên quan ko vậy mọi người
Theo tôi hiểu là bạn muốn tìm 1 loại vật tư (ví dụ: xi măng có nhiều loại và nhiều giá) để chọn áp giá và nhập liệu cho nhanh.
Nếu đúng vậy thì nên dùng UserForm thì sẽ hiệu quả hơn
 
Upvote 0
Theo tôi hiểu là bạn muốn tìm 1 loại vật tư (ví dụ: xi măng có nhiều loại và nhiều giá) để chọn áp giá và nhập liệu cho nhanh.
Nếu đúng vậy thì nên dùng UserForm thì sẽ hiệu quả hơn
ý của bác nói có phải giống như trong video này hướng dẫn không ạ?
 
Upvote 0
PHP:
Private Sub CreateCboList()
  drp.List = Array("*", "a", "b", "c", "d")
End Sub
Bác NDU cho em hỏi chút là với trường hợp các biến ở trong mảng khá nhiều và không muốn viết nó ra 1 vùng dữ liệu trong bảng tính thì kết với giữa việc nhập biến với vòng lặp for để thêm giá trị trong biến được không ạ?

VD: Array gồm các giá trị: *, A1, A2, ..... A20
 
Upvote 0
PHP:
Sub Array()

Dim Arr1(21)

Dim i  As Integer
   Arr(1)="*"
    For i = 1 To 20

        Arr(i+1) = "A" & i

    Next i
End Sub
Bác xem giúp em. Em code ntn liệu có tối ưu không ạ.
 
Upvote 0
Theo tôi hiểu là bạn muốn tìm 1 loại vật tư (ví dụ: xi măng có nhiều loại và nhiều giá) để chọn áp giá và nhập liệu cho nhanh.
Nếu đúng vậy thì nên dùng UserForm thì sẽ hiệu quả hơn
thay vì mình muốn tìm xi măng mình phải kéo từ A -> X. bây giờ mình nhập X thì nó sổ ra tòan bộ những sản phẩm có từ X
 
Upvote 0
Mình nghĩ là cái này đúng là cái mình cần. Cám ơn bạn. Nếu nội dung cần tìm mình để ở sheet khác thì mình viết code như thế nào
Nội dung cần tìm ở sheet khác? Vậy khi bạn đứng tại sheet này và gõ thì làm cách nào bạn nhìn thấy cái sheet khác ấy có thay đổi?
 
Upvote 0
Các bác cho e hỏi tý. Em đang muốn làm 1 chương trình quản lý cửa hàng tạp hóa nhà e. nhu cầu là: nhập hàng thì hàng cộng dồn vào kho, khi bán thì hàng tự trừ trong kho. in hóa đơn khi bán hàng. quản lý 1 mặt hàng theo nhiều quy cách đóng gói. có ai biết hương dẫn e với a
 
Upvote 0
Mình nghĩ là cái này đúng là cái mình cần. Cám ơn bạn. Nếu nội dung cần tìm mình để ở sheet khác thì mình viết code như thế nào

Chuyển qua dùng vba với lọc nâng cao, cách đơn giản nhất rồi đó. Nếu không biết viết code thì dùng cái trong video này,
 
Upvote 0
Làm như sau:
1> Cho toàn bộ code dưới đây vào 1 module:
Mã:
Public drp As DropDown
Private Sub Auto_Open()
  Set drp = Sheet1.DropDowns("Drop Down 1")
  CreateCboList
End Sub
Private Sub CreateCboList()
  drp.List = Array("*", "a", "b", "c", "d")
End Sub
Sub CboFilter()
  If drp Is Nothing Then Auto_Open
  Dim sFilter As String, rng As Range
  Set rng = Sheet1.Range("A5", Sheet1.Range("E60000").End(xlUp))
  sFilter = drp.List(drp.Value)
  If sFilter = "*" Then
    rng.AutoFilter 3
  Else
    rng.AutoFilter 3, sFilter
  End If
End Sub
2> Ra ngoài bảng tính, click phải chuột vào ComboBox, chọn Assign Macro, chọn macro name "CboFilter" rồi bấm OK
3> Tiếp theo, đóng vào lưu file
4> Mở lại file (đương nhiên phải Enable Macro) và... trải nghiệm


Bác NDU xem giúp em code này bị lỗi ntn với ạ. E thay đổi 1 chút code của bác vì muốn thêm dữ liệu động từ 1 vùng dữ liệu nên AddItem trực tiếp vào ComboBox. Giờ Filter nó cứ báo dòng
Mã:
sFilter = drp.List(drp.Value)

PHP:
Public DD As DropDown              'DD: bien duoc dung chung cho ca Modules'

Private Sub Auto_Open()
    Set DD = Sheet1.DropDowns("Drop Down 1")
    CreateCboList
End Sub

Private Sub CreateCboList()             

        DD.RemoveAllItems
    DD.AddItem ("*")
    For i = 2 To 23
        a = i-1
        tCell = Sheet2.Range("B" & a).Value
        If Len(tCell) > 0 Then
            DD.AddItem (tCell)
        End If
    Next i
End Sub

Sub CboFilter()       

 
        Auto_Open
        Dim sFilter As String, Rng As Range      
 
       Set Rng = Sheet1.Range("A5", Sheet1.Range("E60000").End(xlUp))
        sFilter = DD.List(DD.Value)
        If sFilter = "*" Then
            Rng.AutoFilter 3
        Else
        Rng.AutoFilter 3, sFilter
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bác NDU xem giúp em code này bị lỗi ntn với ạ. E thay đổi 1 chút code của bác vì muốn thêm dữ liệu động từ 1 vùng dữ liệu nên AddItem trực tiếp vào ComboBox. Giờ Filter nó cứ báo dòng
Mã:
sFilter = drp.List(drp.Value)

PHP:
Public DD As DropDown              'DD: bien duoc dung chung cho ca Modules'

Private Sub Auto_Open()
    Set DD = Sheet1.DropDowns("Drop Down 1")
    CreateCboList
End Sub

Private Sub CreateCboList()            

        DD.RemoveAllItems
    DD.AddItem ("*")
    For i = 2 To 23
        a = i-1
        tCell = Sheet2.Range("B" & a).Value
        If Len(tCell) > 0 Then
            DD.AddItem (tCell)
        End If
    Next i
End Sub

Sub CboFilter()      

 
        Auto_Open
        Dim sFilter As String, Rng As Range     
 
       Set Rng = Sheet1.Range("A5", Sheet1.Range("E60000").End(xlUp))
        sFilter = DD.List(DD.Value)
        If sFilter = "*" Then
            Rng.AutoFilter 3
        Else
        Rng.AutoFilter 3, sFilter
    End If
End Sub
Bạn sửa sao cũng phải đưa file lên đây! Tôi không rảnh để giả lập dữ liệu rồi test giúp đâu
 
Upvote 0

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

Back
Top Bottom