Sort Item trong ComboBox và ListBox

Thảo luận trong 'Ứng dụng Excel' bắt đầu bởi adam_tran, 17 Tháng tư 2006.

12,201 lượt xem

  1. adam_tran

    adam_tran Steel Partner

    Bài viết:
    1,373
    Đã được thích:
    32
    Nơi ở:
    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ì?
     
    #1
  2. Đào Việt Cường

    Đào Việt Cường Moderator

    Bài viết:
    400
    Đã được thích:
    3
    Giới tính:
    Nam
    Nơi ở:
    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:
    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!
     
    #2
  3. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Dễ nhất là bạn tạo một Macro Sort cái List mà bạn đặt trong Listbox/ComboBox.
    If Obj.Listindex<0 then
    MsgBox "Xin hãy chọn đối tượng!"
    Exit Sub
    End if

    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.
     
    #3
  4. adam_tran

    adam_tran Steel Partner

    Bài viết:
    1,373
    Đã được thích:
    32
    Nơi ở:
    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
     
    #4
  5. Đào Việt Cường

    Đào Việt Cường Moderator

    Bài viết:
    400
    Đã được thích:
    3
    Giới tính:
    Nam
    Nơi ở:
    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?
     
    #5
  6. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Đúng rồi và trước phải có lệnh tiền đề là
    ListBox1.MultiSelect = fmMultiSelectMulti
     
    #6
  7. hai2hai

    hai2hai VNUNI Makes a difference

    Bài viết:
    2,012
    Đã được thích:
    128
    Nơi ở:
    Hà nội
    "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.
     
    Last edited: 20 Tháng tư 2006
    #7
  8. adam_tran

    adam_tran Steel Partner

    Bài viết:
    1,373
    Đã được thích:
    32
    Nơi ở:
    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!
     
    #8
  9. Đào Việt Cường

    Đào Việt Cường Moderator

    Bài viết:
    400
    Đã được thích:
    3
    Giới tính:
    Nam
    Nơi ở:
    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ỉ!
     
    #9
  10. hai2hai

    hai2hai VNUNI Makes a difference

    Bài viết:
    2,012
    Đã được thích:
    128
    Nơi ở:
    Hà nội
    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.

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

Chia sẻ trang này