- Tham gia
- 17/8/08
- Bài viết
- 8,662
- Được thích
- 16,719
- Giới tính
- Nam
Mặc dù cách lọc mới này cũng là những vòng lặp để duyệt từng hàng trên mảng như những thuật toán lọc hiện hành, nhưng tôi "phát minh" ra một kiểu lọc mới có thể giảm được thời gian từ bằng việc lọc thông thường cho đến nhanh hơn rất nhiều.
Cụ thể là lọc thông thường các coder thường lấy mảng gốc để lọc cho bất cứ từ khóa (key) nào, còn tôi sẽ lọc được mảng nào lưu tạm lại mảng đó để dùng lọc cho các từ khóa sau. Vì vậy khi bạn gõ ký tự đầu tiên sẽ có thời gian lọc như các kiểu lọc thông thường, nhưng từ ký tự thứ 2 và thứ n sẽ giảm dần theo dữ liệu còn lại trên mảng lưu tạm.
Và cứ mỗi ký tự bị xóa nó sẽ trả lại mảng tương ứng đã lọc trước đó cho nên nó không mất thời gian cho việc lọc lại.
Code này tôi viết để lọc cho ComboBox, nhưng nếu ai muốn tùy biến trên TextBox và gán dữ liệu vào ListBox cũng không vấn đề gì.
Và code này tôi xin tặng các bạn nhân mùa dịch khủng khiếp này. Tôi cũng rất mong được các bạn góp ý cho những trường hợp làm cho nó hoàn thiện hơn, nhanh hơn.
Tôi tạm lấy hơn 11 ngàn phường xã trong nước x 10 lần để có số hàng 111,620 dòng để test.
Tôi cũng khuyến mại thêm cho các bạn Hàm LoaiDauUni để loại bỏ dấu tiếng Việt kiểu gõ Unicode (dựng sẵn).
P/S: Nếu muốn lọc mà không cần hàm LoaiDauUni để nhanh hơn, hãy xem bài #58.
Cụ thể là lọc thông thường các coder thường lấy mảng gốc để lọc cho bất cứ từ khóa (key) nào, còn tôi sẽ lọc được mảng nào lưu tạm lại mảng đó để dùng lọc cho các từ khóa sau. Vì vậy khi bạn gõ ký tự đầu tiên sẽ có thời gian lọc như các kiểu lọc thông thường, nhưng từ ký tự thứ 2 và thứ n sẽ giảm dần theo dữ liệu còn lại trên mảng lưu tạm.
Và cứ mỗi ký tự bị xóa nó sẽ trả lại mảng tương ứng đã lọc trước đó cho nên nó không mất thời gian cho việc lọc lại.
Code này tôi viết để lọc cho ComboBox, nhưng nếu ai muốn tùy biến trên TextBox và gán dữ liệu vào ListBox cũng không vấn đề gì.
Và code này tôi xin tặng các bạn nhân mùa dịch khủng khiếp này. Tôi cũng rất mong được các bạn góp ý cho những trường hợp làm cho nó hoàn thiện hơn, nhanh hơn.
Tôi tạm lấy hơn 11 ngàn phường xã trong nước x 10 lần để có số hàng 111,620 dòng để test.
PHP:
Private Sub cbxPhuongXa_Change()
If cbxPhuongXa.Text = "" Then
ReDim Preserve priArrPhuongXa(0 To 0)
cbxPhuongXa.Column = priArrPhuongXa(0)
GoTo ExitSub
End If
On Error GoTo ExitSub
Dim c As Long, lngLenText As Long, lngUbd As Long
lngLenText = Len(cbxPhuongXa.Text)
lngUbd = UBound(priArrPhuongXa)
c = lngLenText - 1
If Not IsArray(priArrPhuongXa(c)) Then
cbxPhuongXa.Clear
ReDim Preserve priArrPhuongXa(0 To lngLenText)
GoTo ExitSub
End If
If lngUbd > lngLenText Then
If Not IsArray(priArrPhuongXa(lngLenText)) Then
cbxPhuongXa.Clear
cbxPhuongXa.ForeColor = &H800000
Else
cbxPhuongXa.Column = priArrPhuongXa(lngLenText)
End If
ReDim Preserve priArrPhuongXa(0 To lngLenText)
GoTo ExitSub
End If
If Right(cbxPhuongXa.Text, 1) = "*" Or Right(cbxPhuongXa.Text, 1) = "?" Then
ReDim Preserve priArrPhuongXa(0 To lngLenText)
priArrPhuongXa(lngLenText) = priArrPhuongXa(lngUbd)
GoTo ExitSub
End If
Dim arrFilter()
Dim strType As String, strTemp As String, strColOne As String
Dim n As Long, r As Long, t As Long, uCol As Long, uRow As Long
c = lngLenText - 1
lRow = LBound(priArrPhuongXa(c), 2): uRow = UBound(priArrPhuongXa(c), 2)
strTemp = UCase(LoaiDauUni(cbxPhuongXa.Text))
strType = "*" & strTemp & "*"
strTypeTwo = strTemp & "*"
For r = lRow To uRow
strColOne = UCase(LoaiDauUni(priArrPhuongXa(c)(0, r)))
If strColOne Like strType Then
ReDim Preserve arrFilter(0 To 0, 0 To n)
arrFilter(0, n) = priArrPhuongXa(c)(0, r)
n = n + 1
End If
Next
If n Then
ReDim Preserve priArrPhuongXa(0 To lngLenText)
priArrPhuongXa(lngLenText) = arrFilter
cbxPhuongXa.Column = arrFilter
Else
cbxPhuongXa.Clear
cbxPhuongXa.ForeColor = &H800000
ReDim Preserve priArrPhuongXa(0 To lngLenText)
End If
ExitSub:
If cbxPhuongXa.ListCount > 0 Then cbxPhuongXa.DropDown
End Sub
Tôi cũng khuyến mại thêm cho các bạn Hàm LoaiDauUni để loại bỏ dấu tiếng Việt kiểu gõ Unicode (dựng sẵn).
PHP:
Function LoaiDauUni(ByVal strText As String) As String
If strText = "" Then Exit Function
Static ObjDict As Object
Static blnInitial As Boolean
If Not blnInitial Then
Dim c As Byte
Dim arrNoMarks, arrUnicode
arrUnicode = Array(192, 193, 194, 195, 200, 201, 202, 204, 205, 210, 211, 212, _
213, 217, 218, 221, 224, 225, 226, 227, 232, 233, 234, 236, 237, _
242, 243, 244, 245, 249, 250, 253, 258, 259, 272, 273, 296, 297, _
360, 361, 416, 417, 431, 432, 7840, 7841, 7842, 7843, 7844, 7845, _
7846, 7847, 7848, 7849, 7850, 7851, 7852, 7853, 7854, 7855, 7856, _
7857, 7858, 7859, 7860, 7861, 7862, 7863, 7864, 7865, 7866, 7867, _
7868, 7869, 7870, 7871, 7872, 7873, 7874, 7875, 7876, 7877, 7878, _
7879, 7880, 7881, 7882, 7883, 7884, 7885, 7886, 7887, 7888, 7889, _
7890, 7891, 7892, 7893, 7894, 7895, 7896, 7897, 7898, 7899, 7900, _
7901, 7902, 7903, 7904, 7905, 7906, 7907, 7908, 7909, 7910, 7911, _
7912, 7913, 7914, 7915, 7916, 7917, 7918, 7919, 7920, 7921, 7922, _
7923, 7924, 7925, 7926, 7927, 7928, 7929)
arrNoMarks = Array("A", "A", "A", "A", "E", "E", "E", "I", "I", "O", "O", "O", "O", _
"U", "U", "Y", "a", "a", "a", "a", "e", "e", "e", "i", "i", "o", "o", _
"o", "o", "u", "u", "y", "A", "a", "D", "d", "I", "i", "U", "u", "O", _
"o", "U", "u", "A", "a", "A", "a", "A", "a", "A", "a", "A", "a", "A", _
"a", "A", "a", "A", "a", "A", "a", "A", "a", "A", "a", "A", "a", "E", _
"e", "E", "e", "E", "e", "E", "e", "E", "e", "E", "e", "E", "e", "E", _
"e", "I", "i", "I", "i", "O", "o", "O", "o", "O", "o", "O", "o", "O", _
"o", "O", "o", "O", "o", "O", "o", "O", "o", "O", "o", "O", "o", "O", _
"o", "U", "u", "U", "u", "U", "u", "U", "u", "U", "u", "U", "u", "U", _
"u", "Y", "y", "Y", "y", "Y", "y", "Y", "y")
Set ObjDict = CreateObject("Scripting.Dictionary")
For c = 0 To 133
ObjDict(arrUnicode(c)) = arrNoMarks(c)
Next
blnInitial = True
End If
Dim i As Long, j As Long, lngAscW As Long
For i = 1 To Len(strText)
lngAscW = AscW(Mid(strText, i, 1))
If lngAscW > 191 Then
Mid(strText, i, 1) = ObjDict.Item(lngAscW)
End If
Next
LoaiDauUni = strText
End Function
P/S: Nếu muốn lọc mà không cần hàm LoaiDauUni để nhanh hơn, hãy xem bài #58.
File đính kèm
Lần chỉnh sửa cuối: