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

问题描述 投票:0回答:1

我编写了4个宏来执行操作,但是由于某些宏会在两个工作簿之间切换,因此用户需要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")

我正在尝试将在主宏中定义的当前值传递给macro3和macro4。

vba variables module public
1个回答
1
投票

[您看到显示Sub master_macro的部分吗?您在此处声明的是procedure,这基本上是一个通用术语,用于描述“一个运行时会执行某些操作的自包含代码块”。过程声明具有三个主要组成部分:

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

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

Call macro3
Call macro4

to

Call macro3(full_currun)
Call macro4(full_currun)

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

© www.soinside.com 2019 - 2024. All rights reserved.