2

我目前有一种方法可以在 excel 中接收动态命名范围并将其转换为二维数组。

如果某个列包含值,我需要对数据进行一些迭代并执行 Delete 函数。我已经查看了使用转置和临时数组删除二维数组中的行的选项,并且由于我的数据相当大,我正在查看其他数据结构,这些数据结构可以更轻松地删除整行。

我想将动态命名范围转换为 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 将是一个 sub,它将根据该行的索引删除给定的行。我想摆脱这种情况,只能说像 srcCollection.Remove(index) 这样的东西,索引是第 nr 行。

任何帮助,非常感谢。

4

1 回答 1

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

注意:我没有看过边缘情况;例如,如果范围仅为一个单元格,这将失败。由你来修复它。

于 2014-09-09T10:53:38.250 回答