Sort Item trong ComboBox và ListBox

  • Thread starter adam_tran
  • Ngày gửi
adam_tran

adam_tran

Guitar inspiration
17/5/05
1,374
36
48
46
Goooogle
1. Các anh chị cho em hỏi làm thế nào để sort các item trong Listbox hay Combobox theo thứ tự ABC, cách nào đơn giản nhất. Nếu dùng qua 1 Array thì phiền phức quá, vì ListBox em dùng có hơn 1 cột.
2. Cách nào để kiểm tra Listbox, ComboBox chưa được chọn, thí dụ khi chưa chọn 1 giá trị trong ListBox, nhưng reffer thuộc tính ListBox.Value thì nó sẽ báo lỗi.
3. Thuộc tính Selected của ListBox-ComBoBox có nghĩa là gì?
 
Khóa học Quản trị dòng tiền
Đào Việt Cường

Đào Việt Cường

Moderator
22/11/05
400
4
18
Khánh Hòa
Dear adam_tran
---------------
Em thấy bác có vẻ không thích chị VBA Assistant nhỉ! Các thắc mắc của bác đều được chị ấy hướng dẫn rất tỉ mỉ đây này:
VBA Assistant nói:
object.Selected( index ) [= Boolean]
Returns or sets the selection state of items in a ListBox
The Selected property is useful when users can make multiple selections. You can use this property to determine the selected rows in a multi-select list box. You can also use this property to select or deselect rows in a list from code.
Vì ở đây bác làm việc với VBA nên theo em bác nên để dữ liệu trên bảng tính, sắp xếp có rồi AddItem vào ListBox/ComboBox. Trong VBA các điều khiển thuộc thư viện Microsoft Form 2.0 Object Library (FM20.DLL) không có thuộc tính Sort. Nếu bác muốn sử dụng mã lệnh để sắp xếp các Item trong ListBox/ComboBox có thể bác phải tìm hiểu một vài AxtiveX Control (*.OCX) chuyên làm việc này (như TrueDBGRID)
Còn về việc kiểm tra List có được chọn hay không, bác chỉ cần xét thuộc tính ListIndex có bằng -1 không:
IF ListBox.ListIndex= -1 Then Debug.Print "Chưa có Item nào được chọn"
Còn việc kiểm tra Item nào được chọn thì:
- Với ComboBox:
IF ComboBox.ListIndex= 0 Then Debug.Print "Item đầu tiên được chọn"
- Với ListBox:
IF ListBox.ListIndex= 0 Then Debug.Print "Item đầu tiên được chọn"
hoặc
IF ListBox.Selected(0) Then Debug.Print "Item đầu tiên được chọn"
Chúc bác thành công!
 
T

Tuanktcdcn

Lão già ham vui
18/6/04
549
52
28
47
Hà Nội
www.bluesofts.net
adam_tran nói:
1. Các anh chị cho em hỏi làm thế nào để sort các item trong Listbox hay Combobox theo thứ tự ABC, cách nào đơn giản nhất. Nếu dùng qua 1 Array thì phiền phức quá, vì ListBox em dùng có hơn 1 cột.
Dễ nhất là bạn tạo một Macro Sort cái List mà bạn đặt trong Listbox/ComboBox.
adam_tran nói:
2. Cách nào để kiểm tra Listbox, ComboBox chưa được chọn, thí dụ khi chưa chọn 1 giá trị trong ListBox, nhưng reffer thuộc tính ListBox.Value thì nó sẽ báo lỗi.
If Obj.Listindex<0 then
MsgBox "Xin hãy chọn đối tượng!"
Exit Sub
End if

adam_tran nói:
3. Thuộc tính Selected của ListBox-ComBoBox có nghĩa là gì?
Kiểm tra xem có item nào trong list được chọn không (Obj.Selected=True). Chi tiết Mr Cường đã nói ở trên.
 
adam_tran

adam_tran

Guitar inspiration
17/5/05
1,374
36
48
46
Goooogle
Thanks các sư huynh! Đoạn mã sau dùng để chuyển các Item từ 2 list, thí dụ 1 List là danh mục TK, 1 list là DM tài khoản được chọn cần để in.

For i = 0 to Obj.ListCount - 1
if Obj.Selected(i) then
Obj2.AddItem Obj.List(i)
Obj.RemoveItem(i)
Next
 
Đào Việt Cường

Đào Việt Cường

Moderator
22/11/05
400
4
18
Khánh Hòa
Dear all,
--------
Cụ thể hoá cái Obj với thuộc tính Selected của các bác, em cho rằng nó chính là ListBox. Thuộc tính này một lần nữa lại cho thấy sự khác biệt giữa ListBoxComboBox.
Hiểu theo nghĩa ứng dụng thì tại một thời điểm, ComboBox chỉ cho phép người dùng chọn duy nhất một đối tượng và đưa vào phần TextBox (chúng ta hiểu ComboBox gồm 3 thành phần). Còn ListBox lại cho phép người sử dụng "select" cùng lúc nhiều Item (users can make multiple selections).
Vì vậy có thể nói Obj trong đoạn mã lệnh của bác adam_tran chính là một ListBox chứ không thể là ComboBox(!?)
Em hiểu thế đúng hay sai?
 
