Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Не удаётся вторично обрезать массив. Добавлено: 18.11.08 18:11  

Автор вопроса:  Somes
Добрые сутки, уважаемые.

Собственно сама задача была в следующем:
Есть два столбца, первый и второй грубо говоря. В первом - кодовое обозначение, во втором - буквенное. Два типа записей - если код цифровой - акция, если символьно-цифровой - вексель. Хотелось вывести два листбокса, в каждом список буквенных обозначений соответствующего типа.
Как хотелось решать: Сформировать два двумерных массива, заполненных парами значений - адрес строки : содержимое ячейки буквенного обозначения.

Соответственно код (на событие инициализация формы):
Private Sub UserForm_Initialize()
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
Наткнулся в процессе творческого поиска:
Обратите внимание! Можно изменять только последнее измерение многомерного массива, когда используется ключевое слово Preserve.

Что в принципе даёт ответ на мой вопрос.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам