VBA 2关于变量范围和生命周期的问题
我已经针对两个问题运行了关于我想要用VBA处理变量范围和生命周期的问题。VBA 2关于变量范围和生命周期的问题
我有不同的潜艇使用相同的变量,一遍又一遍。例如,一个将列定义为日期列,cDate或应用程序的整数。由于我有一个大小相同的声明部分,我想将它放在一个使用Global的独立模块中,但这不起作用。我在这里设置程序范围有什么关系?我怎样才能做到这一点?
与Q1类似,初始化变量是什么?具体来说,不是复制和粘贴找到列标题的相同块(例如cDate),而是将它放入自己的过程中。我正在运行许多问题试图让这个工作。我希望这是可能的,也许不是。
如果您需要查看代码,请告诉我。告诉我你想看到什么,然后把它扔在这里。 (PS-我已经通过VBA帮助,MSDN,古尔等,有什么我不理解这里)
编辑:添加编辑的代码,因为真实的东西很长。所有部分都在单独的标准模块中。我读了全局声明只在工作簿及以下级别工作,所以我也想每个模块(这里没有显示)在声明和设置app
,wb
和wrk
为Public
: 这里是我的声明:
Option Explicit
Global app As Application
Global wb As Workbook
Global wrk As Worksheet
Global cInvoice As Byte
Global iEndCol As Integer
Global lEndRow As Long
Global x As Integer
Global sString1 As String
Global rng As Range
Private Sub Not_Really_a_sub()
'No code. I read that any declaration needed to be in a module
' with a procedure. I tried it with out the dummy sub also
End Sub
'green text, read me and notes
而任何调用子:
Dim modulevariables As Integer
Sub Calling_Sub()
'doing things
lEndRow = 1 'blah blah blah
iEndCol = 1 ' blah blah blah
app.Run "'" & ThisWorkbook.Name & "'!Header_Finder"
'Code using cInvoice etc.
End Sub
和标题取景器:
Private Sub Header_Finder()
With wb.ActiveSheet
For x = 1 To iEndCol
If InStr(UCase(.Cells(x, 1)), UCase("Invoice")) > 0 Then
cInvoice = x
ElseIf .Cells(1, x) = "next thing" Then
cNextThing = x
End If
Next
End With
End Sub
已经感谢。
Q1。
您可以在三个不同的级别声明变量。过程级别(这听起来像你一直在做什么,想要离开),模块级别还是项目级别。
要在模块级声明一个变量,只需在第一个过程之外声明它,例如
Dim app As Application
Sub mySub()
...
该变量将适用于模块内的所有过程。要让变量可用于其他模块中的过程,您可以使用公开声明,例如
Public app As Application
Sub mySub()
....
Q2。
如果有一个过程初始化可以根据需要从其他过程调用的变量,那么执行此操作最简单的方法。例如,下面的代码创建一个名为PubStr的公共变量,在第一个从第二个调用的过程中初始化它。
Option Explicit
Public PubStr As String
Sub InitVar()
PubStr = "Hello World!"
End Sub
Sub RunMe()
Call InitVar
MsgBox PubStr
End Sub
运行“RunMe”将调用初始化公共变量PubStr的InitVar过程。
希望这会有所帮助。
不是一个真正的答案,但我需要包含一些代码。作为测试,我把下面的代码一个模块(模块)中:
Public wb As Workbook
而这种代码在另一模块(单词数):
Sub test()
Set wb = ThisWorkbook
Debug.Print wb.Name
End Sub
这对我工作的罚款。你可以尝试在新的工作簿中做同样的事情,让我知道它是怎么回事?此外,您可以尝试更明确指定哪些变量如果引用,就像这样(仍然是单词数):
Sub test()
Set wb = ThisWorkbook
Debug.Print Module1.wb.Name
End Sub
注意:模块1中没有虚拟程序 – mkingston 2012-03-24 00:17:30
注意到,不允许使用虚拟程序,我将在明天尝试使用工作计算机上的实际文件。我用'Global'在笔记本电脑上试了一下,很高兴知道我没有疯狂。 – Bippy 2012-03-24 00:45:51
“Module1.wb.Name”很有趣。最近转移到xl2010,我试图更明确_everywhere_。通常在xl服务器上有几个实例运行大量的宏,每个都带有公共变量,通常具有相同的名称 - 出现意外的自动化错误我怀疑由于范围太宽。因此,尽可能明确是一件好事。 – whytheq 2012-03-24 17:40:49
由于这不属于我的其他(非)的答案,但我再次需要包括一些代码,我会把它放在这里。
在你的“变量”模块,你声明变量:
dim wb as Workbook
之前,你可以使用这个变量必须初始化它,即给它一个值(任何这些例子将工作,每个都是不同的情景):
set wb = ThisWorkbook
set wb = ActiveWorkbook
set wb = Application.Workbooks(1)
如果做访问它,就像在之前没有初始化这个变量下面这个例子:
dim wb as Workbook
debug.print wb.name
您会收到错误消息:“运行时错误‘91’:对象变量或带块变量未设置”
唯一对象变量需要初始化。其他数据类型不。简而言之,非对象数据类型如下。默认值(在声明初始化)括号内:
- 整数[0]
- 龙[0]
- 字符串( “”)
- 双[0]
- 单[0]
- 日期[0,或1899年12月30日]
- 字节[0]
- 布尔[FALSE]
- 货币[$ 0]
其他的都是一个对象,需要某种初始化的。示例如下:
Option Explicit
Dim wb as Workbook
Dim app as Excel.Application
Dim wrk as Worksheet
Set app = Application
Set wb = app.workbooks(1)
Set wrk = wb.sheets(1)
'If any of the lines preceding this line are skipped, an error will occur.
debug.print wrk.name
很抱歉,如果你已经知道这个(说真的,我是,这是一个很多写!)只是想确保我们在同一页上我们上面讨论的意见后。
你是指如何将全局变量放在不同的模块中不起作用?当你运行你的代码时,它给出了一个错误? 你可以包括你的全局声明和你的列头查找程序的初学者? – mkingston 2012-03-23 21:35:31
回车不应该默认提交评论。每次。请参阅原始编辑。 – Bippy 2012-03-23 23:40:25
要清楚,你没有在任何地方指定它,但我认为你在访问变量之前调用了你的变量初始化代码,对吧? – mkingston 2012-03-24 01:01:59