Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 同一模块中多个vba宏的变量和常量&;工作手册_Excel_Vba - Fatal编程技术网

Excel 同一模块中多个vba宏的变量和常量&;工作手册

Excel 同一模块中多个vba宏的变量和常量&;工作手册,excel,vba,Excel,Vba,在同一个Excel工作簿中编写了很多小的sub()之后,我意识到我经常使用相同的部分代码、变量和常量。因此,我决定为代码编写functions(),并将变量&constant/static声明为公共外部函数和sub。我对vba声明非常陌生,这并不容易。让我给你一个我想要实现的总结。我已在工作簿的模块目录下的一个模块中编写了所有函数和子函数 Option Explicit Public ToDate As String ' variable I use in many sub and funct

在同一个Excel工作簿中编写了很多小的sub()之后,我意识到我经常使用相同的部分代码、变量和常量。因此,我决定为代码编写functions(),并将变量&constant/static声明为公共外部函数和sub。我对vba声明非常陌生,这并不容易。让我给你一个我想要实现的总结。我已在工作簿的模块目录下的一个模块中编写了所有函数和子函数

Option Explicit
Public ToDate As String  ' variable I use in many sub and functions
Public MyPath As String  ' variable I use in many sub and functions
Public NameOfWorker As Variant  ' constant I use in many sub and functions 
Public Salary As Double ' constant I use in many sub and functions   

NameOfWorker = Cells(14, 19)  ' !!! PB : 14 is highlighed with error : incorrect instruction outside a procedure
Salary = Cells(20, 7).Value  '!!! same as above
我应该如何以及在何处声明此类常量/静态?我应该写一个“特殊”程序来声明所有这些变量和常量吗?我尝试了很多方法来声明它们,但都没有成功

Public Static NameOfWorker = Cells(14, 19) As String ' not working
''''''
Public Static nameOfWorker As String
NameOfWorker = Cells(14, 19)  ' not working
''' etc etc
谢谢你的帮助

编辑:经过更多阅读,我找到了一个解决方案:

Public Const MY_PATH = "Y:\path\to\directory\"
Public Const WORKERNAME = "14, 19"
还不错:-)

问得好

我将在模块中的所有子节点上方对全局变量进行模糊处理,但在某些子节点内的方便位置初始化全局变量。例如:

Public NameOfWorker As String
Public AgeOfWorker As Long
Public SetupComplete As Boolean

Sub MAIN()
If SetupComplete Then
Else
    NameOfWorker = Sheets("Sheet1").Range("B9")
    AgeOfWorker = Sheets("Sheet1").Range("B10")
    SetupComplete = True
    MsgBox "Global variable set up complete!"
End If
End Sub

您可以创建一个名为
DataHelper
的新模块,如下所示:

Private NameOfWorker As String
Private AgeOfWorker As Long
Private SetupComplete As Boolean

Public Function GetNameOfWorker()
    If NameOfWorker = "" Then
        NameOfWorker = Sheets("SomeSheet").Cells(14, 19)
    End If

    GetNameOfWorker = NameOfWorker
End Function

Public Function GetAgeOfWorker()
...
End Function
现在,您可以在任何其他代码中检索该值:

Sub SomeMethod()    
    Cells(1, 1).Value = DataHelper.GetNameOfWorker()    
End Sub

…如果设置了,您就不必担心了。

TY谢谢您的回答,但在我看来,这会让我有更多的代码编写,而这不是我想要的。我的想法是以一种简单的方式扩展变量/常量的范围。**EDIT**:我知道我需要编写与常量一样多的帮助函数,对吗?我不确定是否完全理解,但我会尝试一下。顺便说一句,如果将变量的范围限定到同一模块内的所有过程是痛苦的,那么我会喜欢Ctrl C,Ctrl V:-)。编辑:明白了。Globals在内部执行所有程序并初始化。谢谢你的反馈@GABX如果这个答案对你有用的话,你应该考虑把它标记为被接受的答案……完成了。即使我很懒,并且在寻找更像Java的“静态初始化块”的东西,我也会接受这个答案。