vba通过字典检测某列的重复内容


vba通过字典检测某列的重复内容


----------------------------------------------------------------


Sub test_2()

   '--用来给重复项(包含第1次出现的内容)标色,通过测试

    Dim d, arr, i

    Set d = CreateObject("scripting.dictionary")

    Dim Hang  As Long

    Dim Lie As Long

    Dim Hang_QiShi As Long

    Dim ZhHang As Long

    Dim CiShu As Long

    With Worksheets("检测第M列的重复项")

        Lie = 13

        Hang_QiShi = 11

        ZhHang = .Cells(.Rows.Count, Lie).End(xlUp).Row

        arr = .Range(.Cells(Hang_QiShi, Lie), .Cells(ZhHang, Lie))                    '--可行

        For i = 1 To UBound(arr)

           d(arr(i, 1)) = d(arr(i, 1)) + 1

        Next

        

        For Hang = Hang_QiShi To ZhHang

            If d(.Cells(Hang, Lie).Value) > 1 Then

                 With .Cells(Hang, Lie)

                     .Interior.ColorIndex = 15                                   '--背景色

                     .Font.ColorIndex = 3                                       '--字体色

                 End With

            End If

        Next

    End With

End Sub

----------------------------------------------------------------

Sub test_3()

   '--用来给重复项(不包含第1次出现的内容)标色,通过测试

    Dim d, arr, i

    Set d = CreateObject("scripting.dictionary")

    Dim Hang  As Long

    Dim Lie As Long

    Dim Hang_QiShi As Long

    Dim ZhHang As Long

    Dim CiShu As Long

    With Worksheets("检测第M列的重复项")

        Lie = 13

        Hang_QiShi = 11

        ZhHang = .Cells(.Rows.Count, Lie).End(xlUp).Row

        arr = .Range(.Cells(Hang_QiShi, Lie), .Cells(ZhHang, Lie))                    '--可行

        For i = 1 To UBound(arr)

           d(arr(i, 1)) = d(arr(i, 1)) + 1

           Hang = i + 10

           If d(.Cells(Hang, Lie).Value) > 1 Then

                With .Cells(Hang, Lie)

                    .Interior.ColorIndex = 15                                   '--背景色

                    .Font.ColorIndex = 3                                       '--字体色

                End With

           End If

        Next

    End With

End Sub


----------------------------------------------------------------

Sub Macro1_2()

   '--判断某列的内容,出现的次数(包含第1次出现的内容)

    Dim arr

    Dim i As Long

    Dim d As Object

    Dim Hang  As Long

    Dim Lie As Long

    Dim Hang_QiShi As Long

    Dim ZhHang As Long

    Dim CiShu As Long

    

    Set d = CreateObject("scripting.dictionary")

    With Worksheets("检测第M列的重复项")

        Lie = 13                                                             '--需要检测的列号

        Hang_QiShi = 11                                                       '--从第几行开始检测(需要取出标题行)

        ZhHang = .Cells(.Rows.Count, Lie).End(xlUp).Row                            '--检测列的最后行

        arr = .Range(.Cells(Hang_QiShi, Lie), .Cells(ZhHang, Lie))                   '--将列+开始行+结束行的范围的内容,赋值给数组

        For i = 1 To UBound(arr)                                                '--对数组内容进行循环

           If Len(arr(i, 1)) = 0 Then

                Exit For

           End If

           d(arr(i, 1)) = d(arr(i, 1)) + 1

           Hang = i + 10

           Cells(Hang, Lie + 1).Value = d(arr(i, 1))                              '--因为hang变量,比i多10(既要去掉标题行开始)

        Next

    End With


End Sub

----------------------------------------------------------------


Sub Macro1_3()

   '--判断某列的内容,出现的次数(不包含第1次出现的内容)

    Dim arr

    Dim i As Long

    Dim d As Object

    Dim Hang  As Long

    Dim Lie As Long

    Dim Hang_QiShi As Long

    Dim ZhHang As Long

    Dim CiShu As Long

    

    Set d = CreateObject("scripting.dictionary")

    With Worksheets("检测第M列的重复项")

        Lie = 13                                                             '--需要检测的列号

        Hang_QiShi = 11                                                       '--从第几行开始检测(需要取出标题行)

        ZhHang = .Cells(.Rows.Count, Lie).End(xlUp).Row                            '--检测列的最后行

        arr = .Range(.Cells(Hang_QiShi, Lie), .Cells(ZhHang, Lie))                   '--将列+开始行+结束行的范围的内容,赋值给数组

        For i = 1 To UBound(arr)                                                '--对数组内容进行循环

           'If Len(arr(i, 1)) = 0 Then

           '     Exit For

           'End If

           d(arr(i, 1)) = d(arr(i, 1)) + 1

           Hang = i + 10

           If d(.Cells(Hang, Lie).Value) > 1 Then

                Cells(Hang, Lie + 1).Value = d(arr(i, 1))                              '--因为hang变量,比i多10(既要去掉标题行开始)

           End If

        Next

    End With


