Thắc mắc,góp ý hoàn thiện về hàm UDF Filter2DArray
Function Filter2DArray(ByVal sArray, ByVal ColIndex As Long, ByVal FindStr As String, ByVal HasTitle As Boolean)
Dim tmpArr, i As Long, j As Long, Arr, Dic, TmpStr, Tmp, Chk As Boolean, TmpVal As Double
On Error Resume Next
Set Dic = CreateObject("Scripting.Dictionary")
tmpArr = sArray
ColIndex = ColIndex + LBound(tmpArr, 2) – 1
Chk = (InStr("><=", Left(FindStr, 1)) > 0)
For i = LBound(tmpArr, 1) – HasTitle To UBound(tmpArr, 1)
If Chk Then
TmpVal = CDbl(tmpArr(i, ColIndex))
If Evaluate(TmpVal & FindStr) Then Dic.Add i, ""
Else
If UCase(tmpArr(i, ColIndex)) Like UCase(FindStr) Then Dic.Add i, ""
End If
Next
If Dic.Count > 0 Then
Tmp = Dic.Keys
ReDim Arr(LBound(tmpArr, 1) To UBound(Tmp) + LBound(tmpArr, 1) – HasTitle, LBound(tmpArr, 2) To UBound(tmpArr, 2))
For i = LBound(tmpArr, 1) – HasTitle To UBound(Tmp) + LBound(tmpArr, 1) – HasTitle
For j = LBound(tmpArr, 2) To UBound(tmpArr, 2)
Arr(i, j) = tmpArr(Tmp(i – LBound(tmpArr, 1) + HasTitle), j)
Next
Next
If HasTitle Then
For j = LBound(tmpArr, 2) To UBound(tmpArr, 2)
Arr(LBound(tmpArr, 1), j) = tmpArr(LBound(tmpArr, 1), j)
Next
End If
End If
Filter2DArray = Arr
End FunctionHàm Filter mãng 2 chiều này thật là hay, tôi đã ứng dụng rất nhiều bài tập, song hình như nó có vẽ như thiếu thứ gì đó, với trình độ của tôi thì đọc Hàm trên chỉ biết là vậy chứ thật sự không hiểu hết nổi thuật toán mà Thầy ndu96081631 đã thực hiện. Vì vậy tôi muốn hỏi là:
1) Làm thế nào để Lọc điều kiện là rỗng?
2) Giữ tất cả, Trừ điều kiện là rỗng?
Xin cảm ơn rất nhiều!
) Làm thế nào để Lọc điều kiện là rỗng?
2) Giữ tất cả, Trừ điều kiện là rỗng?
Xin cảm ơn rất nhiều![/QUOTE]
Đầu tiên sửa code lại 1 chút
Đoạn[B] If Chk Then[/B] sửa thành [B]If Chk And FindStr <> "" Then[/B]
1> Lấy giá trị rổng, điều kiện là: cứ để trống bình thường
2> Lấy giá trị <> rổng, điều kiện là:: [B][W
———————-
[/B]Bạn bôi đen chữ[B] Like [/B]trong code, bấm [B]F1[/B] xem help để biết thêm chi tiết
[I](Nói thật, code này cũng khá hoàn chỉnh rồi nhưng tôi vẫn chưa hài lòng lắm —> Các bạn có điều kiện nghiên cứu hãy cải tiến giúp tôi với)[/I]
Cám ơn Thầy đã chỉ dạy! Riêng điều kiện [W thì em thử dùng điều kiện chỉ là [ nó vẫn cho ra giá trị đúng. Vậy có gì khác nhau không thưa Thầy?
Toán tử Like này rất hay nhưng cũng khá.. BAO LA… Tôi vẫn đang cố nắm bắt, có những cái vẫn chưa hiểu bạn à
(Tới đâu nghiên cứu tới đấy thôi)
Không hiểu sao, đối với File này, TRUE OR FALSE vẫn bị dính cái tiêu đề cột??? Không biết mình ghi sai cấu trúc gì?
Private Sub FillterRoroc() Roroc.[A19:F100].ClearContents Dim sArray1, Arr1 sArray1 = CSDL.Range(CSDL.[A1], CSDL.[A65536].End(xlUp)).Resize(, 12) Arr1 = Filter2DArray(sArray1, 10, "[", [COLOR=#0000cd][B]False[/B][/COLOR])[COLOR=#008000] '<< False hay True van dinh tieu de???[/COLOR] Roroc.[A19].Resize(UBound(Arr1, 1), 4).Value = Arr1 End SubKể cả hàm Unique:
Sub UniqueFALSE() Sheet2.Range("A2:D8").ClearContents Dim i As Long, sArray, Arr1, Arr2 sArray = Range(CSDL.[A1], CSDL.[A65536].End(xlUp)).Resize(, 9) Arr1 = Unique2DArray(sArray, 1, False) '<< False hay True van dinh tieu de??? If IsArray(Arr1) Then Sheet2.Range("A2").Resize(UBound(Arr1, 1), 4).Value = Arr1 End Sub
Thì sArray1 = CSDL.Range(CSDL., CSDL..End(xlUp)).Resize(, 12)
Bạn lấy dữ liệu từ A1, đương nhiên phải dính luôn tiêu đề rồi —> Chuyện thường
– Dữ liệu do bạn tự xác đính
– Dữ liệu ấy có bao gồm tiêu đề hay không cũng do bạn xác định
– Xác định sai, ra kết quả sai
Kết luận: Thay A1 thành A2 là hết chuyện
(hãy xem cách vận hành của chức năng Remove Duplicate hoặc Sort thì biết liền)
Không được đâu Thầy ơi, Thầy thử xem File sẽ thấy rằng A1 thành A2 là chưa đúng!
Tôi đã kiểm tra, hổng thấy cho nào là không đúng cả! Chỉ vì bạn hiểu sai nên kết quả sai
– Muốn lấy tiêu đề, đương nhiên dữ liệu sArray phải bao gồm luôn tiêu đề (tức bắt đầu từ A1)
– Không muốn lấy tiêu để, đương nhiêu dữ liệu sArray phải bỏ qua tiêu đề (tức bắt đầu từ A2)
Vậy:
1> Có lấy tiêu đề:
Sub FillterTRUE()
Roroc.[A19:F100].ClearContents
Dim sArray1, Arr1
sArray1 = CSDL.Range(CSDL.[[COLOR=#ff0000][B]A1[/B][/COLOR]], CSDL.[A65536].End(xlUp)).Resize(, 12)
Arr1 = Filter2DArray(sArray1, 10, "[", [COLOR=#ff0000][B]True[/B][/COLOR]) '<< False hay True van dinh tieu de???
Roroc.[A19].Resize(UBound(Arr1, 1), 4).Value = Arr1
End Sub
2> Không lấy tiêu đề:
Sub UniqueFALSE()
Sheet2.Range("A2:D8").ClearContents
Dim sArray, Arr1, Arr2
sArray = Range(CSDL.[[B][COLOR=#ff0000]A2][/COLOR][/B], CSDL.[A65536].End(xlUp)).Resize(, 9)
Arr1 = Unique2DArray(sArray, 1, [COLOR=#ff0000][B]False[/B][/COLOR])
If IsArray(Arr1) Then Sheet2.Range("A2").Resize(UBound(Arr1, 1), 4).Value = Arr1
End Sub
Đơn giản như khi bạn dùng chức năng sort của Excel thôi
——————————
Không có lỗi gì đâu sư phụ à! Chẳng qua minhthien chưa hiểu hàm này thôi
—————————–
Nói vậy là không đúng! Khi dùng sort của Excel, bạn không chỉ rõ thì làm sao nó biết bạn muốn lấy tiêu đề hay không? Và muốn lấy tiêu đề thì đương nhiên bạn phải chọn dữ liệu cho đúng! Bạn chọn sai thì ông Bill cũng chẳng hiểu nổi
(Đã nói bạn nghiên cứu sort mà không chịu nghe)
Minh thien sai làm lão chết tiệt lính quýnh sai theo à.
Giải thích lại:
Đối với sort:
– Nếu tô chọn cả tiêu đề: phải chọn "có tiêu đề"
– Nếu không tô chọn tiêu đề: phải chọn "không tiêu đề"Đối với 2 hàm của ta:
– Nếu tô chọn cả tiêu đề: cũng phải chọn "có tiêu đề"
– Nếu không tô chọn tiêu đề: cũng phải chọn "không tiêu đề"Khi thực hành sai:
– Nếu tô chọn cả tiêu đề mà chọn "Không tiêu đề": Dòng tiêu đề bị xem là dòng dữ liệu, và bị xử lý như là dữ liệu duy nhất hoặc dữ liệu thoả điều kiện lọc, và vẫn hiện ra.
– Nếu không tô chọn cả tiêu đề mà chọn "có tiêu đề": Dòng dữ liệu đầu bị xem là tiêu đề, và nếu dữ liệu đó trùng, sẽ bị hiện ra 1 lần nữa.Ý của Minh Thien lại khác, hắn muốn:
Dù lúc nào cũng tô chọn tiêu đề, nhưng:
– Nếu chọn "Có tiêu đê", Hàm – Thủ tục sẽ xử lý từ dòng 2 trở xuống
– Nếu chọn "Không tiêu đề", Hàm – thủ tục sẽ xử lý từ dòng 1 trở xuống.Nghĩa là MinhThien sai, và lão chết tiệt: ban đầu đúng, sau đó lính quýnh sai theo. (Chắc đói)
Kỹ năng giải quyết vấn đề hiệu quả
Mô tả Nội dung Đánh giá Tài nguyên KỸ NĂNG GIẢI QUYẾT VẤN ĐỀ HIỆU QUẢHiểu đúng vấn đề là một nửa của giải...
Xem khóa học
Bình luận