【发布时间】:2018-06-08 14:28:26
【问题描述】:
我需要从一个矩阵中收集一个唯一的文本列表(在我的例子中为“J19:BU500”,其中包含重复项)并将其粘贴到同一张表的列中(在我的例子中为 DZ 列)。
我需要为同一个工作簿中的多张工作表循环。我是 VBA 的新手,从互联网上获得了这段代码,并根据我的要求进行了一些定制。但我的代码有两个问题:
当说表 5 中的矩阵为空时,代码可以正常运行到表 4,并在表 5 处引发运行时错误并停止而不进一步循环到下一个表。
另外,我实际上希望唯一列表从单元格“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。有没有解决方案...因为这是在工作表循环中。我不希望代码退出,但需要跳到下一个循环,即下一个工作表。