Thắc mắc,góp ý hoàn thiện về hàm UDF Filter2DArray

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,614
Được thích
16,674
Giới tính
Nam
PHP:
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 Function

Hà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!
 

File đính kèm

  • LocRong&LocKhongRong.xls
    44.5 KB · Đọc: 142
PHP:
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![/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]
 
Lần chỉnh sửa cuối:
Upvote 0
Đầu tiên sửa code lại 1 chút
Đoạn If Chk Then sửa thành If Chk And FindStr <> "" Then
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à:: [\W
----------------------
Bạn bôi đen chữ Like trong code, bấm F1 xem help để biết thêm chi tiết
(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)

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?
 
Upvote 0
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)
 
Upvote 0
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ì?


Mã:
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 Sub

Kể cả hàm Unique:

Mã:
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
 

File đính kèm

  • Filter2DArray.xls
    91.5 KB · Đọc: 69
Lần chỉnh sửa cuối:
Upvote 0
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ì?


Mã:
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 Sub
Thì sArray1 = CSDL.Range(CSDL.[A1], CSDL.[A65536].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)
 
Upvote 0
Thì sArray1 = CSDL.Range(CSDL.[A1], CSDL.[A65536].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!
 

File đính kèm

  • Filter2DArray.xls
    97.5 KB · Đọc: 65
Upvote 0
Điên quá đi à!
Filter False và Unique False thì phải từ A2, Filter True và Unique True thì phải từ A1 chứ?
Để hết ở A1 cũng la làng, biểu đổi thì lại đổi hết qua A2 rồi la làng tiếp.
 
Lần chỉnh sửa cuối:
Upvote 0
Điên quá đi à!
Filter False và Unique False thì phải từ A2, Filter True và Unique True thì phải từ A1 chứ?
Để hết ở A1 cũng la làng, biểu đổi thì lại đổi hết qua A2 rồi vẫn la làng.

Trời ơi, Thầy nói vậy thì thêm Boolean làm gì chứ! Phải bao hết rồi có hay không do True hay False quyết định chứ!

Theo em nghĩ thì nếu giữ luôn A1 thì khi TRUE ta để nguyên, không thay đổi; khi FALSE thì giống như OFFSET(1) vậy.
 
Lần chỉnh sửa cuối:
Upvote 0
Trời ơi, Thầy nói vậy thì thêm Boolean làm gì chứ! Phải bao hết rồi có hay không do True hay False quyết định chứ!

Theo em nghĩ thì nếu giữ luôn A1 thì khi TRUE ta để nguyên, không thay đổi; khi FALSE thì giống như OFFSET(1) vậy.
Ừ nhỉ. Nhưng code ndu viết nào cộng nào trừ LBound, UBound, HasTitle tùm lum, chưa thấy lỗi chỗ nào.

Phát biểu sau đây sai:
Đã thấy lỗi Hàm Unique:
1. Thay If HasTitle Then thành If HasTitle = False Then
2. Thay
Mã:
        For j = LBound(TmpArr, 2) To UBound(TmpArr, 2)
          Arr(i - HasTitle + LBound(TmpArr, 1), j) = TmpArr(.Item(KeyArr(i)), j)
        Next

Bằng
Mã:
        For j = LBound(TmpArr, 2) To UBound(TmpArr, 2)
          Arr(i + LBound(TmpArr, 1), j) = TmpArr(.Item(KeyArr(i)), j)
        Next
 
Lần chỉnh sửa cuối:
Upvote 0
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 đề:
Mã:
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 đề:
Mã:
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
-----------------------------
Trời ơi, Thầy nói vậy thì thêm Boolean làm gì chứ! Phải bao hết rồi có hay không do True hay False quyết định chứ!

Theo em nghĩ thì nếu giữ luôn A1 thì khi TRUE ta để nguyên, không thay đổi; khi FALSE thì giống như OFFSET(1) vậy.
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)
 
Lần chỉnh sửa cuối:
Upvote 0
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)
 
Upvote 0
Ý kiến của em không sai đâu, em lấy một ví dụ cụ thể như sau: (sorry vì lấy hàm Unique để so sánh, hàm này của Sư phụ PTM):

