Array & Listview tốc độ kinh hoàng ( 4s với 65500 dòng )!!!

Liên hệ QC

khoa140383

Thành viên hoạt động
Tham gia
2/10/09
Bài viết
101
Được thích
33
Chào cả nhà !!!

Sau một thời gian săn lùng trên mạng thì em tìm được code để nạp Array vào listview với tốc độ cực khủng. Nhưng bài sau đó em mò tiếp hàm Filter2D trên diễn đàn để áp dụng vào trường hợp này thì đang bị bó tay. Các bác xem dùm em nha. Em muốn hoàn thiện cái này để chuyển từ Listbox sang Listview.
Note : File này em muốn dùng Filter2D với cột 1 của Listview. Sau khi lọc thì sẽ xoá danh sách cũ và nạp ngược trở lại Listview các dòng thoả điều kiện.

Thanks all.
Have a nice day !!!
 

File đính kèm

  • arr & listview.xls
    44.5 KB · Đọc: 326
Bạn vui lòng gửi cái File của bạn lên đi nhé!

À không cần, bạn chỉ cần thêm tí xíu thôi:

ở đoạn này:

Mã:
[B]MyArr = Filter2DArray(MyArray, [COLOR=#ff0000]1[/COLOR], TextBox1.Value & "*", False)[/B]

Bạn thêm như vầy:

Mã:
        [B]MyArr = Filter2DArray(MyArray, [COLOR=#ff0000]1[/COLOR], TextBox1.Value & "*", False)[/B]
        [COLOR=#0000cd][B]If TypeName(MyArr) <> "Variant()" Then
            MyArr = Filter2DArray(MyArray, [/B][/COLOR][COLOR=#ff0000][B]2[/B][/COLOR][COLOR=#0000cd][B], [/B][/COLOR][COLOR=#ff0000][B]CDbl[/B][/COLOR][COLOR=#0000cd][B](TextBox1.Value) & "*", False)
        End If[/B][/COLOR]

Có nghĩa rằng, nếu không tìm thấy ở cột 1 thì sẽ chuyển sang cột thứ 2 tìm kiếm.

Với kiểu này, bạn khai báo thay vì Dim MyArr(), MyArray() thì bạn chỉ cần khai Dim MyArr, MyArray
(không có 2 dấu ngoặc)

Mã:
Private Sub TextBox1_Change()
    On Error Resume Next
    Dim r As Long, c As Long, rs As Long, cs As Long
    [COLOR=#ff0000][B]Dim MyArr, MyArray[/B][/COLOR]
    With ListView1
        .ListItems.Clear
        MyArray = Range(Sheet1.Range("A1"), Sheet1.Range("A65536").End(xlUp)).Resize(, 6).Value
        [B]MyArr = Filter2DArray(MyArray, [COLOR=#006400]1[/COLOR], TextBox1.Value & "*", False)[/B]
        [COLOR=#0000cd][B]If TypeName(MyArr) <> "Variant()" Then
            MyArr = Filter2DArray(MyArray, [/B][/COLOR][COLOR=#008080][B]2[/B][/COLOR][COLOR=#0000cd][B], [/B][/COLOR][COLOR=#ff0000][B]CDbl([/B][/COLOR][COLOR=#0000cd][B]TextBox1.Value[/B][/COLOR][COLOR=#ff0000][B])[/B][/COLOR][COLOR=#0000cd][B] & "*", False)
        End If[/B][/COLOR]
        
        rs = UBound(MyArr, 1)
        cs = UBound(MyArr, 2)
        
        For r = 1 To rs
            If MyArr(r, 1) <> "" Then
                With .ListItems.Add(, , MyArr(r, 1))
                    For c = 2 To cs
                        .SubItems(c - 1) = MyArr(r, c)
                    Next
                End With
            End If
        Next
    End With
End Sub
Cảm ơn anh. Mình làm được rồi.
Nhờ anh nghĩa giải thích giúp mình ảnh hưởng của việc khai báo Myarr , Myarray trong 2 truờng hợp với.
cái hàm: CDbl có ý nghĩa gì vậy anh.
Cảm ơn anh nhiều.
Trân trọng.
 
Upvote 0
Cảm ơn anh. Mình làm được rồi.
Nhờ anh nghĩa giải thích giúp mình ảnh hưởng của việc khai báo Myarr , Myarray trong 2 truờng hợp với.
cái hàm: CDbl có ý nghĩa gì vậy anh.
Cảm ơn anh nhiều.
Trân trọng.

Lúc đầu khai báo có 2 dấu ngoặc nó hiểu là mảng. Nhưng nếu không khai báo là mảng, tức là không có 2 dấu ngoặc, nó hiểu là một Variant thôi, nên lợi dụng đặc điểm này ta bẩy lỗi cho nó rằng nếu nó không phải là Variant thuộc mảng thì trả về giá trị khác.

Bạn cũng có thể thay:
Mã:
If TypeName(MyArr) <> "Variant()" Then

Bằng:
Mã:
If Not IsArray(MyArr) Then



Cdbl là hàm chuyển chuỗi về lại dạng số kiểu Double thôi (tại kỹ thì làm vậy, nhưng tôi thấy cũng không cần thiết lắm, bạn bỏ nó cũng được)
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh đã giải thích giúp em.
Chắc phải nhờ anh sửa hộ thôi. Ngại quá. ^^
Hồi nãy tưởng làm được, nhưng xem lại thấy không thỏa. Anh xem giúp:
Anh thử load form lên. Nhập vào vùng tìm chuổi Mit hay xoai... gì gì đó (Cái vùng em bôi màu đỏ ấy). Nó tìm cũng hổng ra luôn.

Cảm ơn anh nhiều.
 

File đính kèm

  • arr & listview.rar
    33.2 KB · Đọc: 61
Upvote 0
Cảm ơn anh đã giải thích giúp em.
Chắc phải nhờ anh sửa hộ thôi. Ngại quá. ^^
Hồi nãy tưởng làm được, nhưng xem lại thấy không thỏa. Anh xem giúp:
Anh thử load form lên. Nhập vào vùng tìm chuổi Mit hay xoai... gì gì đó (Cái vùng em bôi màu đỏ ấy). Nó tìm cũng hổng ra luôn.

Cảm ơn anh nhiều.

Trời ơi, bạn không đọc kỹ cái tôi nói về thằng Cdbl gì cả! Tại bạn muốn tìm về dạng số (113 gì đó) tôi mới thêm thằng này vô cho chắc ăn, nhưng xét lại thấy không cần thiết vì tính tổng quát, nên bỏ nó đi. Code của bạn bỏ nó đi là nó ra thôi!

Mã:
Private Sub TextBox1_Change()
    On Error Resume Next
    Dim r As Long, c As Long, rs As Long, cs As Long
    Dim MyArr, MyArray
    With ListView1
        .ListItems.Clear
        MyArray = Range(Sheet1.Range("A1"), Sheet1.Range("A65536").End(xlUp)).Resize(, 6).Value
        MyArr = Filter2DArray(MyArray, 1, TextBox1.Value & "*", False)
        If Not IsArray(MyArr) Then
            MyArr = Filter2DArray(MyArray, 2, TextBox1.Value & "*", False)
        End If
        
        rs = UBound(MyArr, 1)
        cs = UBound(MyArr, 2)
        
        For r = 1 To rs
            If MyArr(r, 1) <> "" Then
                With .ListItems.Add(, , MyArr(r, 1))
                    For c = 2 To cs
                        .SubItems(c - 1) = MyArr(r, c)
                    Next
                End With
            End If
        Next
    End With
End Sub
 
Upvote 0
bạn chỉ cần thêm tí xíu thôi:

ở đoạn này:

Mã:
[B]MyArr = Filter2DArray(MyArray, [COLOR=#ff0000]1[/COLOR], TextBox1.Value & "*", False)[/B]

Bạn thêm như vầy:

Mã:
        [B]MyArr = Filter2DArray(MyArray, [COLOR=#ff0000]1[/COLOR], TextBox1.Value & "*", False)[/B]
        [COLOR=#0000cd][B]If TypeName(MyArr) <> "Variant()" Then
            MyArr = Filter2DArray(MyArray, [/B][/COLOR][COLOR=#ff0000][B]2[/B][/COLOR][COLOR=#0000cd][B], [/B][/COLOR][COLOR=#ff0000][B]CDbl[/B][/COLOR][COLOR=#0000cd][B](TextBox1.Value) & "*", False)
        End If[/B][/COLOR]

Có nghĩa rằng, nếu không tìm thấy ở cột 1 thì sẽ chuyển sang cột thứ 2 tìm kiếm.

Với kiểu này, bạn khai báo thay vì Dim MyArr(), MyArray() thì bạn chỉ cần khai Dim MyArr, MyArray
(không có 2 dấu ngoặc)
Thay vì dùng TypeName, có thể dùng IsArray, kết quả tương tự nhưng "sát" với thực tế hơn
Tức
Mã:
MyArr = Filter2DArray(..,[B][COLOR=#ff0000]1,[/COLOR][/B]..)
If Not IsArray(MyArr) then
  MyArr = Filter2DArray(..,[B][COLOR=#ff0000]2,[/COLOR][/B]..)
End If
Lọc cột 1 cho vào biến MyArr, nếu nó không phải là 1 Array (tức không lọc được gì) thì chuyển sang lọc cột 2
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom