Преобразование 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
Примечание: я не смотрел на крайние случаи; например, это не удастся, если диапазон только одна ячейка. До вас, чтобы исправить это.