什么时候VBA变量实例化

时间:2016-04-20 18:00:53

标签: vba variables scope

我犹豫不决,但没有文件可以找到的VBA

相关(但我不认为是欺骗):

我认为我正在使用“实例化”这个词,但如果我错了,请纠正我。 实例化是指创建变量并分配所需资源的时间?所以在VBA中我看到了两种方法。

顶部的一切!

Public Sub ToTheTop()
    Dim var1 As Long
    Dim var2 As Long
    Dim var3 As Long

    var1 = 10
    var2 = 20
    var3 = var1 + var1
    Debug.Print var3
End Sub

或接近使用

Public Sub HoldMeCloser()
    Dim var1 As Long
    var1 = 10
    Dim var2 As Long
    var2 = 20
    Dim var3 As Long

    var3 = var1 + var1
    Debug.Print var3
End Sub

我喜欢让它们更接近使用,以便更容易记住它们是什么,而其他人可能希望将它们全部放在一边。这是个人偏好。

但是,我想我记得在某个地方读过VBE经过一个子/函数并实例化所有变量,然后继续其他。这表明在VBA中没有正确的方法,因为变量范围及时不会改变。不是Private vs Public中的范围。

而在其他语言中,范围似乎可以根据展示位置进行更改,因此最佳实践

我一直在寻找这个文档已经有一段时间了,但是我正在使用的任何单词并没有指向正确的方向,或者文档不存在。

2 个答案:

答案 0 :(得分:3)

根据reference documentation

  

当程序开始运行时,所有变量都被初始化。数字变量初始化为零,可变长度字符串初始化为零长度字符串(""),固定长度字符串填充由ASCII字符代码0表示的字符或者Chr(0)。变量变量初始化为Empty。用户定义的类型变量的每个元素都被初始化,就像它是一个单独的变量一样。

     

声明对象变量时,空间在内存中保留,但在使用Set语句为其分配对象引用之前,其值将设置为Nothing。

这意味着无论陈述变量声明的位置如何,在输入过程时,它的空间/内存都是分配。

答案 1 :(得分:1)

变量,常量和对象以这样的方式实例化:

  • 模块级别,它们在应用程序启动时被实例化,无论它们是被声明为publicprivate还是static

    < / LI>
  • 过程级别(子/函数),它们在执行过程时被实例化。

您必须明白,虽然它确实有“编译器”,但 vba不是真正的编译语言。编译器是一种语法检查器,用于检查代码中的错误,以便在运行时不会遇到错误。在MS访问中,编译器会生成一些名为 p-code 的内容,它是编译解释代码的组合。

根据经验:

  • 始终使用option explicit语句(为此配置编译器)

  • 总是在模块或子/函数顶部的一个地方声明变量,并且为了清楚起见,避免在代码中间执行。这不会以任何方式影响性能。

  • 避免使用variant数据类型

值得阅读的文档: Understanding the Lifetime of Variables(官方mSDN),Visual/Access Basic Is Both a Compiler and an Interpreter(官方MS)和Declaring variables。你可能也会发现我最近给出的有关vba garbage collector

的答案