Viết thủ tục Sắp xếp dữ liệu

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

4,535 lượt xem

  1. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Tớ có vấn đề này muốn tham khảo cách làm của mọi người. Đó là thủ tục sắp xếp dữ liệu.

    Level 1
    Sub Sapxep1(Byref MangMotchieu, Optional Byval Tangdan as Boolean=True)
    ....Bạn làm thế nào?
    End Sub


    Áp dụng: Thủ tục Sapxep1 cho phép bạn sắp xếp dữ liệu được đặt trong một mảng một chiều, kết quả thực hiện MangMotchieu được sắp xếp theo chiều tăng dần hoặc giảm dần.

    Cách test, mình viết thủ tục để các bạn test kết quả của Sapxep1
    ==============Test For Sapxep1==============
    Sub TestForSapxep1()
    Const strSheet="Tên sheet để ghi kết quả"
    Dim WS as Worksheet
    Dim MangMotchieu(5)

    MangMotchieu(1)=2
    MangMotchieu(2)=1
    MangMotchieu((3)=6
    MangMotchieu(4)=0
    MangMotchieu(5)=6

    Set WS = Worksheets(strSheet)

    'Sắp xếp tăng dần bằng thủ tục Sapxep1

    Sapxep1 MangMotchieu

    WS.Cells.Clear
    For I=1 to 5
    WS.Cells(I,1).Value=MangMotchieu(I)
    End For

    Set WS = Nothing
    End Sub
    ========================================

    Level 2

    Sub Sapxep2(Byref MangHaichieu, Byaval CotSapxep as Integer, Optional Byval Tangdan as Boolean=True)
    ....Bạn làm thế nào?
    End Sub


    Áp dụng: Một bảng dữ liệu mà các bạn nhìn trên Sheet có thể hiểu nó là khối dữ liệu được đặt trong bảng 2 chiều (Dòng, Cột). Thủ tục Sapxep2 cho phép bạn sắp xếp dữ liệu được đặt trong một mảng hai chiều, kết quả thực hiện MangHaichieu được sắp xếp theo chiều tăng dần hoặc giảm dần theo một cột nào đó.
    Giả sử mình có một bảng Danh mục hàng
    | Mã hàng | Tên hàng | ĐV |
    Cần sắp xếp bảng dữ liệu trên

    Cách test, mình viết thủ tục để các bạn test kết quả của Sapxep2
    ==============Test For Sapxep2==============
    Sub TestForSapxep2()
    Const nCotSapxep=2
    Const strSheet="Tên sheet để ghi kết quả"
    Dim WS as Worksheet
    Dim MangHaichieu(5,3) '5 dòng và 3 cột

    MangHaichieu(1,1)="HH001" : MangHaichieu(1,2)="Chỉ khâu" : MangHaichieu(1,3)="Cuộn"
    MangHaichieu(2,1)="HH002" : MangHaichieu(2,2)="Kim băng" : MangHaichieu(1,3)="Hộp"
    MangHaichieu(3,1)="HH003" : MangHaichieu(3,2)="Vải Coton L3" : MangHaichieu(1,3)="m2"
    MangHaichieu(4,1)="HH004" : MangHaichieu(4,2)="Vải Coton L1" : MangHaichieu(1,3)="m2"
    MangHaichieu(5,1)="HH005" : MangHaichieu(5,2)="Vải Coton L2" : MangHaichieu(5,3)="m2"

    Set WS = Worksheets(strSheet)

    'Sắp xếp tăng dần mảng MangHaichieu bằng thủ tục Sapxep2 theo cột "Tên hàng"

    Sapxep2 MangHaichieu, CotSapxep

    WS.Cells.Clear
    For I=1 To 5
    For J=1 To 3
    WS.Cells(I,J).Value=MangHaichieu(I,J)
    End For
    End For

    Set WS = Nothing
    End Sub
    ========================================
    Trong lập trình VBA, việc sắp xếp mà dùng theo Sort của Excel không phải cách tốt (nó thuộc phạm vi ứng dụng người dùng) nên cần làm trong VBA.
    Mình đã làm việc này rồi và có kết quả. Tuy nhiên rất muốn tham khảo các cách làm của các bạn để chọn ra một cách làm tối ưu nhất. Mình sẽ gửi cách của mình lên sau.
     
    #1
  2. mysterious_girl

    mysterious_girl Thành viên sơ cấp

    Bài viết:
    358
    Đã được thích:
    1
    Nơi ở:
    ...close to you...
    Đây có phải là bài tập VBA cho buổi thứ 2 không, anh nhỉ?:friend:
     
    #2
  3. Đà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 Lão già!!!:dzo:
    --------------
    Em tưởng bác muốn sắp sếp các Item trong ListBox/ComboBox giống như "fu quân của Eva" chứ. Nếu làm trên MSE thì sao không tận dụng phương thức sort của Range (nói chung)?
    Này nhé:

    Bác thấy nhức đầu chưa!
    Nhưng ví dụ thì đơn giản thế này:
    Theo em thì bác đã cưới MSE rồi thì đừng ly dị chị ấy!
     
    #3
  4. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Cường chưa hiểu ý anh rồi!
    Trong xử lý dữ liệu, có rất nhiều dữ liệu trung gian cần làm, không phải lúc nào mình cũng đổ hết dữ liệu ra một Sheet nháp gọi là (TempSh) để dùng Sort cả. Phần nữa, việc sắp xếp nhiều khi để giải quyết một khâu nào đó trong một chuỗi các công việc, nếu dùng Sort sẽ làm thay đổi trạng thái Sheet của người dùng mà họ lại không muốn thế!

    Trong Excel, quan điểm của anh là vận dụng tối đa từ ứng dụng người dùng mới đến VBA, như thế mới "kinh tế"!

    Hi, em cho thế thì là thế đi! Riêng em mà làm được anh sẽ có quà.
     
    #4
  5. adam_tran

    adam_tran Steel Partner

    Bài viết:
    1,373
    Đã được thích:
    32
    Nơi ở:
    Goooogle
    Ý em cũng thế, để xuất dữ liệu ra 1 mảng hay 1 sheet rồi ứng dụng các công cụ có sẳn cũng hay, nhưng đôi lúc không thỏa mãn sở thích "vọc cho biết".
    Em đang search tìm 1 Data Control nào đó rồi dùng các phương thức sẳn có để sort, chẳng hạn MSFlexGrid (mà chẳng hiểu sao Office của em không cho dùng MSFkexGrid với lý do không có bản quyền). MSForm ListBox và ComboBox cũng store cả 1 mảng dữ liệu, nhưng nó không support phương thức sort mà thôi, do đó em cho là sẽ có 1 control nào đó có phương thức này.
    Bài tập kiểu này thì quá khả năng của lớp 2 rồi, nó vừa có mảng, lại có ByVal lại Optional Nó là vấn đề của các cao thủ đấy. Anh post ở đây cũng chỉ là spam cho xôm thôi.
     
    Last edited: 20 Tháng tư 2006
    #5
  6. Đà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,
    ---------------
    Anh đã xem qua TrueDBGrid.OCX chưa? Em thấy cái này làm được nhiều việc lắm, kể cả đưa Validation vào trong Grid giống như Excel. Với phiên bản mới (9.0 thì phải), nó còn cho Conditional Format. Nhưng phiên bản này phải mua bản quyền. Em có bản có phiên bản 6.0 có "key", anh muốn nghiên cứu thì em gửi cho!
     
    #6
  7. hai2hai

    hai2hai VNUNI Makes a difference

    Bài viết:
    2,012
    Đã được thích:
    128
    Nơi ở:
    Hà nội
    :)

    Tất cả các Grid trên đời này (cả trên .NET) h2h đều có (có cả Se***ial, latest verison) nhưng ko muốn dùng cho các ứng dụng Commercial Packages của mình mà chỉ dùng để evaluate thôi (và nếu dùng thì chắc sau phải mua tử tế).

    TrueDBGrid cũng là 1 trong các Grid đó, tuy khá nhiều features nhưng cái này hơi nặng nề (đã dùng các công cụ xịn để test trên mọi phương diện rồi, toàn chuyên gia đánh giá & evaluate thôi). Hiện truedb suite đã được componentone mua rồi và tất cả các controls có trademark là TrueDB đều nằm trong bộ ComponentOne Suite.

    Bây giờ công nghệ Grid phát triển mạnh mẽ lắm. Nhiều features thuộc dạng trước kia chỉ nằm mơ thôi, giờ có hết mà chẳng phải lập trình gì cả.

    Tham khảo: http://www.componentsource.com/features/xgrids/index.html

    Ví dụ: [​IMG]

    Còn đây là cái TrueDB Grid này, trông ... rõ chán: [​IMG]

    Nhưng VSFlexGrid của ComponentOne thì luôn là sự lựa chọn số 1: [​IMG]
     
    Last edited: 21 Tháng tư 2006
    #7
  8. mysterious_girl

    mysterious_girl Thành viên sơ cấp

    Bài viết:
    358
    Đã được thích:
    1
    Nơi ở:
    ...close to you...
    Cám ơn anh nhiều. Nhưng trình độ của em chỉ ở mức a bờ cờ thì làm sao dám làm bài này của anh,hic!!!:friend:
     
    #8

Chia sẻ trang này