[UserForm]Listbox

Euler

Mod
Thành viên BQT
Bài học lần trước tôi đã giới thiệu với các bạn về
Bài học lần này tôi sẽ giới thiệu với các bạn về ListBox.
Bạn cần đăng nhập để thấy hình ảnh

Đầu tiên, chúng ta sử dụng listbox để làm gì? Listbox dùng để hiển thị một list danh sách, ví dụ list danh sách file.
Hoặc là list danh sách các từ-nếu bạn dự định làm một từ điển bằng excel.
Để cho dữ liệu vào Listbox, chúng ta cũng sử dụng phương thức AddItem mà chúng ta đã từng gặp khi học về Combobox.
Mã:
ListBox.AddItem data_muốn_thêm_vào, vị_trí_hiển_thị_trên_list_box
Tham số thứ hai (vị_trí_hiển_thị_trên_list_box) có thể giản lược đi bằng cách để trống. Thực tế là chúng ta không dùng tới trong quá trình code. Vì vậy bạn cũng không cần phải ghi nhớ.
Chúng ta hãy thử đoạn code sau xem kết quả là gì nhé:
Mã:
Private Sub CommandButton1_Click()
    ListBox1.AddItem "tuhocvba.net"
End Sub
Bạn cần đăng nhập để thấy hình ảnh

Và thử với đoạn code dưới đây xem sự khác biệt ra sao nếu chúng ta can thiệp vào tham số vị trí trong danh sách nhé:
Mã:
Private Sub CommandButton1_Click()
    Dim i As Long 'Kieu so nguyen co pham vi gia tri len toi 2 trieu
    For i = 1 To 10
        ListBox1.AddItem "tuhocvba" & i
    Next i
    ListBox1.AddItem "danhsach", 0
End Sub
Bạn cần đăng nhập để thấy hình ảnh


Tôi hầu như không sử dụng thuộc tính này, nhưng bạn cũng cần biết là với thuộc tính RowSource , chúng ta có thể nạp dữ liệu từ excel vào listbox.
Ở đây tôi muốn nạp dữ liệu từ hai cột cho nên thuộc tính ColumnCount tôi thiết định là 2.
Bạn cần đăng nhập để thấy hình ảnh


Bây giờ nếu tôi ấn vào nút bấm trên UserForm bạn sẽ thấy là nó bị lỗi như dưới đây:
Bạn cần đăng nhập để thấy hình ảnh


Có nghĩa là nếu bạn sử dụng thuộc tính RowSource thì bạn không thể dùng phương thức AddItem để thêm data vào listbox được nữa. Hãy nhớ điều này.

Bây giờ bạn hãy xóa các thiết định RowSource và ColumnCount ở trên đi. Chúng ta sửa lại code của nút bấm như dưới đây và xem kết quả:
Mã:
Private Sub CommandButton1_Click()
    ListBox1.ColumnCount = 2
    ListBox1.List = Sheets(2).Range("A2:B6").Value
    MsgBox "so luong data la:" & ListBox1.ListCount
End Sub
Bạn cần đăng nhập để thấy hình ảnh


Nguồn tham khảo:
Mã:
http://officetanaka.net/excel/vba/tips/tips137.htm
 

vbano1

SMod
Thành viên BQT
Đối với listbox, có một thông số hay dùng, đó là chia độ rộng cho nhiều cột.
Mã:
ListBox1.ColumnWidths = "130;60"
Để được kết quả như dưới đây:
Bạn cần đăng nhập để thấy hình ảnh

ta có code như dưới đây:
Mã:
Private Sub CommandButton1_Click()
    ListBox1.ColumnCount = 2
    ListBox1.ColumnWidths = "130;60"
    ListBox1.List = Sheets(1).Range("A2:B6").Value
    MsgBox "so luong data la:" & ListBox1.ListCount
End Sub
Bây giờ ta sẽ can thiệp vào các thuộc tính của Listbox thông qua Initialize Userform:
Mã:
Private Sub UserForm_Initialize()
    ListBox1.ListStyle = fmListStyleOption
    ListBox1.MultiSelect = 0 'Neu la 0 thi select duoc 1 item. Neu la 2 thi select duoc nhieu item
End Sub
Ta sẽ được kết quả như sau:
Bạn cần đăng nhập để thấy hình ảnh

Ta sửa lại 0 thành 2 trong đoạn code trên:
Mã:
ListBox1.MultiSelect = 2
Ta được kết quả như sau:
Bạn cần đăng nhập để thấy hình ảnh

Bây giờ ta hãy kiểm chứng lại:
Giả sử người dùng đã tích chọn một số đối tượng nào đó trên listbox, vậy làm thế nào để xác định được họ đã tích chọn vào đâu? Xin hãy tham khảo đoạn code dưới đây:
Ta sẽ code cho nút bấm thứ hai:
Mã:
Private Sub CommandButton2_Click()
    Dim i As Integer
    Dim s   As String
    
    For i = 0 To ListBox1.ListCount - 1 Step 1
        If ListBox1.Selected(i) = True Then
            s = s & ListBox1.List(i, 0) & ";"
        End If
    Next i
    MsgBox s
    
End Sub
Kết quả:
Bạn cần đăng nhập để thấy hình ảnh

