在子程序启动时,VBA全局变量复位为0

时间:2016-01-04 05:33:28

标签: excel vba excel-vba

我正在编写一个使用全局变量的项目。全局变量在模块的开头声明,并且所有代码都在同一模块中。全局变量(应该)在每个子例程之间传递,并且由于工作表的性质,它们的值在不同的子例程或函数中声明,具体取决于所需的。

我的问题是每次调用子程序时,我的全局变量都会重置为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

其他子系统调用子DrawWall来绘制所需的形状。只有当我点击调用子程序的按钮(或者我从代码编辑窗口启动子程序)时,调用DrawWall时似乎没有重置值。

1 个答案:

答案 0 :(得分:1)

事实证明,一旦包含这些命令的子例程完成,创建和删除OLEObject(用作输入框)就会导致全局变量重置。 (非常感谢@Rory找到那个。)不幸的是,在你开始下一个子程序之前,监视窗口不会更新值(我不知道为什么)。我可能会考虑使用类而不是类型,以便无论如何都存储变量。

感谢大家的帮助!