Thêm lựa chọn cho hàm Unique2DArray của Thầy ndu96081631 (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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,662
Được thích
16,720
Giới tính
Nam
Từ hàm lọc duy nhất mảng 2 chiều của Thầy ndu96081631 dưới đây, tôi rất cảm ơn Thầy vì đã giải quyết được rất nhiều trường hợp lọc duy nhất trong mảng:

PHP:
Option Explicit
''***************************************************************************''
'' GiaiphapExcel.com ********************************************************''
'' Ham Unique2DArray - Tac gia: ndu96081631 *********************************''
Function Unique2DArray(ByVal sArray, ByVal ColIndex As Long, ByVal HasTitle As Boolean)
  Dim TmpArr, KeyArr, Tmp, i As Long, j As Long, Arr
  On Error Resume Next
  TmpArr = sArray
  ColIndex = ColIndex + LBound(TmpArr, 2) - 1
  With CreateObject("Scripting.Dictionary")
    For i = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1)
      Tmp = TmpArr(i, ColIndex)
      If Not .Exists(Tmp) And Tmp <> "" Then .Add Tmp, i
    Next
    If .Count Then
      KeyArr = .Keys
      ReDim Arr(LBound(KeyArr) + LBound(TmpArr, 1) To UBound(KeyArr) - HasTitle + LBound(TmpArr, 1), LBound(TmpArr, 2) To UBound(TmpArr, 2))
      For i = LBound(KeyArr) To UBound(KeyArr)
        For j = LBound(TmpArr, 2) To UBound(TmpArr, 2)
          Arr(i - HasTitle + LBound(TmpArr, 1), j) = TmpArr(.Item(KeyArr(i)), 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
      Unique2DArray = Arr
    End If
  End With
End Function


Tuy nhiên một nhu cầu cũng rất cần thiết và chính đáng là có thể ta lọc ở cột này, nhưng nhận giá trị ở một hoặc một nhóm cột liên tục cần thiết, không nhất thiết lọc cả mảng rồi nhận giá trị của tất cả các cột đã lọc.

Vì thế, tôi xin mạn phép Thầy
ndu96081631 thêm chức năng lựa chọn 1 hoặc một nhóm cột (liên tục) trong mảng đã lọc:

Mã:
Function NewUnique2DArray(ByVal SrcArray As Variant, _
                          Optional ByVal ColIndex As Variant, _
                          Optional ByVal HasTitle As Variant, _
                          Optional ByVal startCol As Variant, _
                          Optional ByVal endCol As Variant)
      
      If IsArray(SrcArray) Then
            Dim TmpArr, KeyArr, Arr, Tmp, r As Long, c As Long
            Dim i As Long, j As Long, SCol As Long, ECol As Long
            Dim Upset As Boolean: Upset = False
            
            TmpArr = SrcArray
            i = UBound(TmpArr, 2): j = LBound(TmpArr, 2)

            Select Case HasTitle
                  Case True: HasTitle = True
                  Case Else: HasTitle = False
            End Select
            
            ColIndex = Abs(Int(Val(ColIndex)))
            If ColIndex > i Or ColIndex = 0 Then ColIndex = 1
            ColIndex = ColIndex + j - 1
            
            startCol = Abs(Int(Val(startCol)))
            If startCol > i Then startCol = i
            endCol = Abs(Int(Val(endCol)))
            If endCol > i Then endCol = i
            
            If startCol = 0 And endCol = 0 Then
                  startCol = j: endCol = i
                  SCol = j: ECol = i
            ElseIf startCol = 0 And endCol = 1 Then
                  startCol = j: SCol = j: ECol = j
            ElseIf startCol = 0 And endCol > 1 Then
                  startCol = j: SCol = j
                  ECol = endCol - j + 1
            ElseIf startCol > 0 And endCol = 0 Then
                  endCol = startCol: SCol = j: ECol = j
            Else
                  If startCol > endCol Then
                        Upset = True
                        SCol = endCol: ECol = startCol
                        startCol = SCol: endCol = ECol
                  End If
                  SCol = j: ECol = endCol - startCol + 1
            End If
            
            Dim Handle As Long: Handle = Upset * (endCol + startCol - j + 1)
            
            With CreateObject("Scripting.Dictionary")
                  For r = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1)
                        Tmp = TmpArr(r, ColIndex)
                        If Not .Exists(Tmp) And Tmp <> "" Then .Add Tmp, r
                  Next
                  If .Count Then
                        KeyArr = .Keys
                        Dim F As Long, L As Long
                        F = LBound(KeyArr) + LBound(TmpArr, 1)
                        L = UBound(KeyArr) - HasTitle + LBound(TmpArr, 1)
                        ReDim Arr(F To L, startCol To endCol)
                        For r = LBound(KeyArr) To UBound(KeyArr)
                              For c = startCol To endCol
                                    Arr(r - HasTitle + LBound(TmpArr, 1), c) = TmpArr(.Item(KeyArr(r)), Abs(c + Handle))
                              Next
                        Next
                        If HasTitle Then
                              For c = startCol To endCol
                                    Arr(LBound(TmpArr, 1), c) = TmpArr(LBound(TmpArr, 1), Abs(c + Handle))
                              Next
                        End If
                        ReDim Preserve Arr(F To L, SCol To ECol)
                        NewUnique2DArray = Arr
                  End If
            End With
            Erase Arr, TmpArr, KeyArr
      Else
            NewUnique2DArray = SrcArray
      End If
