【问题标题】:Is it possible to declare a public variable in vba and assign a default value?是否可以在 vba 中声明一个公共变量并分配一个默认值?
【发布时间】:2011-08-19 08:42:31
【问题描述】:

我想这样做,但它不会编译:

Public MyVariable as Integer = 123

实现这一目标的最佳方法是什么?

【问题讨论】:

  • 这个 VBA 在哪里运行? Excel、Access、Word...
  • @DuncanHowe 我希望有一个通用的 vba 解决方案。
  • 全局变量不再被认为是邪恶的吗?我在五月份离开了几个星期,所以我可能错过了一些东西。

标签: vba variables default-value public variable-declaration


【解决方案1】:

你当然知道,但如果它是一个常数,那么 const MyVariable as Integer = 123 否则你就倒霉了;该变量必须在别处分配一个初始值。

你可以:

public property get myIntegerThing() as integer
    myIntegerThing= 123
end property

在 Class 模块中然后全局创建它;

public cMyStuff as new MyStuffClass

所以cMyStuff.myIntegerThing 立即可用。

【讨论】:

  • 最好添加一个模块并在该模块中定义这些属性。我创建了一个名为Globals 的模块,并在该模块内定义了Property Get,它就像一个魅力。属性 Get PSIStartRow() As Integer PSIStartRow = Sheets("FOB prices").Range("F1").Value End Property Property Get PSIStartCell() As String PSIStartCell = "B" & PSIStartRow End Property
  • 代码在上面的注释中被破坏了。我会把它贴在下面。
【解决方案2】:

您可以在通用声明中定义变量,然后在您的环境中触发的第一个事件中对其进行初始化。

或者,您可以自己创建一个具有相关属性的类并在 Initialise 方法中对其进行初始化

【讨论】:

    【解决方案3】:

    .NET 宠坏了我们 :) 您的声明对 VBA 无效。

    只有常量才能在应用程序加载时被赋予一个值。你这样声明它们:

    Public Const APOSTROPHE_KEYCODE = 222
    

    这是我的一个 vba 项目的示例声明:

    如果您正在寻找声明公共变量然后想要初始化它的值的东西,您需要创建一个 Workbook_Open 子并在那里进行初始化。 示例:

    Private Sub Workbook_Open()
      Dim iAnswer As Integer
    
      InitializeListSheetDataColumns_S
      HideAllMonths_S
    
      If sheetSetupInfo.Range("D6").Value = "Enter Facility Name" Then
        iAnswer = MsgBox("It appears you have not yet set up this workbook.  Would you like to do so now?", vbYesNo)
        If iAnswer = vbYes Then
          sheetSetupInfo.Activate
          sheetSetupInfo.Range("D6").Select
          Exit Sub
        End If
      End If
    
      Application.Calculation = xlCalculationAutomatic
      sheetGeneralInfo.Activate
      Load frmInfoSheet
      frmInfoSheet.Show
    
    
    End Sub
    

    确保在 Workbook 对象本身中声明 sub:

    【讨论】:

      【解决方案4】:

      只为给你一个不同的角度-

      我发现在函数调用之间维护公共变量不是一个好主意。您需要使用的任何变量都应存储在 Subs 和 Functions 中并作为参数传递。代码运行完成后,您不应期望 VBA 项目会维护任何变量的值。

      这样做的原因是,在使用工作簿时,有很多事情可能会无意中重置 VBA 项目。发生这种情况时,所有公共变量都会重置为 0。

      如果您需要将值存储在 subs 和函数之外,我强烈建议您使用带有命名范围的隐藏工作表来存储任何需要保留的信息。

      【讨论】:

        【解决方案5】:

        已经有一段时间了,但这可能会让你满意:

        Public MyVariable as Integer: MyVariable = 123
        

        这有点难看,因为你必须重新输入变量名,但它在一行上。

        【讨论】:

        • 产生编译错误:Invalid outside Procedure
        【解决方案6】:

        如上所述,要声明全局可访问变量,您可以在以 public 关键字开头的函数之外进行。

        而且,由于在程序之外不允许做作,例如,您可以创建一个名为 InitGlobals 的子程序来初始化您的公共变量,然后您只需在语句的开头调用此子程序

        这是一个例子:

        Public Coordinates(3) as Double
        Public Heat as double
        Public Weight as double
        
        Sub InitGlobals()
            Coordinates(1)=10.5
            Coordinates(2)=22.54
            Coordinates(3)=-100.5
            Heat=25.5
            Weight=70
        End Sub
        
        Sub MyWorkSGoesHere()
            Call InitGlobals
            'Now you can do your work using your global variables initialized as you wanted them to be.
        End Sub
        

        【讨论】:

          【解决方案7】:

          当我需要初始化全局常量时,我​​会这样做:
          1.添加一个名为Globals的模块
          2.在Globals模块中添加这样的属性:

          Property Get PSIStartRow() As Integer  
              PSIStartRow = Sheets("FOB Prices").Range("F1").Value  
          End Property  
          Property Get PSIStartCell() As String  
              PSIStartCell = "B" & PSIStartRow  
          End Property
          

          【讨论】:

            【解决方案8】:

            鲜为人知的事实:
            命名范围可以引用 而不是特定的单元格。

            这可以用作“全局变量”,加上您可以在工作表单元格中引用来自 VBA 的值,和 在关闭和重新打开工作簿后,分配的值甚至会保留


            • 要“声明”名称 myVariable 并为其赋值123

              ThisWorkbook.Names.Add "myVariable", 123
              
            • 检索值(例如在MsgBox 中显示值):

                MsgBox [myVariable]
              
            • 或者,您可以使用字符串引用名称:(方括号中的结果相同)

              MsgBox Evaluate("myVariable")
              
            • 要在工作表上使用值,只需在公式中按原样使用它的名称:

              =myVariable
              
            • 事实上,你甚至可以存储函数表达式:(有点像JavaScript
              (诚然,我实际上不能想想这会是有益的情况 - 但我也不在 JS 中使用它们。)

              ThisWorkbook.Names.Add "myDay", "=if(isodd(day(today())),""on day"",""off day"")"
              

            方括号只是Evaluate 方法的快捷方式。我听说使用它们被认为是混乱或“hacky”,但我没有遇到任何问题,它们在 Excel 中的使用是 Microsoft 的 supported

            可能还有一种方法可以使用Range 函数来引用这些名称,但我没有看到任何优势,所以我没有深入研究它。


            更多信息:

            【讨论】:

              猜你喜欢
              • 2020-01-08
              • 1970-01-01
              • 2010-10-14
              • 2011-03-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多