Преобразование Excel с именем Range в коллекцию строк

В настоящее время у меня есть метод, который принимает динамический именованный диапазон в Excel и преобразует его в 2D-массив.

Мне нужно сделать несколько итераций с данными и выполнить функцию удаления, если определенный столбец содержит значение. Я рассмотрел варианты удаления строк в 2d массиве с использованием transpose и temp array, и поскольку мои данные довольно большие, я смотрю на другие структуры данных, которые облегчили бы удаление целых строк.

Я хочу преобразовать динамический именованный диапазон в коллекцию в VBA. У этой коллекции будет ключ номер строки, и как элемент должен иметь все данные для этой строки. По сути, мне понадобится возможность перебирать каждое значение в этом диапазоне, как я могу сделать с двумерным массивом, а также возможность эффективно и с меньшими трудностями удалять строки, чем при использовании двумерного массива.

У кого-нибудь есть идеи, как мне этого добиться?

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), где index - это строка nr.

Любая помощь, высоко ценится.

1 ответ

Решение

В этом нет секрета. Это просто уборка.

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

Примечание: я не смотрел на крайние случаи; например, это не удастся, если диапазон только одна ячейка. До вас, чтобы исправить это.

Другие вопросы по тегам