VBA 2关于变量范围和生命周期的问题

问题描述:

我已经针对两个问题运行了关于我想要用VBA处理变量范围和生命周期的问题。VBA 2关于变量范围和生命周期的问题

  1. 我有不同的潜艇使用相同的变量,一遍又一遍。例如,一个将列定义为日期列,cDate或应用程序的整数。由于我有一个大小相同的声明部分,我想将它放在一个使用Global的独立模块中,但这不起作用。我在这里设置程序范围有什么关系?我怎样才能做到这一点?

  2. 与Q1类似,初始化变量是什么?具体来说,不是复制和粘贴找到列标题的相同块(例如cDate),而是将它放入自己的过程中。我正在运行许多问题试图让这个工作。我希望这是可能的,也许不是。

如果您需要查看代码,请告诉我。告诉我你想看到什么,然后把它扔在这里。 (PS-我已经通过VBA帮助,MSDN,古尔等,有什么我不理解这里)

编辑:添加编辑的代码,因为真实的东西很长。所有部分都在单独的标准模块中。我读了全局声明只在工作簿及以下级别工作,所以我也想每个模块(这里没有显示)在声明和设置appwbwrkPublic: 这里是我的声明:

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 

已经感谢。

+0

你是指如何将全局变量放在不同的模块中不起作用?当你运行你的代码时,它给出了一个错误? 你可以包括你的全局声明和你的列头查找程序的初学者? – mkingston 2012-03-23 21:35:31

+0

回车不应该默认提交评论。每次。请参阅原始编辑。 – Bippy 2012-03-23 23:40:25

+1

要清楚,你没有在任何地方指定它,但我认为你在访问变量之前调用了你的变量初始化代码,对吧? – mkingston 2012-03-24 01:01:59

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

注意:模块1中没有虚拟程序 – mkingston 2012-03-24 00:17:30

+0

注意到,不允许使用虚拟程序,我将在明天尝试使用工作计算机上的实际文件。我用'Global'在笔记本电脑上试了一下,很高兴知道我没有疯狂。 – Bippy 2012-03-24 00:45:51

+0

“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 

很抱歉,如果你已经知道这个(说真的,我是,这是一个很多写!)只是想确保我们在同一页上我们上面讨论的意见后。

+0

不要道歉,你的努力值得赞赏。我一直在试验和错误的学习,所以我有很多知识空白。有一些我知道,有些我没有。另外还有很多的术语和定义,我不完全理解 – Bippy 2012-03-24 11:47:06

+0

好吧,有许多问题仍然有一些声明在潜艇中,然后另一个神秘的地方,其他人只是没有初始化。但是,将模块移到新的工作簿中可以解决这个问题。非常感谢您的帮助。 – Bippy 2012-03-24 23:00:40

+0

完全没问题。乐于帮助 :) – mkingston 2012-03-25 00:34:32