Filter2DArray - số cột lọc tùy ý, cột số tới 2 điều kiện

  • Thread starter Thread starter siwtom
  • Ngày gửi Ngày gửi
Liên hệ QC

siwtom

Thành viên gắn bó
Tham gia
19/3/08
Bài viết
2,127
Được thích
4,210
Trong chủ đề

http://www.giaiphapexcel.com/forum/...LỌC-2-CỘT-tốc-độ-cao-và-cấu-trúc-hàm-đơn-giản!


Hoàng Trọng Nghĩa có so sánh 3 hàm lọc. Tôi nhìn thấy chủ đề này từ lâu nhưng không nghĩ trong "ruột" lại đề cập tới hàm Filter2DArray vì chủ đề nói về AutoFilter.

Hôm nay do rỗi hơi nên tò mò vào xem thì thấy được 3 hàm lọc mà một hàm được gán cho là của siwtom. Tôi xin giải thích như sau.

a. Thực ra hàm Filter2DArray có 2 đk lọc là tôi "cải tiến" từ hàm của ndu để thêm đk thứ hai. Cải tiến nhưng vẫn giữ 90% ý tưởng và cách viết code của Tuấn. Vậy khó có thể gọi là hàm của siwtom.
b. Nếu tôi đập đi xây mới, làm lại từ đầu với ý tưởng khác đi, chọn cách code khác đi thì lúc đó có thể gọi là hàm của siwtom.
c. Khi cải tiến hàm của ndu tôi cũng nhận thấy Evaluate không hay lắm. Đúng là khi ta có 1 biểu thức phức tạp thì bắt buộc ta phải dùng Evaluate vì lúc đó cái quan trọng không phải là tốc độ mà chỉ là khả năng để tính toán được. Nhưng khi xét các biểu thức đơn giản kiểu a > b, A <= b, A <> b thì hoàn toàn có khả năng tính được mà không cần Evaluate.
d. Ngoài Evaluate làm chậm code thì dùng Dictionary cũng làm chậm code. Dictionary mạnh khi lọc duy nhất nhưng khi chỉ cần nhớ các giá trị "chắc chắn" là duy nhất, vd. các chỉ số dòng của mảng, thì dùng Dic.Add làm chậm code. Các bạn có thể kiểm nghiệm điều này bằng cách trong code của tôi dưới đây thay
Mã:
ReDim Preserve Tmp(0 To count)
Tmp(count) = i
count = count + 1

bằng Dic.Add i, ""

Tuy biết được các điều trên nhưng theo dõi chủ đề "ấy" (nơi tôi cải tiến code của ndu) thì thấy hầu như không ai có nhu cầu nên thôi. Chả ai bỏ công ra làm cái mà người khác không cần.

Nhưng bây giờ thấy Hoàng Trọng Nghĩa có thời gian và kiên nhẫn nên tôi cũng góp vui một code. Nhờ Nghĩa test hộ.

Hàm cho phép lọc số cột tùy ý. Trong mỗi cột có thể có đk lọc chuỗi hoặc số. Nếu là số thì có thể có 2 đk cho cùng 1 cột được kết hợp với nhau bởi AND hoặc OR. Các đk của các cột được kết hợp bởi AND (a and b and c ... and z) hoặc OR (a or b or c ... or z)

Vd. có thể lọc theo 3 cột 1, 2 và 3 - tức các cột Họ Tên, Thời gian, Sản phẩm. Ví dụ ta phải tìm các dòng có Họ tên là "abc", thời gian là từ ... đến ..., và sản phẩm là >= 100. Chú ý là cột Thời gian có 2 đk con được kết hợp bởi AND. Và 3 đk của 3 cột được kết hợp với nhau bởi AND.

vd. sử dụng hàm

Mã:
Dim sArray, ArrCrit(1 To 2, 1 To 2)
        
        ArrCrit(1, 1) = 4
        ArrCrit(2, 1) = ">=10||<=100"
        ArrCrit(1, 2) = 6
        ArrCrit(2, 2) = ">=" & CDbl(DateSerial(2011, 11, 24))
        sArray = MyFilter2DArray([A34:F65536], ArrCrit, False)