T

Tuanktcdcn

Lão già ham vui
18/6/04
549
52
28
47
Hà Nội
www.bluesofts.net
Đào Việt Cường nói:
Dear all,
--------
...trong đoạn mã lệnh của bác adam_tran chính là một ListBox chứ không thể là ComboBox(!?)
Em hiểu thế đúng hay sai?

Đúng rồi và trước phải có lệnh tiền đề là
ListBox1.MultiSelect = fmMultiSelectMulti
 
hai2hai

hai2hai

VNUNI Makes a difference
29/4/04
2,032
125
63
50
Hà nội
vnuni.net
adam_tran nói:
Thanks các sư huynh! Đoạn mã sau dùng để chuyển các Item từ 2 list, thí dụ 1 List là danh mục TK, 1 list là DM tài khoản được chọn cần để in.

For i = 0 to Obj.ListCount - 1
if Obj.Selected(i) then
Obj2.AddItem Obj.List(i)
Obj.RemoveItem(i)
Next

Vì vậy có thể nói Obj trong đoạn mã lệnh của bác adam_tran chính là một ListBox chứ không thể là ComboBox(!?)
Em hiểu thế đúng hay sai?
"Obj" nên đổi là olstUsers (hay olstAccount gì đó) hoặc clstUsers (o = object; c = control; lst = listbox; Users, Account - phần tên của biến, tùy theo tên đối tượng mà đặt cái tên cho rõ nghĩa). Như thế chẳng còn ai thắc mắc được nữa. Nếu trong project mà có hàng nghìn forms, modules, classes (dĩ nhiên chia thành projects nhỏ) thì cứ Obj, ListBox1.... như thế có mà loạn. Nếu ko người khác đọc vào ko hiểu, 3 tháng sau chính mình đọc lại cũng chịu (trừ dự án quá nhỏ).

Sau khi đã học mấy cái "ngữ nghĩa" trong lập trình VB rồi thì phải chuyển đến chuyện học viết sao cho sáng sủa và chuyên nghiệp.
 
Sửa lần cuối:
adam_tran

adam_tran

Guitar inspiration
17/5/05
1,374
36
48
46
Goooogle
Đúng là 2 Listbox trên 1 form cùng với các Button Add, AddAll, Remove và RemoveAll.
Thuộc tính MultiSelected thì đã set khi design rồi.
Đúng là chỉ cần đọc Help là giải quyết được nhiều chuyện, nhưng đôi lúc không được tập trung lắm thành ra không tìm ra được cái cần tìm vì Help nó cho ra nhiều thứ quá.
Thank for All!
 
Đào Việt Cường

Đào Việt Cường

Moderator
22/11/05
400
4
18
Khánh Hòa
Dear hai2hai,
------------
Em thì lại hiểu Obj của các bác í là một đối tượng tượng trưng cho cả LisBox và ComboBox. Nghĩa là đoạn code này chưa thể chạy được ngay mà chỉ diễn giải một thủ tục muốn minh hoạ cho cả ListBox và ComboBox. Nếu hiểu như vậy là sai nên muốn phân biệt cho những mới tiếp cận VBA khỏi bị nhầm. Bác TuanKTCDCN cũng đã công nhận thế và còn bổ sung một thi hành rất quan trọng:
ListBox1.MultiSelect = fmMultiSelectMulti
Nếu thuộc tính MultiSelect không được thiết lập là fmMultiSelectMulti hoặc fmMultiSelectExtenden (cho phép lựa chọn nhiều Item) thì thủ tục thi hành bên dưới không chính xác, có thể Runtime Error(?)
Tìm hiểu về hai điều khiển này thật nhiều thứ đáng để bàn quá bác nhỉ!
 
hai2hai

hai2hai

VNUNI Makes a difference
29/4/04
2,032
125
63
50
Hà nội
vnuni.net
Đào Việt Cường nói:
Dear hai2hai,
------------
Em thì lại hiểu Obj của các bác í là một đối tượng tượng trưng cho cả LisBox và ComboBox. Nghĩa là đoạn code này chưa thể chạy được ngay mà chỉ diễn giải một thủ tục muốn minh hoạ cho cả ListBox và ComboBox. Nếu hiểu như vậy là sai nên muốn phân biệt cho những mới tiếp cận VBA khỏi bị nhầm.

Nếu viết là olstObjectName thì hầu như ai cũng hiểu là Listbox object. Đó là coding conventions rồi. Nếu mà ko rõ và nhầm sang Combobox obj thì .... thôi đành chịu vậy. :). Anh đang nhấn mạnh chuyện coding convension hơn là chuyện có set cái propery multiselect gì đó lúc runtime hay design time và chuyện runtimetime error.

Đào Việt Cường nói:
Tìm hiểu về hai điều khiển này thật nhiều thứ đáng để bàn quá bác nhỉ!

"Điều khiển" ở đây nghĩa là gì hả Cường? có phải là control ko? :)
 

Xem nhiều

Webketoan Zalo OA