Страница: 1 |
Страница: 1 |
Вопрос: Не удаётся вторично обрезать массив.
Добавлено: 18.11.08 18:11
Автор вопроса: Somes
Добрые сутки, уважаемые.
Собственно сама задача была в следующем:
Есть два столбца, первый и второй грубо говоря. В первом - кодовое обозначение, во втором - буквенное. Два типа записей - если код цифровой - акция, если символьно-цифровой - вексель. Хотелось вывести два листбокса, в каждом список буквенных обозначений соответствующего типа.
Как хотелось решать: Сформировать два двумерных массива, заполненных парами значений - адрес строки : содержимое ячейки буквенного обозначения.
Соответственно код (на событие инициализация формы):
Dim ActionsArray(), VekselsArray() As Variant
Dim FirstColumn As Range
Dim CurCell As Object
Dim Count1, Count2, RowsCount As Integer
ListBox1.ColumnCount = 2
ListBox2.ColumnCount = 2
'Убирается отображение номера строки
ListBox1.ColumnWidths = "0;"
ListBox2.ColumnWidths = "0;"
'Предельное значение для выхода из For Each
RowsCount = ActiveSheet.UsedRange.Rows.Count
'Установка размерности массивов "с запасом"
ReDim ActionsArray(RowsCount, 2)
ReDim VekselsArray(RowsCount, 2)
Set FirstColumn = Range(Application.Columns(1).Address)
For Each CurCell In FirstColumn
'Если вышли за пределы значимой области - выйти из цикла
If CurCell.Row >= RowsCount Then
Exit For
End If
'Проверки цифрового кода, заполнение массивов
If Len(CurCell.Value) > 0 And Val(CurCell.Value) > 0 Then
If IsNumeric(CurCell.Value) Then
ActionsArray(Count1, 0) = CurCell.Row
ActionsArray(Count1, 1) = Cells(CurCell.Row, 2)
Count1 = Count1 + 1
Else
VekselsArray(Count2, 0) = CurCell.Row
VekselsArray(Count2, 1) = Cells(CurCell.Row, 2)
Count2 = Count2 + 1
End If
End If
Next
'Заполняем листбоксы значениями
ListBox1.List = ActionsArray
ListBox2.List = VekselsArray
End Sub
Данный код работает, однако в листбоксах фигурирует множество пустых строк, от которых хотелось избавиться. Избавляться я пытался вызовом ReDim, непосредственно после цикла, с указанием счетчиков Count1 и Count2 в качестве верхней границы первого измерения, однако упорно получал "Subscript out of range". Как же привести глубину первого измерения массивов в соответствие с колличеством значимых элементов?
Ответы
Всего ответов: 5
Номер ответа: 1
Автор ответа:
Father
Вопросов: 0
Ответов: 159
Профиль | | #1
Добавлено: 18.11.08 18:34
Redim Preserve ActionsArray(Count1 - 1, 2)?
Номер ответа: 2
Автор ответа:
Somes
Вопросов: 3
Ответов: 7
Профиль | | #2
Добавлено: 18.11.08 18:37
В последнем абзаце я описал именно этот вызов, также описал результат. Сount1 - 1 в том числе.
Номер ответа: 3
Автор ответа:
Nytrogen
Вопросов: 18
Ответов: 186
Профиль | | #3
Добавлено: 18.11.08 18:43
Скажу Вам так: удалять побочные эффекты своей же программы после её выполнения - это никуда не годится. Ответ где-то на поверхности, и запрятан скорее всего в Ваших If'ах. Выполните процедуру пошагово (нажатиями клавиши F8), отслеживая, как выполняются условия, и ответ всплывёт сам.
Номер ответа: 4
Автор ответа:
Somes
Вопросов: 3
Ответов: 7
Профиль | | #4
Добавлено: 18.11.08 19:16
Условия выполняется ровно до первого вхождения ReDim Preserve.
Номер ответа: 5
Автор ответа:
Somes
Вопросов: 3
Ответов: 7
Профиль | | #5
Добавлено: 18.11.08 19:33
Наткнулся в процессе творческого поиска:
Что в принципе даёт ответ на мой вопрос.