【发布时间】:2021-08-06 08:32:42
【问题描述】:
我一直在尝试创建一个执行此操作的宏:
示例工作表:
1.将“A”、“B”和“C”列分别放入单独的集合中。
2.检查集合'A'项目是否包含“-”。
-
如果项目包含“-”,则删除所有 3 个集合中具有相同索引的项目。
-
然后将集合“A”卸载到“D”列中,并根据“B”列和“C”列集合是否相同的索引项值 =“”或不“=”来循环格式化单元格。
初始代码:
- 创建集合:
Function ReadRangeRowsToCollection(r As Range) As Collection
Dim iRow As Long
Dim iCol As Long
Dim rangeArr As Variant
Dim rowArr As Variant
Dim c As Collection
rangeArr = r.Value
Set c = New Collection
For iRow = 1 To r.Rows.Count
ReDim rowArr(1 To r.Columns.Count)
For iCol = 1 To r.Columns.Count
rowArr(iCol) = rangeArr(iRow, iCol)
Next iCol
c.Add rowArr, CStr(iRow)
Next iRow
Set ReadRangeRowsToCollection = c
End Function
- 检查集合:
Dim atid As Collection
Dim uzdar As Collection
Dim inv As Collection
Set inv = ReadRangeRowsToCollection(ws1.Range("A1", ws1.Cells(lRow, "A")))
Set atid = ReadRangeRowsToCollection(ws1.Range("B1", ws1.Cells(lRow, "B")))
Set uzdar = ReadRangeRowsToCollection(ws1.Range("C1", ws1.Cells(lRow, "C")))
Dim i As Integer
i = inv.Count
For x = i To 1 Step -1
If InStr(CStr(inv.item(x)), "-") > 0 Then
inv.Remove x
End If
Next x
遇到的问题:
如果我在集合循环中使用For Each 项目,我不知道在删除集合项目时如何正确循环,集合项目转移到集合顶部,For each 不支持从底部循环。
如果我使用For x= variable to 1 Step-1,我无法正确获取集合项的值并检查它是否包含“-”
我试图将我的“创建收藏”功能更改为:
Set c = New Collection
For iRow = 1 To r.Rows.Count
ReDim rowArr(1 To r.Columns.Count)
For iCol = 1 To r.Columns.Count
If Not InStr(rangeArr(iRow, iCol), "-") > 0 Then
rowArr(iCol) = rangeArr(iRow, iCol)
Else
GoTo praleist
End If
Next iCol
c.Add rowArr, CStr(iRow)
praleist:
Next iRow
但是,如何从其他集合中删除不需要的项目?
作为一个想法,转储剪切的“A”列集合,然后循环“查找”单元格并根据偏移单元格设置格式。虽然这不是一个理想的选择,因为原始工作表有 243 个工作表,100-2000 行。
感谢您的帮助和提示。
A、B、C 列在前面
E,F,G 列是期望的结果
【问题讨论】:
-
请添加您想要的输出截图
-
似乎可以用一个简单的过滤器(选择所有不包含连字符的行)来处理前三个步骤,而不是集合。而且我不太了解您的第四步 - 因此,根据您发布的输入,您的输出图片可能会有用。
-
添加了所需的输出@RonRosenfeld
-
你为什么需要收藏?正如我所写,检查您想要的结果,您可以通过简单的过滤器和复制/粘贴操作清楚地获得它。您可以在工作表上、使用 VBA 或在 Power Query 中执行此操作。
-
主要目标是遍历大约 200 张纸和 100-2000 行,并在一张纸中返回所需的输出。我认为使用集合是最快的方法。
标签: excel vba loops collections