Mã:
Dim sArray, ArrCrit(1 To 2, 1 To 1)

        ArrCrit(1, 1) = 4
        ArrCrit(2, 1) = ">500"
        sArray = MyFilter2DArray([A2:F65536], ArrCrit, True)
--------------------
Hướng dẫn
1. sArray là mảng - range chứa các giá trtị cần lọc.
2. ArrCrit() là mảng 2 chiều có 2 dòng và k cột với k là số cột cần lọc. Dòng đầu chứa lần lượt chỉ số các cột cần lọc - tính từ 1. Dòng 2 chứa các điều kiện lọc cho từng cột.
Nếu điều kiện không bắt đầu bằng ký tự "<", ">" hay "=" thì có nghĩa là lọc chuỗi trong cột.
Nếu điều kiện bắt đầu bằng ký tự "!" thì có nghĩa là loại các giá trị khớp với chuỗi có được từ điều kiện sau khi bỏ ký tự "!".
Nếu điều kiện không bắt đầu bằng ký tự "!" thì có nghĩa là lấy các giá trị khớp với điều kiện.
Nếu điều kiện bắt đầu bằng ký tự "<", ">" hay "=" thì có nghĩa là điều kiện so sánh số. Trong trường hợp này có thể có 1 hoặc 2 điều kiện con. Mỗi điều kiện con phải bắt đầu bằng "<", ">" hoac "=". Nếu có 2 điều kiện con thì phải được kết hợp với nhau bằng ký tự "||" - tức AND - hoặc "|" - tức OR. Ví dụ:
điều kiện ">=150" - tức các giá trị >= 150 sẽ thỏa
điều kiện ">=150||<=200" - tức các giá trị trong khoảng [150;200] sẽ thỏa
điều kiện ">=200|<=150" - tức các giá trị <= 150 hoặc >= 200 sẽ thỏa

3. arg_and xác định cách kết hợp điều kiện của các cột. Nếu arg_and = TRUE thì điều kiện của các cột được kết hợp với nhau bởi toán tử AND, tức các điều kiện đều phải thỏa. Ngược lại thì các điều kiện được kết hợp với nhau bằng toán tử OR
----------------
Code:

[GPECODE=vb]
Option Compare Text

Private Function GoodItem(ByVal item As Double, ByVal value As Double, ByVal ArgumenValue As Long) As Boolean
Select Case ArgumenValue
Case 0: GoodItem = item <> value
Case 1: GoodItem = item <= value
Case 2: GoodItem = item >= value
Case 3: GoodItem = item = value
Case 4: GoodItem = item < value
Case 5: GoodItem = item > value
End Select
End Function

Private Function ArgumenValue(ByVal strArg As String) As Long
Dim kytu As String, Tmp As String
ArgumenValue = -1
kytu = Left(strArg, 1)
If InStr(1, "><=", kytu) <= 0 Then Exit Function
Tmp = Left(strArg, 2)
Select Case Tmp
Case "<>": ArgumenValue = 0
Case "<=": ArgumenValue = 1
Case ">=": ArgumenValue = 2
Case Else
Select Case kytu
Case "=": ArgumenValue = 3
Case "<": ArgumenValue = 4
Case ">": ArgumenValue = 5
End Select
End Select
End Function