PHP:
Function UniqueList2D(UniqueCol As Long, sArray)
  Dim ReArr()
  Dim iRw, iRws, iCols, iCol, iCount
  iRws = UBound(sArray, 1)
  iCols = UBound(sArray, 2)
  On Error Resume Next
  With CreateObject("Scripting.Dictionary")
        For iRw = 1 To iRws
          If sArray(iRw, UniqueCol) <> "" Then
            If Not .Exists(sArray(iRw, UniqueCol)) Then
                .Add sArray(iRw, UniqueCol), ""
                iCount = iCount + 1
                ReDim Preserve ReArr(1 To iCols, 1 To iCount)
                For iCol = 1 To iCols
                   ReArr(iCol, iCount) = sArray(iRw, iCol)
                Next
            End If
          End If
    Next
    UniqueList2D = Application.Transpose(ReArr)
  End With
End Function

Nếu lọc không trùng và lấy tiêu tiêu đề:

Mã:
Sub UniqueTRUE()

  Sheet2.Range("A2:D8").ClearContents
  
  Dim sArray, Arr
  
  sArray = Range(CSDL.[[COLOR=#ff0000][B]A1[/B][/COLOR]], CSDL.[A65536].End(xlUp)).Resize(, 9).Cells
  
  Arr = UniqueList2D(1, sArray)

  Sheet2.Range("A1").Resize(UBound(Arr, 1), 4).Value = Arr
  
End Sub

Nếu lọc không trùng và không lấy tiêu đề:

Mã:
Sub UniqueFALSE()

  Sheet2.Range("A2:D8").ClearContents
  
  Dim sArray, Arr
  
  sArray = Range(CSDL.[[COLOR=#ff0000][B]A2[/B][/COLOR]], CSDL.[A65536].End(xlUp)).Resize(, 9).Cells
  
  Arr = UniqueList2D(1, sArray)

  Sheet2.Range("A1").Resize(UBound(Arr, 1), 4).Value = Arr
  
End Sub

Ngay từ đầu, do ta chọn vùng dữ liệu và kết quả hoàn toàn chính xác.

Như vậy có cần thêm cái Boolean để tính toán hay không? Trong khi ngay ban đầu cũng đã chọn khối dữ liệu như vậy?
 

File đính kèm

  • Copy of Filter2DArray.xls
    61 KB · Đọc: 64
Upvote 0
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)
Theo em nghĩ thì trong sort phải như thế này chứ anh:
Đối với sort:
- Nếu đã tô chọn cả tiêu đề:
+ Khi chọn "có tiêu đề" => Hàm - thủ tục sẽ xử lý từ dòng 2 trở xuống.
+ Khi chọn "không tiêu đề" => Hàm - thủ tục sẽ xử lý từ dòng 1 trở xuống.
Không nhất thiết phải là: - Nếu tô chọn cả tiêu đề: phải chọn "có tiêu đề"
(Ý của minhthien không phải không có lý,về hàm của chú ndu thì không có ý kiến)
 
Upvote 0
Ban đầu tôi cũng cho rằng tham số đó là không cần thiết nên không đưa vào. Cơ sở lập luận của code này là: tiêu đề luôn luôn là text nhằm mô tả dữ liệu, theo tiêu chuẩn CSDL. Do đó tiêu đề và dữ liệu không bao giờ giống nhau.
Muốn lấy cả tiêu đề thì lấy range nguồn bao gồm cả dòng tiêu đề. Nghĩa là trong mọi trường hợp, code xử lý tất cả các dòng.

Còn ndu lập luận: Có thể tiêu đề là số từ 1 đến 10 chẳng hạn. Và giả sử lọc duy nhất theo cột 7, là 1 trường số.

1. Nếu không có tham số HasTitle, và có chọn dữ liệu nguồn có bao gồm dòng tiêu đề, thì dòng tiêu đề đương nhiên được lấy.
Sau đó, nếu 1 dòng dữ liệu nào đó, cột 7 có giá trị 7, thì dòng đó không được lấy nữa, vì trùng với dòng đầu tiên.


2. Nếu có tham số HasTitle, người dùng tuỳ biến theo ý muốn:
- Nếu chọn 1 vùng dữ liệu và chọn True, Code xử lý từ dòng thứ 2 trở xuống, sau đó mới add dòng 1 là tiêu đề vào.
- Nếu chọn 1 vùng dữ liệu và chọn False, Code xử lý tất cả các dòng như là dữ liệu

Note:
Cùng 1 lúc, và kể cả sau này, không lẽ chạy 1 lúc vừa True vừa False? Căn cứ vào dữ liệu nguồn và mẫu báo cáo kết quả, người dùng quyết định có nên lấy cả tiêu đề CSDL vào báo cáo hay không. Lúc đó người dùng sẽ chọn chỉ 1 trong 2, và xài luôn năm này qua năm khác chứ?

Đừng làm lão chết tiệt quýnh lên nữa nha.
 
Lần chỉnh sửa cuối:
Upvote 0
Theo em nghĩ thì trong sort phải như thế này chứ anh:
Đối với sort:
- Nếu đã tô chọn cả tiêu đề:
+ Khi chọn "có tiêu đề" => Hàm - thủ tục sẽ xử lý từ dòng 2 trở xuống.
+ Khi chọn "không tiêu đề" => Hàm - thủ tục sẽ xử lý từ dòng 1 trở xuống.
Không nhất thiết phải là: - Nếu tô chọn cả tiêu đề: phải chọn "có tiêu đề"
Nói lại cho rõ hơn:

1. Khi sort, và tô chọn dữ liệu bao gồm dòng tiêu đề, phải đánh dấu vào ô "My data range has header row", nếu không, tiêu đề cũng bị sort và chạy mất tiêu xuống dưới.
Vậy đối với hàm của ndu, khi tô chọn dữ liệu bao gồm dòng tiêu đề, phải chọn True.

2. Khi sort và không tô chọn dòng tiêu đề, phải đánh dấu vào ô "My data range has No header row", nếu không, Excel lấy dòng dữ liệu thứ nhất làm tiêu đề. Dòng đó không được sort nên dù là XXXX cũng nằm trên chữ AAA (ascending)
Và đối với hàm của ndu, khi tô chọn dữ liệu không bao gồm dòng tiêu đề, phải chọn False
 
Lần chỉnh sửa cuối:
Upvote 0
Như vậy có cần thêm cái Boolean để tính toán hay không? Trong khi ngay ban đầu cũng đã chọn khối dữ liệu như vậy?
Tạm gát qua 1 bên cái hàm Filter này, chỉ xin hỏi: Ý BẠN MUỐN SAO?
Có phải bạn muốn rằng: Nếu HasTitle = True thì lấy nguyên dữ liệu, ngược lại, HasTitle = False thì Offset dữ liệu xuống 1 dòng?
Nếu sửa lại hàm theo ý của bạn thì cùng lắm hàm này chỉ phục vụ cho có 1 mình bạn mà không có tính tổng quát... Lý do vì bạn mặc định rằng dữ liệu của bạn lúc nào cũng có tiêu đề
Đặt trường hợp dữ liệu của ai đó không có tiêu đề, vậy sẽ dùng hàm thế nào đây? Khi ấy dù HasTitle có = TRUE hay FALSE đều sai tất:
-----------------------
Tôi viết hàm này để xài tổng quát cho mọi dữ liệu (dựa trên cách vận hành của Sort)... Nếu vì phục vụ riêng cho công việc, bạn hãy tự mình sửa lại cho đúng ý mình thôi
 
Upvote 0
Tạm gát qua 1 bên cái hàm Filter này, chỉ xin hỏi: Ý BẠN MUỐN SAO?
Có phải bạn muốn rằng: Nếu HasTitle = True thì lấy nguyên dữ liệu, ngược lại, HasTitle = False thì Offset dữ liệu xuống 1 dòng?
Nếu sửa lại hàm theo ý của bạn thì cùng lắm hàm này chỉ phục vụ cho có 1 mình bạn mà không có tính tổng quát... Lý do vì bạn mặc định rằng dữ liệu của bạn lúc nào cũng có tiêu đề
Đặt trường hợp dữ liệu của ai đó không có tiêu đề, vậy sẽ dùng hàm thế nào đây? Khi ấy dù HasTitle có = TRUE hay FALSE đều sai tất:
-----------------------
Tôi viết hàm này để xài tổng quát cho mọi dữ liệu (dựa trên cách vận hành của Sort)... Nếu vì phục vụ riêng cho công việc, bạn hãy tự mình sửa lại cho đúng ý mình thôi

Không không, ý em là xem lại có thừa hay không khi ta chọn vùng dữ liệu, bao gồm tiêu đề và không tiêu đề.

Trên góc độ người dùng thì:

1) Nếu CSDL không có tiêu đề thì đương nhiên người dùng chọn tất cả.

2) Nếu CSDL có tiêu đề:

2.1) Muốn không lấy tiêu đề thì xuống 1 dòng.

2.2) Nếu có tiêu đề thì chọn đủ. Ở đây lại phát sinh: Nếu tiêu đề không trùng với dữ liệu thì OK, nếu trùng với dữ liệu thì bị xử lý luôn.

==> Như vậy, em đã hoàn toàn hiểu mục đích của Thầy NDU khi đặt cái TIÊU ĐỀ vào rồi.

Em không thắc mắc gì nữa về vụ này nữa!

Cám ơn Thầy NDU và Sư phụ PTM nhiều!
 
Upvote 0
Không không, ý em là xem lại có thừa hay không khi ta chọn vùng dữ liệu, bao gồm tiêu đề và không tiêu đề.

Trên góc độ người dùng thì:

1) Nếu CSDL không có tiêu đề thì đương nhiên người dùng chọn tất cả.

