调用模块中的 global/public 变量,其值在模块 S 中定义
Calling a global/public variable in moduleB whose value was defined in moduleA
我写了 4 个宏来做事,但它需要用户输入 2 次以确保使用正确的文件,因为有些宏会在 2 个工作簿之间来回切换。我只能访问其中的几个文件,但我知道最终我可以访问其余 35 个文件。如果我没有输入,我将不得不手动更改宏代码中的文件名,但我不想这样做,所以我使用了输入。但是现在我有了正确格式的所有文件,我正在尝试一个单独的宏,它在一个单独的工作簿中有一个其他文件的列表,然后打开这些文件并执行宏,但它需要输入一个很多。所以现在,我正试图消除对输入的需求。但是我对public变量比较陌生,对其他子程序的调用比较熟悉
我的设置是这样的:
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")
我正在尝试将主宏中定义的当前值获取到 macro3 和 macro4。
你看到写着 Sub master_macro
的部分了吗?你在那里做的是声明一个 过程 ,它基本上是一个通用术语来描述 "a block of self-contained code that does something when it is run." 过程声明有三个主要组成部分:
- 类型 - 这就是您使用
Sub
所做的;你说它是一个 子程序 ,它不同于 函数 Function
因为它不 return值
- name - 这是您用来在代码中其他地方引用该过程的标识符。它应该是描述性的,因为这增强了可读性。 "master_macro" 不错,但作为一般规则,在 VBA.
中命名程序时,您不想使用下划线
- 参数 - 这是您定义变量值集的地方,当它是 运行 时可以传递给过程。每个参数由逗号分隔,并使用语法 [传递类型] + [变量名称] + [变量类型] 声明。 [传递类型] 是 ByRef 或 ByVal;基本区别在于 ByRef 发送对变量的直接引用,而 ByVal 发送值的副本。
最后一部分是你解决这个问题所缺少的。 macro3
和 macro4
都被声明(在模块 B 中),就像 master_macro
在这里一样。如果他们需要知道 cur运行 值是什么,那么只需将 (ByVal currun As String)
添加到他们的声明中即可。当它们被另一个过程调用时,因为它们在 master 宏中,它们将期望接收到一个字符串。更改主宏中的两行:
Call macro3
Call macro4
到
Call macro3(full_currun)
Call macro4(full_currun)
并且 macro3 和 macro4 会将 full_currun 的值存储在它们自己的内部变量 cur运行 中以供需要时使用。
谢谢大家。设法让它工作。下面是完成的作品
sub master()
dim i as integer
dim path, currun, fullcurrun as string
dim wb as workbook
dim sht as worksheet
set wb = workbooks("Name.xlsx")
set sht = wh.worksheets(1)
path = "C:\xxx\"
wb.activate
for i = 1 to ?
currun = sht.cells(i,1).value
fullcurrun = currun & ".xlsx"
workbooks.open(path & fullcurrun)
call blank(currun)
call lookup(currun)
call transfer(currun)
activeworkbook.save
activeworkbook.close
call transfer(currun)
next i
end sub
public sub blank/lookup/transfer(byval currun as string)
blah blah blah
end sub
我写了 4 个宏来做事,但它需要用户输入 2 次以确保使用正确的文件,因为有些宏会在 2 个工作簿之间来回切换。我只能访问其中的几个文件,但我知道最终我可以访问其余 35 个文件。如果我没有输入,我将不得不手动更改宏代码中的文件名,但我不想这样做,所以我使用了输入。但是现在我有了正确格式的所有文件,我正在尝试一个单独的宏,它在一个单独的工作簿中有一个其他文件的列表,然后打开这些文件并执行宏,但它需要输入一个很多。所以现在,我正试图消除对输入的需求。但是我对public变量比较陌生,对其他子程序的调用比较熟悉
我的设置是这样的:
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")
我正在尝试将主宏中定义的当前值获取到 macro3 和 macro4。
你看到写着 Sub master_macro
的部分了吗?你在那里做的是声明一个 过程 ,它基本上是一个通用术语来描述 "a block of self-contained code that does something when it is run." 过程声明有三个主要组成部分:
- 类型 - 这就是您使用
Sub
所做的;你说它是一个 子程序 ,它不同于 函数Function
因为它不 return值 - name - 这是您用来在代码中其他地方引用该过程的标识符。它应该是描述性的,因为这增强了可读性。 "master_macro" 不错,但作为一般规则,在 VBA. 中命名程序时,您不想使用下划线
- 参数 - 这是您定义变量值集的地方,当它是 运行 时可以传递给过程。每个参数由逗号分隔,并使用语法 [传递类型] + [变量名称] + [变量类型] 声明。 [传递类型] 是 ByRef 或 ByVal;基本区别在于 ByRef 发送对变量的直接引用,而 ByVal 发送值的副本。
最后一部分是你解决这个问题所缺少的。 macro3
和 macro4
都被声明(在模块 B 中),就像 master_macro
在这里一样。如果他们需要知道 cur运行 值是什么,那么只需将 (ByVal currun As String)
添加到他们的声明中即可。当它们被另一个过程调用时,因为它们在 master 宏中,它们将期望接收到一个字符串。更改主宏中的两行:
Call macro3
Call macro4
到
Call macro3(full_currun)
Call macro4(full_currun)
并且 macro3 和 macro4 会将 full_currun 的值存储在它们自己的内部变量 cur运行 中以供需要时使用。
谢谢大家。设法让它工作。下面是完成的作品
sub master()
dim i as integer
dim path, currun, fullcurrun as string
dim wb as workbook
dim sht as worksheet
set wb = workbooks("Name.xlsx")
set sht = wh.worksheets(1)
path = "C:\xxx\"
wb.activate
for i = 1 to ?
currun = sht.cells(i,1).value
fullcurrun = currun & ".xlsx"
workbooks.open(path & fullcurrun)
call blank(currun)
call lookup(currun)
call transfer(currun)
activeworkbook.save
activeworkbook.close
call transfer(currun)
next i
end sub
public sub blank/lookup/transfer(byval currun as string)
blah blah blah
end sub