Сброс глобальной переменной VBA в 0 при запуске подпрограммы

Я пишу проект, который использует глобальные переменные. Глобальные переменные объявляются в начале модуля, и весь код находится в одном модуле. Глобальные переменные (должны) передаваться между каждой подпрограммой и, в зависимости от характера рабочего листа, их значения объявляются в разных подпрограммах или функциях, в зависимости от того, что требуется.

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

Есть ли что-нибудь очевидное, что может быть причиной этого? Мой код довольно большой (более 1200 строк), и публиковать здесь нецелесообразно.

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

Спасибо

Дэн

РЕДАКТИРОВАТЬ: декларация переменных

Public Type Blockwall
Asd As Single           'max area of reinforcement allowed
Ast As Single           'Area of reinforcement in design tension zone
Bar As Integer          'bar size
Capacity As Single      'Calculated capacity of wall usign Ast
cover As Single         'cover to reinforcement
d As Single             'Depth to centre of tension steel
Depth As Single         'Thickness of wall/footing
DesignMoment As Single  'Design Moment in base of wall
DL As Load              'Dead Load force
LL As Load              'Live Load Force
fc As Single            'Compressive strength of concrete/grout
fm  As Single           'compressive strength of masonry
fsy As Single           'Design stress of steel
Height As Single        'Total height of wall/Length of Footing (sorry it is confusing)
Height190 As Single     'Height of 190 blockwork
Height290 As Single     'Height of 290 blockwork
Moment25 As Single      'moment 25% from the top
Moment50 As Single      'Moment 50% from the top
Moment75 As Single      'Moment 75% from the top
Phi As Single           'Capacity reduction factor
Spacing As Single       'Bar Spacing
X As Single             'Distance of resultant vertical force (Rotation Check)
End Type

Dim Wall As Blockwall
Dim Footing As Blockwall

и фрагмент подпрограммы, где переменной Footing.Depth присваивается значение (обратите внимание, что это единственное место, где ей присваивается значение):

Public Sub DrawWall(fLength As Single, fHeight As Single, kLength As Single, kHeight As Single, _
wHeight As Single, distToKey As Single, distToWall As Single, fBeta As Single, fPhi As Single, _
fDensity As Single, nBeta As Single, nPhi As Single, nDensity As Single, LL As Single, Height290 As Single)

'***---ASSIGN VALUES TO GLOBAL VARIABLES---***
Footing.Depth = fHeight
Footing.Height = fLength

Sub DrawWall вызывается другими подпрограммами для рисования необходимых фигур. Кажется, он не сбрасывает значения при вызове DrawWall, только когда я нажимаю на кнопку, которая вызывает подпрограмму (или я запускаю подпрограмму из окна редактирования кода).

1 ответ

Оказывается, что создание и удаление OLEObjects (используемых в качестве полей ввода) приводило к сбросу глобальных переменных после завершения подпрограммы, содержащей эти команды. (Большое спасибо @Rory за его нахождение.) К сожалению, окно просмотра не обновляет значение, пока вы не запустите следующую подпрограмму (я понятия не имею, почему). Я, вероятно, рассмотрю использование классов вместо типов, чтобы переменные сохранялись независимо.

Спасибо всем за вашу помощь!

Дэн

Другие вопросы по тегам