Private Sub PrepareArg(ArrCrit(), VarCrit())
Dim col As Long, k As Long, opt As Long, argValue As Long, argValue2 As Long
Dim strCrit, strCrit2, kytu As String
ReDim VarCrit(0 To 5, LBound(ArrCrit, 2) To UBound(ArrCrit, 2))
For col = LBound(VarCrit, 2) To UBound(VarCrit, 2)
strCrit = ArrCrit(UBound(ArrCrit), col)
kytu = Left(strCrit, 1)
If InStr(1, "><=", kytu) > 0 Then
' dieu kien ve so
k = InStr(1, strCrit, "||")
If k > 0 Then
' dieu kien ve so, 2 dk ket hop boi AND
opt = 1
strCrit2 = Mid(strCrit, k + 2)
strCrit = Left(strCrit, k - 1)
Else
k = InStr(1, strCrit, "|")
If k > 0 Then
' dieu kien ve so, 2 dk ket hop boi OR
opt = 2
strCrit2 = Mid(strCrit, k + 1)
strCrit = Left(strCrit, k - 1)
Else
' dieu kien ve so, 1 dk
opt = 0
End If
End If
argValue = ArgumenValue(strCrit)
If argValue > 2 Then
strCrit = Mid(strCrit, 2)
Else
strCrit = Mid(strCrit, 3)
End If
argValue2 = ArgumenValue(strCrit2)
If argValue2 > 2 Then
strCrit2 = Mid(strCrit2, 2)
Else
strCrit2 = Mid(strCrit2, 3)
End If
Else
' dieu kien ve chuoi
If kytu = "!" Then
' dieu kien ve chuoi, phu nhan
opt = 4
strCrit = Mid(strCrit, 2)
Else
' dieu kien ve so, chap nhan
opt = 3
End If
End If
VarCrit(0, col) = ArrCrit(LBound(ArrCrit), col)
VarCrit(1, col) = opt
VarCrit(2, col) = strCrit
VarCrit(3, col) = strCrit2
VarCrit(4, col) = argValue
VarCrit(5, col) = argValue2
Next col
End Sub

Function MyFilter2DArray(ByVal sArray As Variant, ArrCrit(), ByVal HasTitle As Boolean, Optional ByVal arg_and As Boolean = True)
' sArray là mảng - range chứa các giá trị cần lọc
' ArrCrit() la mang 2 chieu co 2 dong va k cot voi k la so cot can loc. Dong dau chua lan luot chi so cac cot can loc - tinh tu 1.
' Dong 2 chua cac dieu kien loc cho tung cot. Neu dieu kien khong bat dau bang ky tu "<", ">" hay "=" thi co nghia la loc chuoi trong cot.
' Neu dieu kien bat dau bang ky tu "!" thi co nghia la loai cac gia tri khop voi chuoi co duoc tu dieu kien sau khi bo ky tu "!". Neu chuoi
' khong bat dau bang ky tu "!" thi co nghia la tim cac gia tri khop voi dieu kien
' Neu dieu kien bat dau bang ky tu "<", ">" hoac "=" thi co nghia la dieu kien la so sanh so. Trong truong hop nay co the co 1 hoac 2
' dieu kien con. Moi dieu kien con phai bat dau bang "<", ">" hoac "=". Neu co 2 dieu kien con thi phai duoc ket hop voi nhau bang
' ky tu "||" - tuc AND - hoac "|" - tuc OR. Vi du:
' dieu kien ">=150" - tuc cac gia tri >= 150 se thoa
' dieu kien ">=150||<=200" - tuc cac gia tri trong khoang [150;200] se thoa
' dieu kien ">=200|<=150" - tuc cac gia tri <= 150 hoac >= 200 se thoa
' arg_and xac dinh cach ket hop dieu kien cua cac cot. Neu arg_and TRUE thi dieu kien cua cac cot duoc ket hop voi nhau boi
' toan tu AND, tuc cac dieu kien deu phai thoa. Nguoc lai thi cac dieu kien duoc ket hop voi nhau boi toan tu OR


' HasTitle - thông báo là mảng nhập vào có chứa tiêu đề ở dòng đầu tiên (TRUE) hoặc không chứa (FALSE)

