在moduleB中调用其值在moduleA中定义的全局/公共变量

时间:2019-12-11 19:35:26

标签: vba variables module public

我编写了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。

2 个答案:

答案 0 :(得分:3)

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

  • 类型-这就是您使用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中,以供需要时使用。

答案 1 :(得分:2)

谢谢大家。设法使它起作用。这是下面的完成的工作

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
相关问题