End Function

Thay vì ghi ra công thức phải bắt buộc ghi đầy đủ các lựa chọn, thì tôi chỉ bắt buộc ghi trong công thức vùng mảng cần lọc, còn những mục khác nếu có thì điền vào.

Cấu trúc và cách sử dụng hàm:

1) Nếu chỉ lọc duy nhất ở cột đầu tiên và xuất ra tất cả các giá trị đã lọc thì công thức chỉ là:
PHP:
= NewUnique2DArray(SrcArray)

2) Các cách lọc khác như hàm Unique2DArray (của Thầy ndu96081631)

3) Chọn lọc cột đã lọc trong mảng:

- Nếu lấy 1 cột (vd cột 8) thì công thức:
PHP:
= NewUnique2DArray(A1:J83, 3, True, 8)

- Nếu chỉ trích nhóm cột từ 4 đến 6 thì công thức sẽ là:
PHP:
= NewUnique2DArray(A1:J83, 3, TRUE, 4, 6)

- Nhưng nếu ta đão cột từ 7 về 3 thì ta làm như sau:
PHP:
= NewUnique2DArray(A1:J83, 3, TRUE, 7, 3)

Tôi đã ghi cách sử dụng rất rõ trong file, các bạn tham khảo nhé!

Trong chừng mực kiến thức có hạn, nếu có lỗi phát sinh hoặc có những cải tiến mới, xin các bạn vui lòng góp ý và hoàn thiện để nó trở nên tiện ích hơn.

Trân trọng.
 

File đính kèm

Tôi lại cải tiến thêm 1 lựa chọn, với hàm vừa rồi đã gửi, tôi thấy nó rất rõ ràng khi chọn chữ hoa, chữ thường, vì vậy khi lọc duy nhất nếu không muốn 1 lúc 3 em: HOÀNG TRỌNG NGHĨA, Hoàng Trọng Nghĩa, hoàng trọng nghĩa, cùng xuất hiện một lúc thì làm theo cải tiến sau:

Mã:
Option Explicit
''***************************************************************************''
'' GiaiphapExcel.com ********************************************************''
'' Nguon tu ham Unique2DArray cua Thay ndu96081631 **************************''
'' Ham Loc duy nhat NewUnique2DArray nay duoc cai tien boi Hoang Trong Nghia ''
''***************************************************************************''

