Страницы: 1
RSS
Проблема инициализации динамического массива
 
Добрый день.
Есть модуль, в рамках которого описаны пользовательский тип. Объявлен динамический массив пользовательского типа, процедура и функция.
Процедура в ходе работы вызывает функцию. В функции идёт работа этого массива.
После завершения работы функции - массив обнуляется.

Вот часть кода ():
Код
Type OneCredit
CreditProduct As String 
BCIName As String 
End Type

Public ACH() As OneCredit 

Public Sub LoadBKI()
Call BKI(10)
End Sub

Public Function BKI(startrow As Integer)
ReDim ACH(0)
While Cells(e, 4) <> ""
 ReDim Preserve ACH(UBound(ACH) + 1)
Wend
BKI = 1
End Function



Внутри функции происходит корректное расширение, заполнение массива, но когда функция выполняется и возвращается в процедуру - массив не инициализирован. ACH() <Out of context>
 
В этом коде все нормально.

Создайте новый файл, в нем — модуль, и вставьте туда это:
Код
Type OneCredit
    CreditProduct As String
    BCIName As String
End Type

Public ACH() As OneCredit

Public Sub LoadBKI()
    Call BKI(10)
End Sub

Sub test()
    MsgBox UBound(ACH)
End Sub

Public Function BKI(startrow As Integer)
    ReDim ACH(0)
    For i = 1 To 3
        ReDim Preserve ACH(UBound(ACH) + 1)
    Next
    BKI = 1
End Function


Запустите сначала LoadBKI, а потом test
Увидите MSGBOX со значением 3 (ничего не обнулилось)

Ищите проблему в той части кода, которую вы не опубликовали.
 
Изменю вопрос:
Что может влиять на обнуление массива в процедуре, если в функции всё нормально?
Весь файл - это порядка 15 модулей кода бессмысленного и безкомментарного (остался от предыдущих сотрудников).
 
Надо просматривать все ветви кода, имеющие отношение к данному массиву. Где-то он явно обнуляется принудительно.
Ошибка Out of context означает, что пытаетесь вызвать процедуру, которая вне области видимости.
Цикл у Вас вообще бессмысленный(полагаю, приведен не полностью):
Код
While Cells(e, 4) <> ""
 ReDim Preserve ACH(UBound(ACH) + 1)
Wend


Значение переменной "е" не изменяется - цикл вечный.
Скорее задумывалось так:
Код
Public Function BKI(startrow As Integer)
    ReDim ACH(0)
    e = startrow
    While Cells(e, 4) <> ""
        ReDim Preserve ACH(UBound(ACH) + 1)
        e = e +1
    Wend
    BKI = 1
End Function
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Проблему решил в стиле всего кода - ряд локальных массивов и функция с парамктром входного массива.

The_Prist, внутри цикла идёт много заполнений массива, в том числе и изменение "e". я пофиксил всё, что бы не отвлекало, т.к. внутри функции всё ок.

Массив и тип я создал собственноручно, что бы структурировать разбросанные переменные, так что в других ветказ массив ни где не фигурирует.
 
может вы просто добавили в наблюдение публичный массив, находясь внутри функции?

отладчик тут не понимает и показывает out of context.. по выходу из функции.

достаточно отредактировать наблюдение, поставив там для всех модулей для всех процедур.
Живи и дай жить..
 
А можно вот про это по подробнее???
 
вот так примерно
Живи и дай жить..
 
Спасибо. Сложно быть несведующим.

Тему можно закрывать.
Страницы: 1
Наверх