【问题标题】:Unique list from a matrix to a single column从矩阵到单列的唯一列表
【发布时间】:2018-06-08 14:28:26
【问题描述】:

我需要从一个矩阵中收集一个唯一的文本列表(在我的例子中为“J19:BU500”,其中包含重复项)并将其粘贴到同一张表的列中(在我的例子中为 DZ 列)。

我需要为同一个工作簿中的多张工作表循环。我是 VBA 的新手,从互联网上获得了这段代码,并根据我的要求进行了一些定制。但我的代码有两个问题:

  1. 当说表 5 中的矩阵为空时,代码可以正常运行到表 4,并在表 5 处引发运行时错误并停止而不进一步循环到下一个表。

  2. 另外,我实际上希望唯一列表从单元格“DZ10”开始。如果我这样做,唯一列表的数量将减少 10。例如,有 25 个唯一列表,只有 15 个从单元格“DZ10”开始粘贴,而所有 25 个从单元格“DZ1”开始粘贴。

代码:

Public Function CollectUniques(rng As Range) As Collection

    Dim varArray As Variant, var As Variant
    Dim col As Collection

    If rng Is Nothing Or WorksheetFunction.CountA(rng) = 0 Then
        Set CollectUniques = col
        Exit Function
    End If

    If rng.Count = 1 Then 
        Set col = New Collection
        col.Add Item:=CStr(rng.Value), Key:=CStr(rng.Value)
    Else 

        varArray = rng.Value
        Set col = New Collection

        On Error Resume Next

            For Each var In varArray
                If CStr(var) <> vbNullString Then
                    col.Add Item:=CStr(var), Key:=CStr(var)
                End If
            Next var

        On Error GoTo 0
    End If

    Set CollectUniques = col

End Function

Public Sub WriteUniquesToNewSheet()

    Dim wksUniques As Worksheet
    Dim rngUniques As Range, rngTarget As Range
    Dim strPrompt As String
    Dim varUniques As Variant
    Dim lngIdx As Long
    Dim colUniques As Collection
    Dim WS_Count As Integer
    Dim I As Integer
    Set colUniques = New Collection

    WS_Count = ActiveWorkbook.Worksheets.Count
    For I = 3 To WS_Count
     Sheets(I).Activate

    Set rngTarget = Range("J19:BU500")
    On Error GoTo 0
    If rngTarget Is Nothing Then Exit Sub '<~ in case the user clicks Cancel

    Set colUniques = CollectUniques(rngTarget)

    ReDim varUniques(colUniques.Count, 1)
    For lngIdx = 1 To colUniques.Count
        varUniques(lngIdx - 1, 0) = CStr(colUniques(lngIdx))
    Next lngIdx

    Set rngUniques = Range("DZ1:DZ" & colUniques.Count)
    rngUniques = varUniques

    Next I

    MsgBox "Finished!"

End Sub

非常感谢任何帮助。谢谢你

【问题讨论】:

  • 问题①:你在哪一行得到错误,它说什么?对于问题②,请尝试Set rngUniques = Range("DZ10").Resize(RowSize:=colUniques.Count)
  • 您有一个 On Error GoTo 0 没有 On Error Resume Next ???并将这些整数更改为 Long。
  • 感谢 PEH...查询 2 的答案工作正常。关于查询 1,错误位于“ReDim varUniques(colUniques.Count, 1)”。错误消息:“运行时错误'91':对象变量或未设置块变量”。
  • @VJ。这可能意味着colUniques 什么都不是,因此没有.Count。你可以通过If colUniques Is Nothing Then Exit Sub 之类的东西来捕捉它 • 你检查了rngTarget 是否什么都不是,但那不可能什么都不是,因为你对它进行了硬编码Set rngTarget = Range("J19:BU500"),因此检查也毫无用处,On Error GoTo 0 没有On Error Goto/Resume 也毫无用处.
  • @PEH。有没有解决方案...因为这是在工作表循环中。我不希望代码退出,但需要跳到下一个循环,即下一个工作表。

标签: vba excel


【解决方案1】:
  1. 您需要选择正确数量的单元格来填充数组中的所有数据。喜欢Range("DZ10").Resize(RowSize:=colUniques.Count)
  2. 该错误可能意味着colUniques 什么都不是,因此没有.Count。所以在使用之前先测试一下是不是Nothing

你最终会得到如下的结果:

Public Sub WriteUniquesToNewSheet()
    Dim wksUniques As Worksheet
    Dim rngUniques As Range, rngTarget As Range
    Dim strPrompt As String
    Dim varUniques As Variant
    Dim lngIdx As Long
    Dim colUniques As Collection
    Dim WS_Count As Integer
    Dim I As Integer
    Set colUniques = New Collection

    WS_Count = ActiveWorkbook.Worksheets.Count

    For I = 3 To WS_Count
        Sheets(I).Activate

        Set rngTarget = Range("J19:BU500")
        'On Error GoTo 0 'this is pretty useless without On Error Resume Next
        If rngTarget Is Nothing Then Exit Sub 'this is never nothing if you hardcode the range 2 lines above (therefore this test is useless)

        Set colUniques = CollectUniques(rngTarget)

        If Not colUniques Is Nothing Then
            ReDim varUniques(colUniques.Count, 1)
            For lngIdx = 1 To colUniques.Count
                varUniques(lngIdx - 1, 0) = CStr(colUniques(lngIdx))
            Next lngIdx

            Set rngUniques = Range("DZ10").Resize(RowSize:=colUniques.Count)
            rngUniques = varUniques
        End If
    Next I

    MsgBox "Finished!"
End Sub

【讨论】:

    猜你喜欢
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    相关资源
    最近更新 更多