许多子程序的variables:代码清理

我一直在思考和寻找解决scheme的几个小时,但不能拿出我的基本问题的答案(显然很难):

所以我有很多子程序:

Sub OUTPUT() Call CompañiasCubiertas Call RangosDatos Call EERR Call Balance Call Flujo Call Indicadores Call FormatoEERR Call FormatoBalance Call FormatoFlujo Call FormatoIndicadores End Sub 

在这些潜艇的每一个,我有许多variables和工作簿声明重复:

 Dim y As Workbook Dim x As Workbook Dim rangoi As Integer Dim rangof As Integer Dim compañia As String Dim oipf As Integer Dim ogpf As Integer Dim ogp As Integer Dim Fechai As Long Dim Fechaf As Long Dim Fechaper1 As Long Dim Fechaper2 As Long Set y = Application.ActiveWorkbook Set x = Application.Workbooks.Open("G:\Estudios\Biblioteca\Mercado Accionario Chileno\BBDD Oficial.xlsm") compañia = y.Sheets("Información Financiera").Range("A3") 'Definir rangos para buscar los datos Fechai = y.Sheets("Información Financiera").Range("C4").Value Fechaf = y.Sheets("Información Financiera").Range("D4").Value Fechaper1 = y.Sheets("Información Financiera").Range("C8").Value Fechaper2 = y.Sheets("Información Financiera").Range("D8").Value rangoi = Application.Match(Fechai, y.Sheets("Información Financiera").Range("E2:E300"), 0) + 1 rangof = Application.Match(Fechaf, y.Sheets("Información Financiera").Range("E2:E300"), 0) + 1 

那么,如何避免在ALL subs中声明所有这些variables和工作簿。 我一直在尝试我在几乎每个网站上阅读的东西:

 Public rangoi As Integer Public rangof As Integer 

等等….但是,如果我在OUTPUT()内部创build这些variables,它会引发一个错误,而当我启动macros时它将不被读取。

我在这里缺less一些基本的东西。

我对variables特别感兴趣

 Dim compañia As String compañia = y.Sheets("Información Financiera").Range("A3") 

…对于所有的子程序都是有用的,因为我想对variablescompañia (将其重新设置为string数组)进行循环,并在OUTPUT子程序中放置一个for

  Sub OUTPUT() For i=1 To UBound(compañia) Call subs1 ' subs1(compañia) , meaning the value of compañia changes the value of subroutines Call subs2 ' subs2(compañia) Call subs3 ' subs3(compañia) Next i End Sub 

必须在一个子程序之外创build一个公共variables,这就是为什么当你尝试在一个子程序中声明它的时候你会得到一个错误。 当你声明一个公共variables时,它对所有的子程序都是可见的 – 它将在你开始运行你的macros时创build。 在子程序之外声明它并不意味着声明不会发生。

请注意,您也可以使用“Dim”(而不是Public)在子例程之外声明variables,但是这些variables仅对同一模块中的子例程可见。 公共variables将在所有模块中的所有例程中可见。

另一种考虑的方法是将您广泛需要的variables作为parameter passing。 例如在主例程中声明它们,然后将它们传递给需要它们的子例程。 这通常比有许多公共variables更可取,但两种方法都有其用途。

编辑:添加回应Jules的评论。 Jules提出了一个非常好的观点 – 相信工作表代码块中的“公共”variables并不是真正公开的,而只能在该工作表中的所有例程中看到。 然而,模块中的公开声明是真正公开的。

作为替代,您可以在模块中声明公用的自定义types,并只使用一行来在本地声明。 这个解决scheme比使用全局variables更安全。

 Module1.bas Public Type CustomType y As Workbook x As Workbook compania as String '<-- I don't have accent on my machine. rangoi As Integer rangof As Integer oipf As Integer ogpf As Integer ogp As Integer Fechai As Long Fechaf As Long Fechaper1 As Long Fechaper2 As Long End Type Module2.bas Public Sub Sub1() dim lCustom as CustomType set lCustom.x = ActiveWorkBook '<-- just a sample lCustom.loipf = 1 End Sub Module3.bas Public Sub Sub2() dim lCustom as CustomType set lCustom.x = ActiveWorkBook '<-- just a sample lCustom.loipf = 1 End Sub 

我不得不让代码运行,幸运的是我想出了一个解决scheme。 也许我做了什么不应该做的,或者不推荐,但是我再也没有时间思考一个更好的解决scheme。 我只是学习了不同types的variables(公共,私人,模块内外)……并试图理解它们。 感谢您的build议,但那些代码对我来说有点太高级了。

 Public compañia2() As String Public compañia As String Sub OUTPUT() Application.ScreenUpdating = False 'To avoid screen flickering Application.DisplayAlerts = False 'Mensajes de alertas desactivado CompañiasCubiertas RangosDatos For i = 1 To UBound(compañia2) compañia = compañia2(i) EERR Balance Flujo Indicadores FormatoEERR FormatoBalance FormatoFlujo FormatoIndicadores Next i Application.DisplayAlerts = True Application.ScreenUpdating = True 'To avoid screen flickering End Sub Sub CompañiasCubiertas() 'Other code for declaration of variables and other stuff ReDim compañia2(x.Sheets.Count - 3 + 1) ' Define lenght of the array For i = 1 To x.Sheets.Count - 2 compañia2(i) = y.Sheets("CompañiasCubiertas").Range("A" & i + 2).Value ' Fill array Next i End Sub