如何在Excel VBA中传递两个子variables之间的variables?

我知道如何调用两个子之间的variables时,调用一个子从包含variables设置的子运行的动作,但我想从例程macros调用variables设置子,但不能得到正确的地方声明variables让它工作。 我希望将variables设置为独立,以便被其他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 

您必须将variables声明为全局variables,而不是子variables。

 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 

使用一个模块。 (在VBA中:插入 – >模块)

模块在function上类似类,它应该在这里工作得很好。 在模块中,你可以设置一些属性:

 Public CustomerID As Integer 

例如。 然后在子文件中,可以使用点符号来提取该信息:

 ID = ModuleName.CustomerID 

然后你可以在你的excel文件中的任何地方使用模块,甚至导出它。 如果你想能够使用模块中的信息来初始化一个数组,你可以编写一个函数来完成这个工作,然后通过引用传递一个数组(通过使用ByRef关键字)。然后,当模块完成时,你将有一个arrays充满了你需要的数据。 我会build议使用数组,而不是像在这里一样用1,2,3来命名多个variables。 例:

在模块中,航空公司信息:

 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) 

作为一个快速解决scheme,您可以尝试将ByRef添加到当前的设置,但可能需要使用该模块。