Dim TmpArr, i As Long, j As Long, Arr, Dic, Tmp(), TmpVal As Double, sArr As String, res As Boolean
Dim col As Long, strCrit As String, strCrit2 As String
Dim k As Long, VarCrit(), opt As Long, colIndex As Long
Dim LBoundTmpArr As Long, UBoundTmpArr As Long, LBoundTmpArr2 As Long, UBoundTmpArr2 As Long
Dim LBoundVarCrit2 As Long, UBoundVarCrit2 As Long, TmpcurrRow As Long, count As Long, t As Double
On Error Resume Next
' sao dữ liệu từ sArray sang TmpArr
TmpArr = sArray

If Not IsArray(TmpArr) Then Exit Function

' chuan bi argument
PrepareArg ArrCrit, VarCrit

LBoundTmpArr = LBound(TmpArr, 1)
UBoundTmpArr = UBound(TmpArr, 1)
LBoundTmpArr2 = LBound(TmpArr, 2)
UBoundTmpArr2 = UBound(TmpArr, 2)
LBoundVarCrit2 = LBound(VarCrit, 2)
UBoundVarCrit2 = UBound(VarCrit, 2)

' đi từng dòng trong cột lọc ColIndex và lọc lấy dữ liệu
For i = 1 - HasTitle To UBoundTmpArr
For col = LBoundVarCrit2 To UBoundVarCrit2
opt = VarCrit(1, col)
If opt < 3 Then
' dieu kien ve so
TmpVal = CDbl(TmpArr(i, VarCrit(0, col)))
If Err.Number = 0 Then
res = GoodItem(TmpVal, VarCrit(2, col), VarCrit(4, col))
If (res And opt = 1) Or (Not res And opt = 2) Then res = GoodItem(TmpVal, VarCrit(3, col), VarCrit(5, col))
Else
Err.Clear
res = False
Exit For
End If
Else
' dieu kien ve chuoi
sArr = TmpArr(i, VarCrit(0, col))
If opt = 3 Then
' chap nhan
res = sArr Like VarCrit(2, col)
Else
' phu nhan
res = Not (sArr Like VarCrit(2, col))
End If
End If
If res = Not arg_and Then Exit For
Next col
If res Then
ReDim Preserve Tmp(0 To count)
Tmp(count) = i
count = count + 1
End If
Next i

' nếu trong mang tmp có dữ liệu là các chỉ số dòng được chọn thì ...
If count > 0 Then
' tạo mảng Arr có số dòng bằng số chỉ số dòng được chọn và số cột bằng số côt của mảng nguồn sArray
ReDim Arr(LBoundTmpArr To UBound(Tmp) + LBoundTmpArr - HasTitle, 1 To UBoundTmpArr2)
' ghi các dòng của mảng nguồn mà có chỉ số là các phần tử cua tmp (tức các dòng được lấy) vào mảng Arr
For i = LBoundTmpArr - HasTitle To UBound(Tmp) + LBoundTmpArr - HasTitle
TmpcurrRow = Tmp(i - LBoundTmpArr + HasTitle)
For j = 1 To UBoundTmpArr2
Arr(i, j) = TmpArr(TmpcurrRow, j)
Next
Next
' nếu mảng nguồn có chứa tiêu đề thì ghi tiêu đề vào mảng Arr ở dòng đầu tiên
If HasTitle Then
For j = 1 To UBoundTmpArr2
Arr(LBoundTmpArr, j) = TmpArr(LBoundTmpArr, j)
Next
End If
End If
' trả về mảng các dòng được chọn - lọc
MyFilter2DArray = Arr
End Function
[/GPECODE]
 
Tới giờ em mới thấy bài này, em không thể test được bởi không hiểu sao, em chép code của Thầy về nó có hiện tượng "đỏ" một số dòng một cách kỳ lạ. Các Thầy có biết nguyên nhân tại sao không? Em đã save file rồi mở lên lại, vẫn bị đỏ lè!


========================================

Đã giải quyết!

Chỉ cần Replace các khoảng trắng đặc biệt, thay thế bằng khoảng trắng spacebar thì OK.
 

File đính kèm

  • Error.jpg
    Error.jpg
    230.2 KB · Đọc: 211
