将名为Range的excel转换为行集合

时间:2014-09-09 10:25:28

标签: vba excel-vba collections multidimensional-array named-ranges

我目前有一个方法,它在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。

任何帮助,非常感谢。

1 个答案:

答案 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

注意:我没有看过边缘情况;例如,如果范围仅为一个单元格,则此操作将失败。由您决定。