Function NewUnique2DArray(ByVal SrcArray As Variant, _
                          Optional ByVal ColIndex As Variant, _
                          [COLOR=#ff0000]Optional ByVal isUcase As Boolean = False, _[/COLOR]
                          Optional ByVal HasTitle As Variant, _
                          Optional ByVal startCol As Variant, _
                          Optional ByVal endCol As Variant)
      [COLOR=#0000cd]'Dòng màu đỏ ở trên nếu không chọn gì hết, thì mặc định là False, tức lọc mà không phân biệt Hoa, thường.[/COLOR]
      If IsArray(SrcArray) Then
            Dim TmpArr, KeyArr, Arr, Tmp, r As Long, c As Long
            Dim i As Long, j As Long, SCol As Long, ECol As Long
            Dim Upset As Boolean: Upset = False
            
            TmpArr = SrcArray
            i = UBound(TmpArr, 2): j = LBound(TmpArr, 2)

            Select Case HasTitle
                  Case True: HasTitle = True
                  Case Else: HasTitle = False
            End Select
            
            ColIndex = Abs(Int(Val(ColIndex)))
            If ColIndex > i Or ColIndex = 0 Then ColIndex = 1
            ColIndex = ColIndex + j - 1
            
            startCol = Abs(Int(Val(startCol)))
            If startCol > i Then startCol = i
            endCol = Abs(Int(Val(endCol)))
            If endCol > i Then endCol = i
            
            If startCol = 0 And endCol = 0 Then
                  startCol = j: endCol = i
                  SCol = j: ECol = i
            ElseIf startCol = 0 And endCol = 1 Then
                  startCol = j: SCol = j: ECol = j
            ElseIf startCol = 0 And endCol > 1 Then
                  startCol = j: SCol = j
                  ECol = endCol - j + 1
            ElseIf startCol > 0 And endCol = 0 Then
                  endCol = startCol: SCol = j: ECol = j
            Else
                  If startCol > endCol Then
                        Upset = True
                        SCol = endCol: ECol = startCol
                        startCol = SCol: endCol = ECol
                  End If
                  SCol = j: ECol = endCol - startCol + 1
            End If
            
            Dim Handle As Long: Handle = Upset * (endCol + startCol - j + 1)
            
            With CreateObject("Scripting.Dictionary")
                 'Nếu True thì sẽ phân biệt chữ hoa, chữ thường, ngược lại thì gom chung:
[COLOR=#ff0000]                  If isUcase Then
                        .CompareMode = vbBinaryCompare
                  Else
                        .CompareMode = vbTextCompare
                  End If[/COLOR]
                  For r = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1)
                        Tmp = TmpArr(r, ColIndex)
                        If Not .Exists(Tmp) And Tmp <> "" Then .Add Tmp, r
                  Next
                  If .Count Then
                        KeyArr = .Keys
                        Dim F As Long, L As Long
                        F = LBound(KeyArr) + LBound(TmpArr, 1)
                        L = UBound(KeyArr) - HasTitle + LBound(TmpArr, 1)
                        ReDim Arr(F To L, startCol To endCol)
                        For r = LBound(KeyArr) To UBound(KeyArr)
                              For c = startCol To endCol
                                    Arr(r - HasTitle + LBound(TmpArr, 1), c) = TmpArr(.Item(KeyArr(r)), Abs(c + Handle))
                              Next
                        Next
                        If HasTitle Then
                              For c = startCol To endCol
                                    Arr(LBound(TmpArr, 1), c) = TmpArr(LBound(TmpArr, 1), Abs(c + Handle))
                              Next
                        End If
                        ReDim Preserve Arr(F To L, SCol To ECol)
                        NewUnique2DArray = Arr
                  End If
                   [COLOR=#008000]'giải phóng bộ nhớ cho Dic:[/COLOR]
                 [COLOR=#ff0000] .RemoveAll[/COLOR]
            End With
            Erase Arr, TmpArr, KeyArr
      Else
            NewUnique2DArray = SrcArray
      End If
End Function

Như vậy, hàm giờ đây cấu trúc sẽ thay đổi:

Công thức:

PHP:
CongThuc = NewUnique2DArray(SrcArray, [ColIndex], [isUcase], [HasTitle], [startCol], [endCol])

Các tham chiếu trong ngoặc vuông ([...]) là không bắt buộc nếu không cần thiết.
 
Upvote 0
Tôi lại cải tiến thêm 1 lựa chọn, với hàm vừa rồi đã gửi, tôi thấy nó rất rõ ràng khi chọn chữ hoa, chữ thường, vì vậy khi lọc duy nhất nếu không muốn 1 lúc 3 em: HOÀNG TRỌNG NGHĨA, Hoàng Trọng Nghĩa, hoàng trọng nghĩa, cùng xuất hiện một lúc thì làm theo cải tiến sau:

Mã:
Option Explicit
''***************************************************************************''
'' GiaiphapExcel.com ********************************************************''
'' Nguon tu ham Unique2DArray cua Thay ndu96081631 **************************''
'' Ham Loc duy nhat NewUnique2DArray nay duoc cai tien boi Hoang Trong Nghia ''
''***************************************************************************''

Function NewUnique2DArray(ByVal SrcArray As Variant, _
                          Optional ByVal ColIndex As Variant, _
                          [COLOR=#ff0000]Optional ByVal isUcase As Boolean = False, _[/COLOR]
                          Optional ByVal HasTitle As Variant, _
                          Optional ByVal startCol As Variant, _
                          Optional ByVal endCol As Variant)

Gì chứ!
Thay vì
Mã:
Optional ByVal isUcase As Boolean = False
Ta sửa thành
Mã:
ByVal isUcase As [COLOR=#ff0000]VbCompareMethod[/COLOR]
Và ngay chổ
Mã:
If isUcase Then
  .CompareMode = vbBinaryCompare
Else
  .CompareMode = vbTextCompare
End If
Ta viết thành
Mã:
.CompareMode = [B]isUcase[/B]
có phải khỏe không?
Xài Dictionary phải biết tận dụng tất cả các thuộc tính và phương thức của nó
 
Upvote 0
Gì chứ!
Thay vì
Mã:
Optional ByVal isUcase As Boolean = False
Ta sửa thành
Mã:
ByVal isUcase As [COLOR=#ff0000]VbCompareMethod[/COLOR]
Và ngay chổ
Mã:
If isUcase Then
  .CompareMode = vbBinaryCompare
Else
  .CompareMode = vbTextCompare
End If
Ta viết thành
Mã:
.CompareMode = [B]isUcase[/B]
có phải khỏe không?
Xài Dictionary phải biết tận dụng tất cả các thuộc tính và phương thức của nó

Thầy dùng từ "gì chứ!" nghe thật lạ lạ hihihii, đúng là mỗi người có một chủ quan! Em xin nói chủ quan của Thầy trước khi dùng VbCompareMethod này!

Trước tiên, VbCompareMethod là một dạng Type (List constants) mà VBA đã có sẳn.

VbCompareMethod này có 3 giá trị:

0-vbBinaryCompare

1-vbTextCompare

2-vbDatabaseCompare

Các thông số 0, 1, 2 là số đại diện nếu trong hàm ta không ghi được tên của chúng thì ta vẫn thông số này thay tên gọi.

Dù có Dictionary hay không có thì thử khai báo gì đó thử gõ vbC sau chữ As nó sẽ xổ cái list ra và có chứa VbCompareMethod này. Như vậy, nó không thuộc về Dictionary.


Mặt khác, Dictionary với việc phân biệt CHỮ HOA và Chữ Thường chỉ có 2 thông số! Hoặc là CÓ hoặc là KHÔNG không có lấn cấn gì thêm cả!

Mặc định của Dictionary.CompareMode luôn luôn là vbBinaryCompare (luôn luôn phân biệt chữ thường chữ hoa).

Dictionary.CompareMode chỉ có 2 giá trị vbBinaryCompare vbTextCompare (phân biệt không phân biệt)

Khi thay thế bằng số nó tương đương với 0 và 1; mặc dù vậy, nếu nhập số nguyên dương khác 0 thì nó luôn luôn trả về dạng vbTextCompare.

Cho nên khi khai báo ByVal isUcase As VbCompareMethod là hoàn toàn chưa chính xác!

Nói có sách, mách có chứng, chúng ta cùng test một thủ tục về Dictionary.CompareMode để thấy rõ điều này:

Mã:
Sub Test()
      Dim sArray, i As Long, KeyArr, Arr
      sArray = Sheet1.Range("A1:A15").Value
      With CreateObject("Scripting.Dictionary")
      
[COLOR=#0000cd][B]'            VbCompareMethod:
'-----------------------------------------------------
'            .CompareMode = vbBinaryCompare     '(0)
'            .CompareMode = vbTextCompare       '(1)
'            .CompareMode = vbDatabaseCompare   '(2)
'            .CompareMode = 5                   '(Any As Integer)
'-----------------------------------------------------
            [/B][/COLOR]
            For i = 1 To UBound(sArray, 1)
                  Tmp = sArray(i, 1)
                  If Not .Exists(Tmp) And Tmp <> "" Then .Add Tmp, i
            Next
            If .Count Then
                  KeyArr = .Keys
                  ReDim Arr(1 To .Count, 1 To 1)
                  For i = LBound(.Keys) To UBound(.Keys)
                        Arr(i + 1, 1) = KeyArr(i)
                  Next
                  Sheet1.Range("H2").Offset(, .CompareMode).Resize(.Count) = Arr
            End If
            .RemoveAll
      End With
End Sub

Đầu tiên ta thí nghiệm không cần chọn lựa CompareMode gì cả, mặc định của nó luôn là vbBinaryCompare sau đó lần lượt ta bỏ các dấu nháy rồi chạy thủ tục để kiểm tra từng mục hiển thị trên sheet thế nào rồi so sánh.

KẾT LUẬN:

Với Dictionary.CompareMode chỉ có 2 giá trị vbBinaryCompare vbTextCompare

Việc Thầy hướng dẫn khai báo ByVal isUcase As VbCompareMethod không phải thuộc tính hay phương thức nào của Dictionary và chỉ là "thuận gió bẻ măng" mà thôi.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Rồi, em xin nói chủ quan của em. Quan điểm của em khi khai báo hàm thường có nhiều lựa chọn, và những lựa chọn không cần thiết em thường dùng Optional Byval. Em không cứng nhắc khi để người dùng phải điền đầy đủ thông số trong hàm.

Dù biết là biến Boolean (False/True) hay Long, hay bất cứ thứ gì khác, em vẫn thường khai trong hàm là biến Variant, em biết là khai như vậy có lẽ bộ nhớ của máy sẽ dành cho nó là lớn nhất và ít nhiều gì cũng làm cho sự tính toán chậm lại. Nhưng em vẫn chủ quan chọn Variant!

Lý giải cho việc này em muốn người dùng trong quá trình thao tác nếu bị sai, chưa đúng thì những thủ tục bẫy lỗi của em sẽ làm giảm thiểu sai lầm của họ hơn là khi làm phát sinh lỗi mà người dùng không biết đó là lỗi phát sinh từ đâu. Ý em là nếu anh nhập chính xác cái điều anh cần làm thì hàm sẽ trả về kết quả chính xác, nhưng nếu anh nhập sai, thì kết quả cho ra một cách tương đối (về dạng mặc định) mà không bị lỗi phát sinh, báo lỗi lung tung gây khó chịu cho người dùng.

Vì thế cái hàm này của Thầy ndu96081631 em đã thêm một số tiện ích và khai báo "khác người" như vậy cũng là Chủ quan của em, nhưng thật sự cốt lõi của hàm vẫn là tư duy và trí tuệ của Thầy mà em được thừa hưởng.

Đây là cải tiến mới nhất, ngắn gọn hơn tí xíu:

Mã:
Option Explicit
''***************************************************************************''
'' GiaiphapExcel.com ********************************************************''
'' Nguon tu ham Unique2DArray cua Thay ndu96081631 **************************''
'' Ham Loc duy nhat NewUnique2DArray nay duoc cai tien boi Hoang Trong Nghia ''
''***************************************************************************''

'Ham loc duy nhat theo cot va xuat ket qua nhom cot can thiet:
Function NewUnique2DArray(ByVal SrcArray As Variant, _
                 Optional ByVal UniqueColumn As Variant, _
                 Optional ByVal UCaseAsBoolean As Variant, _
                 Optional ByVal TitleAsBoolean As Variant, _
                 Optional ByVal startCol As Variant, _
                 Optional ByVal endCol As Variant)
      
      If IsArray(SrcArray) Then
            Dim TmpArr, KeyArr, Arr, Tmp, r As Long, c As Long
            Dim i As Long, j As Long, SCol As Long, ECol As Long
            Dim Upset As Boolean: Upset = False
            
            TmpArr = SrcArray
            i = UBound(TmpArr, 2): j = LBound(TmpArr, 2)
            
            UCaseAsBoolean = IIf(UCaseAsBoolean = True, True, False)
            TitleAsBoolean = IIf(TitleAsBoolean = True, True, False)
            
            UniqueColumn = Abs(Int(Val(UniqueColumn)))
            If UniqueColumn > i Or UniqueColumn = 0 Then UniqueColumn = 1
            UniqueColumn = UniqueColumn + j - 1
            
            startCol = Abs(Int(Val(startCol)))
            If startCol > i Then startCol = i
            endCol = Abs(Int(Val(endCol)))
            If endCol > i Then endCol = i
            
            If startCol = 0 And endCol = 0 Then
                  startCol = j: endCol = i
                  SCol = j: ECol = i
            ElseIf startCol = 0 And endCol = 1 Then
                  startCol = j: SCol = j: ECol = j
            ElseIf startCol = 0 And endCol > 1 Then
                  startCol = j: SCol = j
                  ECol = endCol - j + 1
            ElseIf startCol > 0 And endCol = 0 Then
                  endCol = startCol: SCol = j: ECol = j
            Else
                  If startCol > endCol Then
                        Upset = True
                        SCol = endCol: ECol = startCol
                        startCol = SCol: endCol = ECol
                  End If
                  SCol = j: ECol = endCol - startCol + 1
            End If
            
            Dim Handle As Long: Handle = Upset * (endCol + startCol - j + 1)
            
            With CreateObject("Scripting.Dictionary")
                  .CompareMode = IIf(UCaseAsBoolean, vbBinaryCompare, vbTextCompare) '0 & 1
                  For r = LBound(TmpArr, 1) - TitleAsBoolean To UBound(TmpArr, 1)
                        Tmp = TmpArr(r, UniqueColumn)
                        If Not .Exists(Tmp) And Tmp <> "" Then .Add Tmp, r
                  Next
                  If .Count Then
                        KeyArr = .Keys
                        Dim F As Long, L As Long
                        F = LBound(KeyArr) + LBound(TmpArr, 1)
                        L = UBound(KeyArr) - TitleAsBoolean + LBound(TmpArr, 1)
                        ReDim Arr(F To L, startCol To endCol)
                        For r = LBound(KeyArr) To UBound(KeyArr)
                              For c = startCol To endCol
                                    Arr(r - TitleAsBoolean + LBound(TmpArr, 1), c) = TmpArr(.Item(KeyArr(r)), Abs(c + Handle))
                              Next
                        Next
                        If TitleAsBoolean Then
                              For c = startCol To endCol
                                    Arr(LBound(TmpArr, 1), c) = TmpArr(LBound(TmpArr, 1), Abs(c + Handle))
                              Next
                        End If
                        ReDim Preserve Arr(F To L, SCol To ECol)
                        NewUnique2DArray = Arr
                  End If
                  .RemoveAll
            End With
            Erase Arr, TmpArr, KeyArr
      Else
            NewUnique2DArray = SrcArray
      End If
End Function

Cũng nói rõ vấn đề

ByVal isUcase As VbCompareMethod thật sự em không cập nhật. Thay vì gõ nguyên cụm từ bằng tiếng Anh (chưa chắc dịch được 2 từ vbBinaryCompare và vbTextCompare là cái gì, huống chi nó cho ta 3 lựa chọn (khuyến mãi cho thằng vbDatabaseCompare này). Với 2 lựa chọn thì tốt nhất ta dùng True hoặc False là ổn rồi, hoặc 0 và 1 nếu làm biếng gõ True/ False.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
KẾT LUẬN:

Với Dictionary.CompareMode chỉ có 2 giá trị vbBinaryCompare vbTextCompare

Việc Thầy hướng dẫn khai báo ByVal isUcase As VbCompareMethod không phải thuộc tính hay phương thức nào của Dictionary và chỉ là "thuận gió bẻ măng" mà thôi.
Lại tầm bậy nữa!
Thế Nghĩa đã nghiên cứu Dictionary kỹ chưa? Nghiên cứu bằng các vào Tools\References và check mục Microsoft Scripting Runtime ấy


Untitled.jpg
 
Lần chỉnh sửa cuối:
Upvote 0
Lại tầm bậy nữa!
Thế Nghĩa đã nghiên cứu Dictionary kỹ chưa? Nghiên cứu bằng các vào Tools\References và check mục Microsoft Scripting Runtime ấy


View attachment 91841

Thế em hỏi Thầy, ở đây chỉ so sánh chữ thường chữ hoa, vậy thêm thuộc tính DatabaseCompare làm gì? Và không khác gì với TextCompare? Vã lại cái hàm chỉ cần 2 thuộc tính Phân biệt hay Không phân biệt thì 3 lựa chọn sẽ như thế nào?
 
Upvote 0
Thế em hỏi Thầy, ở đây chỉ so sánh chữ thường chữ hoa, vậy thêm thuộc tính DatabaseCompare làm gì? Và không khác gì với TextCompare? Vã lại cái hàm chỉ cần 2 thuộc tính Phân biệt hay Không phân biệt thì 3 lựa chọn sẽ như thế nào?
Đây là những hằng số của VB, đương nhiên khi tạo ra nó, MS phải tính đến việc dùng nó vào việc gì đó
Theo như tôi được biết thì vbDataBaseCompare không dùng trên Excel nhưng lại được dùng trên Access.
Khi hàm hoạt động trên Excel, ta dùng vbTextComparevbBinaryCompare thôi cũng có chết thằng Tây nào đâu
Nghĩa có từng nghĩ đến việc xây dựng hàm hoạt động được trên mọi ứng dụng không? Dùng được trên Access, Word, Excel và cả VB... Hay chỉ xây dựng hàm dùng riêng cho Excel thôi?
 
Upvote 0
Đây là những hằng số của VB, đương nhiên khi tạo ra nó, MS phải tính đến việc dùng nó vào việc gì đó
Theo như tôi được biết thì vbDataBaseCompare không dùng trên Excel nhưng lại được dùng trên Access.
Khi hàm hoạt động trên Excel, ta dùng vbTextComparevbBinaryCompare thôi cũng có chết thằng Tây nào đâu
Nghĩa có từng nghĩ đến việc xây dựng hàm hoạt động được trên mọi ứng dụng không? Dùng được trên Access, Word, Excel và cả VB... Hay chỉ xây dựng hàm dùng riêng cho Excel thôi?

Em không nghĩ trên Access nó lại cần dùng hàm này, bởi nó có công cụ GROUP BY, DISTINCT sẽ giúp lọc nhanh chóng.

Nói thì nói vậy, em luôn biết THẦY có tính tổng quát, nhưng em lại muốn nó xác định CÓ hay KHÔNG mà thôi, nên chỉ chọn 2 thuộc tính và không muốn có sự nhầm lẫn nào khác.

Thôi thì em cứ để đó, ai xài kiểu nào thì xài, và nếu thích thì tự chỉnh sửa theo ý của mình phải không?
 
Upvote 0
Em không nghĩ trên Access nó lại cần dùng hàm này, bởi nó có công cụ GROUP BY, DISTINCT sẽ giúp lọc nhanh chóng.

Sao lại không cần!
Chẳng phải hàm tôi viết tham chiếu đến 1 Array sao? Mà Array thì hoạt động ở môi trường nào mà chẳng được, chẳng hạn 1 list nằm trên ListBox của form
-----------
Đế có thời gian tôi sẽ cải tiến lại hàm này không phải như cách mà nghĩa đang làm đâu ---> Nó sẽ dựa trên cách vận hành của Advanced Filter ấy, tức là lọc gì đó trên 1 CSDL và trích ra bao nhiêu field tùy ý
 
Lần chỉnh sửa cuối:
Upvote 0
Sao lại không cần!
Chẳng phải hàm tôi viết tham chiếu đến 1 Array sao? Mà Array thì hoạt động ở môi trường nào mà chẳng được, chẳng hạn 1 list nằm trên ListBox của form
-----------
Đế có thời gian tôi sẽ cải tiến lại hàm này không phải như cách mà nghĩa đang làm đâu ---> Nó sẽ dựa trên cách vận hành của Advanced Filter ấy, tức là lọc gì đó trên 1 CSDL và trích ra bao nhiêu field tùy ý

Đúng là ý em đang tiến tới đó đấy, cũng định dựa trên cái ParaArray gì đó mà em mới biết bài rồi, có thể sẽ là bước cải tiến.

Cũng có thể dùng một mảng Array(1, 3, 5 , 9) với 1, 3, 5 , 9 là các cột cần rút trích ra, rồi dùng vòng lặp quét qua số cột rồi chạy trên mảng v.v...
 
Upvote 0
Web KT

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

Back
Top Bottom