2) Nếu CSDL có tiêu đề:

2.1) Muốn không lấy tiêu đề thì xuống 1 dòng.

2.2) Nếu có tiêu đề thì chọn đủ. Ở đây lại phát sinh: Nếu tiêu đề không trùng với dữ liệu thì OK, nếu trùng với dữ liệu thì bị xử lý luôn.

==> Như vậy, em đã hoàn toàn hiểu mục đích của Thầy NDU khi đặt cái TIÊU ĐỀ vào rồi.

Em không thắc mắc gì nữa về vụ này nữa!

Cám ơn Thầy NDU và Sư phụ PTM nhiều!
Xin nói thêm
- Hàm này không chỉ dùng trên Range mà còn cho mọi Array... Bạn có từng nghĩ đến việc Filter dữ liệu trên ComboBox hoặc ListBox không? Giống từ điển ấy ---> Nó làm gì có tiêu đề
- Nếu gọi là THỪA thì thằng Microsoft cũng phải xem lại chức năng Sort và Remove Duplicate
-----------------------------
Nói chung, tôi đã nghiên cứu rất kỹ, thí nghiệm rất kỹ mới viết hàm này và tin rằng nó đã hoạt động hợp logic
Cái mà chúng ta cần nghiên cứu cải tiến đối với hàm này không phải ở mấy cái tham số mà nên xem liệu nó có hoạt động đúng trên 1 điều kiện đặc biết nào đó không
 
Upvote 0
Đầu tiên sửa code lại 1 chút
Đoạn If Chk Then sửa thành If Chk And FindStr <> "" Then
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à:: [\W
----------------------
Bạn bôi đen chữ Like trong code, bấm F1 xem help để biết thêm chi tiết
(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)

Làm ơn cho em hỏi, làm thế nảo để lọc loại trừ một điều kiện? Ví dụ như trong điều kiện là loại trừ người có tên B trong cột Tên, thì lấy giá trị tất cả mà không có tên B.

Dựa theo toán tử LIKE, em đã làm như sau:

Arr1 = Filter2DArray(sArray1, 1, "[!B", False)

Thì tất cả các tên có chứa chữ B bị loại khỏi mảng

Nếu em muốn loại trừ số 1000 ra khỏi mảng em làm như sau:

Arr1 = Filter2DArray(sArray1, 2, "[!1000", False)

Kết quả lại cho tất cả các số nào có 1 đứng đầu sẽ bị loại.

Vậy muốn lọc đúng như ý muốn thì phải làm sao ạ?
 
Upvote 0
Web KT
Back
Top Bottom