End Sub


----------------------------------------------------------------


整理后内容:


Public Sub jch01_05_明细表_页签_根据参数设置格式_重复项检测并标色()

    '---不包含第1次出现的内容

   '----<5.2重复项检测并标色>

    Set EL_App = GetObject(, "Excel.Application")

   '--用来给重复项(不包含第1次出现的内容)标色,通过测试

    YanSe_BeiJing_1 = RGB(176, 224, 230)                                             '--默认背景色(浅色)

    YanSe_BeiJing_2 = RGB(141, 182, 205)                                             '--默认中间边框色(浅色)

    Dim d, arr, i

    Set d = CreateObject("scripting.dictionary")

    Dim Hang  As Long

    Dim Hang_QiShi As Long

    Dim ZhHang As Long

    Dim Lie As Long

    Dim ZhLie As Long

    If EL_App.Worksheets("单据-设置").Cells(112, 118).Value = "是" Then

        With EL_App.Worksheets("jch01-05")

             ZhLie = .Cells(10, .Columns.Count).End(xlToLeft).Column

             For Lie = 1 To ZhLie

                 If .Cells(9, Lie).Value = "2.1重复项检测并标色" Then

                     .Cells(8, Lie).Value = Lie                                              '--填写检测列的列号

                      Hang_QiShi = 11

                      ZhHang = .Cells(.Rows.Count, Lie).End(xlUp).Row

                      arr = .Range(.Cells(Hang_QiShi, Lie), .Cells(ZhHang, Lie))                   '--可行

                      For i = 1 To UBound(arr)

                          If Len(arr(i, 1)) = 0 Then                                         '---不判断为空的内容(单元格为空不判断)

                               GoTo AAA

                          End If

                          '--给字典赋值

                          d(arr(i, 1)) = d(arr(i, 1)) + 1

                          Hang = i + 10

                          If d(.Cells(Hang, Lie).Value) > 1 Then

                              .Cells(Hang, Lie).Interior.Color = YanSe_BeiJing_1

                          End If

AAA:

                      Next

                      '--清空或重置字典,下次循环,重新赋值(如果用Set d = Nothing,则必须重新定义字典)

                      d.RemoveAll

                     '--清除动态数组,释放数组所用内存,只适用动态数组

                      Erase arr

                 

                 End If

             Next

        End With

    End If

    

    

End Sub


Public Sub jch01_05_明细表_页签_根据参数设置格式_重复项进行计数()

   '----<5.3重复项,后列标注重复次数>

    Set EL_App = GetObject(, "Excel.Application")

   '--'--判断某列的内容,出现的次数(不包含第1次出现的内容)

    YanSe_BeiJing_1 = RGB(176, 224, 230)                                             '--默认背景色(浅色)

    YanSe_BeiJing_2 = RGB(141, 182, 205)                                             '--默认中间边框色(浅色)

    Dim d, arr, i

    Set d = CreateObject("scripting.dictionary")

    Dim Hang  As Long

    Dim Hang_QiShi As Long

    Dim ZhHang As Long

    Dim Lie_1 As Long

    Dim Lie As Long

    Dim ZhLie As Long

    If EL_App.Worksheets("单据-设置").Cells(113, 118).Value = "是" Then

        With EL_App.Worksheets("jch01-05")

             ZhLie = .Cells(10, .Columns.Count).End(xlToLeft).Column

             For Lie_1 = 1 To ZhLie

                 If .Cells(9, Lie_1).Value = "2.2填写重复次数" Then

                      Lie = Val(.Cells(8, Lie_1).Value)                               '--获取计算重复项所在的列

                      If Lie > 0 Then

                          Hang_QiShi = 11

                          ZhHang = .Cells(.Rows.Count, Lie).End(xlUp).Row

                          arr = .Range(.Cells(Hang_QiShi, Lie), .Cells(ZhHang, Lie))      '--可行

                          For i = 1 To UBound(arr)

                               If Len(arr(i, 1)) = 0 Then                                          '---不判断为空的内容(单元格为空不判断)

                                    GoTo AAA

                               End If

                             '--给字典赋值

                               d(arr(i, 1)) = d(arr(i, 1)) + 1

                               Hang = i + 10

                               If d(.Cells(Hang, Lie).Value) > 1 Then

                                   .Cells(Hang, Lie_1).Value = d(arr(i, 1))           '--因为hang变量,比i多10(既要去掉标题行开始)

                               End If

