如何在Excel VBA中传递两个Subs之间的变量?

时间:2015-04-25 08:59:18

标签: excel vba excel-vba

我知道如何在包含设置变量的Sub中调用运行动作的子时在两个Subs之间传递变量,但是我想从例程宏中调用变量setup Sub但是无法获得正确的声明变量以使其起作用的地方。我希望将变量设置为单独的,以便被其他Subs调用。下面的代码不能作为两个子

Sub X_Variables(s1, s2, s3, rng1, rng2, rng3)
'

' x - Defined Cell Names  - ANFlightText , AUFlightText , ABFlightText

Dim s1   As Worksheet
Dim s2   As Worksheet
Dim s3   As Worksheet
Dim rng1  As Range
Dim rng2  As Range
Dim rng3  As Range

Set s1 = Sheets("5_Angebot")        ' WorkSheet
Set s2 = Sheets("5_Auftragsb")      ' WorkSheet
Set s3 = Sheets("5_Abschluss")      ' WorkSheet
Set rng1 = s1.Range("B15")          ' End on cell
Set rng2 = s2.Range("B15")          ' End on cell
Set rng3 = s3.Range("B15")          ' End on cell

End Sub

调用
Sub X_Offer_Hide_Flight_Text()
'
' ***** Hide Flight Text  *****

' x - Defined Cell Names  - ANFlightText , AUFlightText , ABFlightText
' x (s1, s2, s3, rng1, rng2, rng3)


'  ***** Set up veriables *****

Call X_Variables

' *****

' Hide rows
Application.ScreenUpdating = False  ' do not see screen updating

s1.Select
Range("ANFlightText").Select        ' x
Selection.EntireRow.Hidden = True
rng1.Select

s2.Select
Range("AUFlightText").Select        ' x
Selection.EntireRow.Hidden = True
rng2.Select

s3.Select
Range("ABFlightText").Select        ' x
Selection.EntireRow.Hidden = True
rng3.Select

s1.Select

Application.ScreenUpdating = True  ' see screen updating

End Sub

2 个答案:

答案 0 :(得分:1)

您必须将变量声明为全局,在子。

之外
public s1   As Worksheet
public s2   As Worksheet
public s3   As Worksheet
public rng1  As Range
public rng2  As Range
public rng3  As Range

Sub X_Variables()
'

' x - Defined Cell Names  - ANFlightText , AUFlightText , ABFlightText

Set s1 = Sheets("5_Angebot")        ' WorkSheet
Set s2 = Sheets("5_Auftragsb")      ' WorkSheet
Set s3 = Sheets("5_Abschluss")      ' WorkSheet
Set rng1 = s1.Range("B15")          ' End on cell
Set rng2 = s2.Range("B15")          ' End on cell
Set rng3 = s3.Range("B15")          ' End on cell

End Sub

答案 1 :(得分:1)

使用模块。 (在VBA中:插入 - >模块)

模块在功能上与类似,它应该在这里工作正常。在模块中,您可以设置一些属性:

Public CustomerID As Integer
例如,

。然后在sub中,您可以使用点表示法来提取该信息:

ID = ModuleName.CustomerID

然后,您可以在excel文件中的任何位置使用该模块,甚至可以将其导出。如果您希望能够使用模块中的信息初始化数组,您可以编写一个函数来执行该操作,然后通过引用传入一个数组(使用ByRef关键字)然后当模块完成时,您将拥有一个数组中包含您需要的数据。我建议使用数组而不是像在这里那样使用1,2,3命名多个变量。例如:

在模块中,AirlineInfo:

Sub Setup(ByRef s() As Worksheet, ByRef rng() As Range)

Set s(1) = Sheets("5_Angebot")        ' WorkSheet
Set s(2) = Sheets("5_Auftragsb")      ' WorkSheet
Set s(3) = Sheets("5_Abschluss")      ' WorkSheet
Set rng(1) = s(1).Range("B15")          ' End on cell
Set rng(2) = s(2).Range("B15")          ' End on cell
Set rng(3) = s(3).Range("B15")          ' End on cell
End Sub

然后从文件的其他地方你可以在模块中调用该函数(就像类中的方法一样)

Dim s(1 to 3)   As Worksheet
Dim rng(1 to 3)  As Range

ArilineInfo.Setup(s, rng)

作为快速修复,您可以尝试将ByRef添加到当前设置中,但可能需要使用该模块。