我目前有一个方法,它在excel中获取动态命名范围并将其转换为2D数组。
如果某个列包含值,我需要对数据进行一些迭代并执行Delete函数。我已经查看了使用transpose和temp数组删除2d数组中的行的选项,因为我的数据相当大,我正在寻找其他数据结构,这样可以更容易地删除整行。
我想将动态命名范围转换为vba中的集合。此集合将具有行号的键,而项目应具有该行的所有数据。基本上我需要能够迭代该范围内的每个值,就像我可以用2D数组一样,但也能够有效地删除行,并且比使用2D数组更轻松。
有人知道如何实现这个目标吗?
Dim srcArray () As Variant
Dim srcRange As Range
srcRange = ThisWorkbook.Worksheets("Main").Range("myNamedRange")
srcArray = srcRange.Value
Dim rowNr As Long
dim colNr As Long
for rowNr = 1 to UBound(srcArray,1)
if srcArray(rowNr, 9) = "testString" Then Call DeleteRowSub(srcArray, rowNr)
Next rowNr
DeleteRowSub将是一个子类,它将根据该行的索引删除给定的行。我想摆脱它,只能说srcCollection.Remove(index),索引是行nr。
任何帮助,非常感谢。
答案 0 :(得分:3)
这不是秘密。这只是家务。
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
'Read range content to Variant array
rangeArr = r.Value
'Now transfer shit to collection
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 c As Collection
Set c = ReadRangeRowsToCollection(Range("myNamedRange"))
c.Remove 1 ' remove first row from collection
注意:我没有看过边缘情况;例如,如果范围仅为一个单元格,则此操作将失败。由您决定。