AAA:

                          Next

                         '--清空或重置字典,下次循环,重新赋值(如果用Set d = Nothing,则必须重新定义字典)

                          d.RemoveAll

                         '--清除动态数组,释放数组所用内存,只适用动态数组

                          Erase arr

                      Else                                                       '--如果忘记填写对应列号,则

                          .Cells(8, Lie_1).Interior.Color = YanSe_BeiJing_2

                      End If

                 End If

             Next

        End With

    End If

End Sub



-----------------------------------------------------------------------------------

-----------------------------------------------------------------------------------



'--将重复数值中,第一次出现的重复值标色和不标色放到一起,根据需要调整

Public Sub jch01_05_明细表_页签_根据参数设置格式_重复项检测并标色_()

  '----<5.2重复项检测并标色>

    Dim EL_App As Object

    Dim YanSe_BeiJing_1

    Dim YanSe_BeiJing_2

    

    Set EL_App = GetObject(, "Excel.Application")

  '--用来给重复项(不包含第1次出现的内容)标色,通过测试

    YanSe_BeiJing_1 = RGB(176, 224, 230)                                     '--默认背景色(浅色)

    YanSe_BeiJing_2 = RGB(141, 182, 205)                                     '--默认中间边框色(浅色)

    Dim d, arr, i

    Set d = CreateObject("scripting.dictionary")

    Dim Hang  As Long

    Dim Hang_QiShi As Long

    Dim ZhHang As Long

    Dim Lie As Long

    Dim ZhLie As Long

    If EL_App.Worksheets("单据-设置").Cells(112, 118).Value = "是" Then

       With EL_App.Worksheets("jch01-05")

           ZhLie = .Cells(10, .Columns.Count).End(xlToLeft).Column

           For Lie = 1 To ZhLie

               If .Cells(9, Lie).Value = "2.1重复项检测并标色" Then

                  .Cells(8, Lie).Value = Lie                                       '--填写检测列的列号

                   Hang_QiShi = 11

                   ZhHang = .Cells(.Rows.Count, Lie).End(xlUp).Row

                   arr = .Range(.Cells(Hang_QiShi, Lie), .Cells(ZhHang, Lie))           '--可行

                  '--不包含第一次重复的数值------开始

'                   For i = 1 To UBound(arr)

'                      If Len(arr(i, 1)) = 0 Then                                 '--不判断为空的内容(单元格为空不判断)

'                          GoTo AAA

'                      End If

'                      d(arr(i, 1)) = d(arr(i, 1)) + 1                             '--给字典赋值

'                      Hang = i + 10

'                      If d(.Cells(Hang, Lie).Value) > 1 Then

'                         .Cells(Hang, Lie).Interior.Color = YanSe_BeiJing_1

'                      End If

'AAA:

'                   Next

                  '--不包含第一次重复的数值------结束

                  '----包含第一次重复的数值------开始

                   For i = 1 To UBound(arr)

                      If Len(arr(i, 1)) = 0 Then                                  '--不判断为空的内容(单元格为空不判断)

                          GoTo BBB

                      End If

                      d(arr(i, 1)) = d(arr(i, 1)) + 1                              '--给字典赋值

BBB:

                   Next

                   For Hang = Hang_QiShi To ZhHang

                      If d(.Cells(Hang, Lie).Value) > 1 Then

                        .Cells(Hang, Lie).Interior.Color = YanSe_BeiJing_1

                      End If

                   Next

                   '----包含第一次重复的数值------结束

                   '--清空或重置字典,下次循环,重新赋值(如果用Set d = Nothing,则必须重新定义字典)

                   d.RemoveAll

                 '--清除动态数组,释放数组所用内存,只适用动态数组

                   Erase arr

               End If

           Next

       End With

    End If

End Sub