Lần chỉnh sửa cuối:
Upvote 0
Em có thói quen đọc code trước rồi mới test sau, nhìn qua thì cũng hơi hiểu thuật toán mà Thầy viết, song, vì chưa test được nên có một gút mắc để hỏi cho rõ một tí.

Trong module chứa hàm có thủ tục:

Mã:
Private Sub PrepareArg(ArrCrit(),[COLOR=#ff0000][B] VarCrit()[/B][/COLOR])

Nếu cái màu đỏ là mảng để bổ sung cho hàm chính MyFilter2DArray thì biến đó phải khai báo ở trên cùng:

Mã:
Option Compare Text
Private VarCrit()

hoặc phải dùng ByRef:

Mã:
Private Sub PrepareArg(ArrCrit(), [B][COLOR=#0000ff]ByRef [/COLOR][COLOR=#ff0000]VarCrit()[/COLOR][/B])


để khi đó từ thủ tục:

Mã:
PrepareArg ArrCrit, [COLOR=#ff0000]VarCrit[/COLOR]

trong hàm chính, thì biến VarCrit sẽ nhận giá trị, sau đó mới truyền giá trị vào các:

Mã:
    LBoundVarCrit2 = LBound([COLOR=#0000ff]VarCrit[/COLOR], 2)
    UBoundVarCrit2 = UBound([COLOR=#0000ff]VarCrit[/COLOR], 2)
......
            opt = [COLOR=#0000ff]VarCrit[/COLOR](1, col)
            If opt < 3 Then
'                    dieu kien ve so
                TmpVal = CDbl(TmpArr(i, [COLOR=#0000ff]VarCrit[/COLOR](0, col)))
....

Không biết em có ý kiến như trên có gì sai không?


========================================

Tự hỏi rồi tự trả lời luôn, trong Help có giải thích:

Array argument must be ByRef

Arrays declared with Dim, ReDim, or Static can't be passed ByVal. This error has the following cause and solution:


You tried to pass a whole array ByVal.
An individual element of an array can be passed ByVal (by value), but a whole array must be passed ByRef (by reference). Note that ByRef is the default. If you must pass an array ByVal to prevent changes to the array's elements from being propagated back to the caller, you can pass the array argument in its own set of parentheses, or you can place it into a Variant, and then pass the Variant to the ByVal parameter, as follows:


Dim MyVar As Variant
MyVar = OldArray()
 
Lần chỉnh sửa cuối:
Upvote 0
To: Thầy Siwtom

Nếu như một bảng dữ liệu có cột số 2 là cột ngày tháng, và nếu điều kiện lọc là lấy tất cả các ngày 11, không quan tâm đến tháng năm, thì phải làm thế nào ạ?

Mã:
Sub TEST()    Dim sArray, ArrayCrit(1 To 2, 1 To 1)[COLOR=#008000]', t As Double[/COLOR]
     [COLOR=#008000]'t = Timer[/COLOR]
    ArrayCrit(1, 1) = 2
[COLOR=#ff0000]    ArrayCrit(2, 1) = "=11*" [/COLOR]
    Range("H:L").Clear
    sArray = MyFilter2DArray(Range("A1:E50000"), ArrayCrit, True)
    Range("H1").Resize(UBound(sArray), 5) = sArray
     [COLOR=#008000]'MsgBox Timer - t[/COLOR]
End Sub

Với cấu trúc ArrayCrit(2, 1) = "=11*" thì hàm này lại không ổn.
 
Lần chỉnh sửa cuối:
Upvote 0
To: Thầy Siwtom

Nếu như một bảng dữ liệu có cột số 2 là cột ngày tháng, và nếu điều kiện lọc là lấy tất cả các ngày 11, không quan tâm đến tháng năm, thì phải làm thế nào ạ?

Mã:
Sub TEST()    Dim sArray, ArrayCrit(1 To 2, 1 To 1)[COLOR=#008000]', t As Double[/COLOR]
     [COLOR=#008000]'t = Timer[/COLOR]
    ArrayCrit(1, 1) = 2
[COLOR=#ff0000]    ArrayCrit(2, 1) = "=11*" [/COLOR]
    Range("H:L").Clear
    sArray = MyFilter2DArray(Range("A1:E50000"), ArrayCrit, True)
    Range("H1").Resize(UBound(sArray), 5) = sArray
     [COLOR=#008000]'MsgBox Timer - t[/COLOR]
End Sub

Với cấu trúc ArrayCrit(2, 1) = "=11*" thì hàm này lại không ổn.

Cột 2 đúng là ngày tháng (vd. 41452) hay ngày tháng được nhập dưới dạng text, vd. '2013-06-27?
Nếu là dạng số, vd. 41452, thì làm sao mà lọc được các ngày 11? Tất nhiên nếu muốn thì có thể đọc được ngày (không đọc tháng, năm) từ con số đó nhưng đó là nhiệm vụ của người gọi hàm chứ?
Hàm được viết tổng quát nên không thể có chuyện đọc ra ngày, tháng, năm từ con số truyền vào được. Làm sao hàm biết được con số đó là ngày tháng chứ không phải số lượng mặt hàng gì đó? Muốn dùng hàm thì phải "tu sửa" dữ liệu trước khi truyền vào hàm hoặc chọn hàm khác. Trong Excel hay bất cứ đâu có nhiều hàm có thể làm được việc A nhưng dùng hàm abc là thích hợp nhất vì xyz đòi hỏi convert dữ liệu truyền vào tới dạng thích hợp. Vậy thì dùng abc chứ sao lại cứ muốn xyz rồi kêu ca?
Nếu dữ liệu vd. từ 41452 tới 41490 mà muốn lọc ra các ngày 11 thì hoặc convert sang dạng chuỗi dd-mm-yyyy (hoặc ngược lại) rồi dùng "11*" ("*11") hoặc sang dạng số dd (vd. 41452 --> 27) thì lúc đó "=11"

Mà bạn có đọc giải thích của tôi không?
Nhìn "=11*" thì biết bạn coi cột 2 là chuỗi (ký tự *). Nhưng "=" ở đằng trước chỉ dùng với cột số mà. Nếu chuỗi đó có dạng dd-mm-yyyy thì phải là "11*" chứ?
 
Upvote 0
Cột 2 đúng là ngày tháng (vd. 41452) hay ngày tháng được nhập dưới dạng text, vd. '2013-06-27?
Nếu là dạng số, vd. 41452, thì làm sao mà lọc được các ngày 11? Tất nhiên nếu muốn thì có thể đọc được ngày (không đọc tháng, năm) từ con số đó nhưng đó là nhiệm vụ của người gọi hàm chứ?
Hàm được viết tổng quát nên không thể có chuyện đọc ra ngày, tháng, năm từ con số truyền vào được. Làm sao hàm biết được con số đó là ngày tháng chứ không phải số lượng mặt hàng gì đó? Muốn dùng hàm thì phải "tu sửa" dữ liệu trước khi truyền vào hàm hoặc chọn hàm khác. Trong Excel hay bất cứ đâu có nhiều hàm có thể làm được việc A nhưng dùng hàm abc là thích hợp nhất vì xyz đòi hỏi convert dữ liệu truyền vào tới dạng thích hợp. Vậy thì dùng abc chứ sao lại cứ muốn xyz rồi kêu ca?
Nếu dữ liệu vd. từ 41452 tới 41490 mà muốn lọc ra các ngày 11 thì hoặc convert sang dạng chuỗi dd-mm-yyyy (hoặc ngược lại) rồi dùng "11*" ("*11") hoặc sang dạng số dd (vd. 41452 --> 27) thì lúc đó "=11"

Mà bạn có đọc giải thích của tôi không?
Nhìn "=11*" thì biết bạn coi cột 2 là chuỗi (ký tự *). Nhưng "=" ở đằng trước chỉ dùng với cột số mà. Nếu chuỗi đó có dạng dd-mm-yyyy thì phải là "11*" chứ?

Dạ, em thử lại rồi, với định dạng trong sheet là dd/mm/yyyy thì cấu trúc của điều kiện là:

ArrayCrit(2, 1) = "11*"

Như thế thì lọc được ạ.

Em sẽ test thêm nhiều kiểu nữa.

---------------------------------------------
 
Lần chỉnh sửa cuối:
Upvote 0
Mà bạn có đọc giải thích của tôi không?
Nhìn "=11*" thì biết bạn coi cột 2 là chuỗi (ký tự *). Nhưng "=" ở đằng trước chỉ dùng với cột số mà. Nếu chuỗi đó có dạng dd-mm-yyyy thì phải là "11*" chứ?

Thầy biết rồi đó, ở bài này:

http://www.giaiphapexcel.com/forum/...và-cấu-trúc-hàm-đơn-giản!&p=472189#post472189

thì hàm đó của em đều có thể sử dụng được dù kiểu nào đi chăng nữa chỉ 1 cấu trúc thôi, không phân biệt chuỗi hay số, nếu muốn lấy giá trị đó thì hoặc là không cần dấu bằng, hoặc là có dấu bằng đều được.

Mã:
    sArray = [B][COLOR=#0000cd]NewAutoFilter[/COLOR][/B](Range("A1:E50000"), 2, "=11*", Header:=xlYes)

hoặc
 
   sArray = [B][COLOR=#0000cd]NewAutoFilter[/COLOR][/B](Range("A1:E50000"), 2, "11*", Header:=xlYes)
 
Lần chỉnh sửa cuối:
Upvote 0
Thầy biết rồi đó, ở bài này:

http://www.giaiphapexcel.com/forum/showthread.php?76832-T%E1%BA%B7ng-h%C3%A0m-NewAutoFilter-L%E1%BB%8CC-2-C%E1%BB%98T-t%E1%BB%91c-%C4%91%E1%BB%99-cao-v%C3%A0-c%E1%BA%A5u-tr%C3%BAc-h%C3%A0m-%C4%91%C6%A1n-gi%E1%BA%A3n%21&p=472189#post472189

thì hàm đó của em đều có thể sử dụng được dù kiểu nào đi chăng nữa chỉ 1 cấu trúc thôi, không phân biệt chuỗi hay số, nếu muốn lấy giá trị đó thì hoặc là không cần dấu bằng, hoặc là có dấu bằng đều được.

Mã:
    sArray = [B][COLOR=#0000cd]NewAutoFilter[/COLOR][/B](Range("A1:E50000"), 2, "=11*", Header:=xlYes)

hoặc
 
   sArray = [B][COLOR=#0000cd]NewAutoFilter[/COLOR][/B](Range("A1:E50000"), 2, "11*", Header:=xlYes)

1. Nếu viết "11*" là được, là đủ thì viết "=11*" để làm gì?
2. Tôi viết đâu có phải là để so sánh với hàm nào đó?
3. Hàm là hàm, việc sử dụng hay không, chọn hàm khác là tùy người dùng.
 
Upvote 0
Xin cho hỏi, khi em dùng MyFilter2DArray thì khi lọc điều kiện lại bị phân biệt in hoa với chữ thường ạ. Có cách nào khắc phục chỗ này không.
 
Upvote 0
Xin cho hỏi, khi em dùng MyFilter2DArray thì khi lọc điều kiện lại bị phân biệt in hoa với chữ thường ạ. Có cách nào khắc phục chỗ này không.
Tại Module chứa hàm đó, bạn thay thế:

Option Compare Text

Thành cái này:

Option Compare Binary



(Chúng nằm trên cùng của Module).
 
Upvote 0
Anh, chị giúp em với ạ.
Em có áp dụng code trên vào file nhưng em muốn khi trả về chỉ chả về 1 số cột theo ý mình mà không phải cả mảng ban đầu thì làm thế nào ạ.
Ví dụ như file đính kèm ạ
Em cảm ơn ạ.
 

File đính kèm

Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom