Страницы: 1
RSS
VBA: Заполнение двумерного динамического массива
 
Коллеги, добрый день,

Есть выгрузка данных, несколько столбцов. По определенному условию мне необходимо заполнить массив Cell.Value и Cell.Offset( ,-11).Value, но я что-то делаю не так, потому что VBA выдает syntax error.

Мой код:
Код
Sub Vacations2()
    Dim arrAnotherMonth(), iDatesRange As Range, i%
    Columns.EntireColumn.Hidden = False
    Rows.EntireRow.Hidden = False
    iLastRow = Sheets(1).Cells(Rows.Count, 1).End(xlUp).row
    Set iDateRange = Sheets(1).Range("Q2:Q" & iLastRow)
    For Each Cell In iDateRange
        If Month(Cell.Value) <> Month(Cell.Offset(, -1)) Then
            ReDim Preserve arrAnotherMonth(0 To i, 0 To i)
            arrAnotherMonth(i) = Cell.Value()
            arrAnotherMonth(, i) = Cell.Offset(, -11).Value()
            i = i + 1
        End If
    Next Cell
    Debug.Print Join(arrAnotherMonth, "; ")
End Sub
Я файл не прикладываю, не ругайте сильно, по-моему можно без примера.
Смотрел здесь, но мне не подходит решение, т.к. это не диапазон, а отдельные значения.

Спасибо.
Изменено: Framed - 15.07.2019 12:33:04
 
Изменять можно только последнюю мерность массива , а вы пытаетесь изменить все мерности:
Код
ReDim Preserve arrAnotherMonth(0 To i, 0 To i)

пример: если массив имеет вид array(5,5), то изменить можно только так
Код
i=7
redim Preserwe array(5,i)
"Все гениальное просто, а все простое гениально!!!"
 
Доброе время суток.
Цитата
Framed написал:
что VBA выдает syntax error
Ошибка в синтаксисе здесь
Цитата
Framed написал:
arrAnotherMonth(, i)
Плюс ошибки
Цитата
Framed написал:
arrAnotherMonth(i)
Так как выше массив объявлен как двумерный
Цитата
Framed написал:
ReDim Preserve arrAnotherMonth(0 To i, 0 To i)
Здесь две ошибки.
Preserve допускает изменение только последнего индекса размерности.
Preserve нельзя использовать, если ранее массив не был создан ReDim arrAnotherMonth(1 to 100, 1 to 2) например.
 
При больших размерах обрабатываемых массивов, это
Код
ReDim Preserve
вообще не оправдано, лучще перезаписать существующия массив, а потом выгрузить на лист, только перезаписанные данные с помощью
Код
 Resize
"Все гениальное просто, а все простое гениально!!!"
 
Андрей VG, спасибо за замечания.
Nordheim, вам тоже спасибо. Массив не такой уж большой, 227 значений получилось, выгрузка за полгода. Resize, в итоге, я и хочу использовать.

В общем, задача полностью выглядит так: у меня есть данные по отпускам, и две колонки с датами - одна это дата начала отпуска, вторая это дата конца отпуска. Суть в том, что если месяца не одинаковые (например, я вышел в отпуск в июле, и пришел из отпуска в августе) - то я хочу, чтобы в самом низу создалась еще одна строка с датой конца отпуска.

Звучит просто, если бы я хотел собрать только эти значения, но есть параллельная колонка с персональным номером сотрудников. Я мог бы создать еще один одномерный динамический массив, или же перезаписать существующий, но я сейчас пробую записать сразу обе колонки в один и выгрузить два списка на лист.

Выше текст написал на всякий случай, вдруг кому интересно. :)
 
Забираете все данные в массив, затем вводите переменную счетчик, по условию увеличиваете переменную-счетчик на один, и записываете в существующий массив данные, которые этому условию удовлетворяют.Определяете последнюю пустую строку на листе. выгружаете перезаписанный массив.  В итоге будет  Resize(переменная-счетчик, количество перезаписанных столбцов). Это кратко, без файла примера.
Изменено: Nordheim - 15.07.2019 14:12:01
"Все гениальное просто, а все простое гениально!!!"
 
А еще короче - создайте тему  с названием, отражающим проблему. По двумерному массиву ответ получен
Страницы: 1
Наверх