在模块B中调用其值在模块A中定义的全局/公共变量

杰夫

我编写了4个宏来执行操作,但是由于某些宏在2个工作簿之间切换,因此需要用户输入2个输入以确保使用了正确的文件。我只能访问其中一些文件,但我知道最终我将可以访问其余35个文件。如果没有输入,则必须手动更改宏代码中的文件名,但是我不想这样做,所以我使用了输入。但是,既然我具有正确格式的所有文件,那么我尝试使用一个单独的宏,该宏在单独的工作簿中具有其他文件的列表,然后打开这些文件并执行这些宏,但是这需要输入a很多。所以现在,我正在尝试消除对输入的需求。但是我不熟悉公共变量,并且对其他子例程的调用有些熟悉。

我的设置是这样的:

option explicit
public current as string

Sub master_macro
dim i as integer
dim path as string
dim wb as workbook
dim sht as worksheet

set wb = workbooks("name.xlsx")
set sht = wb.worksheets(1)
path = "C:\xxx\"
wb.activate
for i = 1 to 20
    currun = sht.cells(i,1).value 'this takes the value from the separate workbooks that has the file names
    full_currun = currun & ".xlsx"
    with workbooks.open(path & full_currun)
        .activate
        call blanks
        call lookup
        call transfer
        call combine
        .save
        .close
    end with
next i

最后2个宏在2张纸之间切换。因此,在这些宏中,尽管名称不同,但仍会在输入框内生成currun。

nam = inputbox("yadda yadda")
set wb = workbooks(nam & ".xlsx")

我正在尝试获取在master宏中定义到macro3和macro4的当前值。

VBE-适合我

您看到其中的部分了Sub master_macro吗?您在这里所做的就是声明一个过程,这基本上是一个通用术语,用于描述“一个运行时会执行某些操作的自包含代码块”。过程声明具有三个主要部分:

  • 类型-这是您正在做的Sub; 您是说这是一个子例程,它与函数不同 Function,因为它不返回值
  • 名称-这是您用来引用代码中其他位置过程的标识符。它应该具有描述性,因为它可以提高可读性。“ master_macro”还不错,但是作为一般规则,在VBA中命名过程时,您不想使用下划线。
  • 参数-在这里定义运行过程时可以传递给过程的变量值集。每个参数都用逗号分隔,并使用语法[pass type] + [variable name] + [variable type]声明。[pass类型]是ByRef或ByVal;基本区别是ByRef发送对变量的直接引用,而ByVal发送值的副本。

最后一部分是您缺少解决此问题的工具。双方macro3macro4声明(模块B)喜欢master_macro这里。如果他们需要知道当前值是什么,那么只需将(ByVal currun As String)添加到声明中即可。当从另一个过程调用它们时,就像它们在master宏中一样,它们将期望接收一个字符串。将主宏中的两行更改为:

Call macro3
Call macro4

Call macro3(full_currun)
Call macro4(full_currun)

并且macro3和macro4会将full_currun的值存储在自己的内部变量currun中,以根据需要使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章