Chú ý đoạn code trên, ta chay i =0 cho nên chỉ chạy tới ListCount-1 chứ không phải chạy tới ListCount. Đây là số item có trong listbox.
Thuộc tính Selected(i) sẽ xác định item(i) trong listbox có được select hay không?
Chú ý rằng listbox của chúng ta có hai cột, bắt đầu từ 0->1.
Cho nên thuộc tính List cũng phải có hai tham số, dòng và cột, cụ thể là dòng i và cột đầu tiên (cột 0): List(i,0).
 

tuhocvba

Administrator
Thành viên BQT
Để điều khiển thanh cuộn bằng chuột giữa, các bạn tham khảo topic này:
 

quốc bình

Thành viên mới
Làm sao để listbox có đường viền cell?
Khi có đường viền nhìn sẽ trực quan hơn ạ
 

tuhocvba

Administrator
Thành viên BQT
ListView thì được nhưng chỉ có trên máy 32bit. Còn ListBox thì không, nhưng máy nào cũng có ListBox.
 

Euler

Mod
Thành viên BQT
@nhocquyvn :Cái bạn hỏi chẳng liên quan gì tới kiến thức Listbox. Bạn nên đặt câu hỏi ở trong Box . Hoặc có thể đặt ở Box .
Nếu bạn quan tâm tới việc làm việc với file excel khác như thế nào thì bạn tham khảo . Với Access thì bạn tham khảo .

Nếu năng lực của bạn không đủ, tức là đọc hai topic trên vẫn không tự ứng dụng được cho bản thân, hãy trao dự án của bạn cho chúng tôi để chúng tôi hoàn thành nó, và bạn hãy trả phí cho chúng tôi như một cách ủng hộ diễn đàn có kinh phí hoạt động.
Chân thành cảm ơn bạn.
 

syquyen1987

Thành viên mới
Đối với listbox, có một thông số hay dùng, đó là chia độ rộng cho nhiều cột.
Mã:
ListBox1.ColumnWidths = "130;60"
Để được kết quả như dưới đây:
Bạn cần đăng nhập để thấy hình ảnh

ta có code như dưới đây:
Mã:
Private Sub CommandButton1_Click()
    ListBox1.ColumnCount = 2
    ListBox1.ColumnWidths = "130;60"
    ListBox1.List = Sheets(1).Range("A2:B6").Value
    MsgBox "so luong data la:" & ListBox1.ListCount
End Sub
Bây giờ ta sẽ can thiệp vào các thuộc tính của Listbox thông qua Initialize Userform:
Mã:
Private Sub UserForm_Initialize()
    ListBox1.ListStyle = fmListStyleOption
    ListBox1.MultiSelect = 0 'Neu la 0 thi select duoc 1 item. Neu la 2 thi select duoc nhieu item
End Sub
Ta sẽ được kết quả như sau:
Bạn cần đăng nhập để thấy hình ảnh

Ta sửa lại 0 thành 2 trong đoạn code trên:
Mã:
ListBox1.MultiSelect = 2
Ta được kết quả như sau:
Bạn cần đăng nhập để thấy hình ảnh

Bây giờ ta hãy kiểm chứng lại:
Giả sử người dùng đã tích chọn một số đối tượng nào đó trên listbox, vậy làm thế nào để xác định được họ đã tích chọn vào đâu? Xin hãy tham khảo đoạn code dưới đây:
Ta sẽ code cho nút bấm thứ hai:
Mã:
Private Sub CommandButton2_Click()
    Dim i As Integer
    Dim s   As String
   
    For i = 0 To ListBox1.ListCount - 1 Step 1
        If ListBox1.Selected(i) = True Then
            s = s & ListBox1.List(i, 0) & ";"
        End If
    Next i
    MsgBox s
   
End Sub
Kết quả:
Bạn cần đăng nhập để thấy hình ảnh

Chú ý đoạn code trên, ta chay i =0 cho nên chỉ chạy tới ListCount-1 chứ không phải chạy tới ListCount. Đây là số item có trong listbox.
Thuộc tính Selected(i) sẽ xác định item(i) trong listbox có được select hay không?
Chú ý rằng listbox của chúng ta có hai cột, bắt đầu từ 0->1.
Cho nên thuộc tính List cũng phải có hai tham số, dòng và cột, cụ thể là dòng i và cột đầu tiên (cột 0): List(i,0).
Cho mình xin hỏi làm thế nào để có tiêu đề cột (ColumnHeads) "Tên" và "Tuổi" trong Listbox ạ.
 

tuhocvba

Administrator
Thành viên BQT
@syquyen1987 : Cấm quote cả bài viết. Chỉ quote câu chữ cần thiết khi trích dẫn.
Trả lời: Dùng Label.
 

Thanhhoai0

Thành viên mới
Mình muốn hiện danh sách dữ liệu lên listbox luôn không cần bấm nút thì mình làm thế nào vậy bạn ??
 

tuhocvba

Administrator
Thành viên BQT
Bạn đọc bài viết #3 ở đây:

Viết thủ tục load dữ liệu đối với sự kiện initialize.
 

Ngày Mới

Thành viên
Nếu muốn thêm tiêu đề lên Listbox thì dữ liệu của bạn buộc phải nạp vào ở dạng RowSource và tiêu đề cột được bật bằng đoạn code
Mã:
Listbox1.ColumnHeads = True
Nếu bạn nạp dữ liệu vào bằng List hay AddItem thì bạn chỉ có cách là thêm các Label phía trên Listbox hoặc tạo thêm một Listbox khác, đặt phía trên Listbox nội dung để làm tiêu đề cho nó.
 
Top