VBA:获取变量名称

时间:2016-08-24 07:07:07

标签: vba excel-vba variables excel

是否有函数或属性来获取变量名称?

这样的东西

msgBox myVariable.name

msgBox nameOfVariable(myVariable)

在我使用例如{{}}定义时返回"myVariable" myVariable = "whatever"? Google只会向变量引用提出问题......

2 个答案:

答案 0 :(得分:0)

可能的类方法如下(注释):

  1. 添加课程模块

    在VBA IDE中

    • 点击插入 - >课程模块

    • 点击查看 - >物业窗口

    • 输入(Name)属性文本框并输入“变量”(或您喜欢的任何内容,但在以下步骤中保持一致)

    • Class代码窗格

      中输入以下代码
      Option Explicit
      
      'declare the fields that will be attached to every instance of this class
      Public name As String '<--| this will store the name of the variable to which you'll set the object of this class
      Public value As Variant '<--| this will store the value associated with the variable to which you'll set the object of this class
      
      'declare a `method` to write the `value` of the object in the named range named after the `name` field 
      Sub WriteRange(Optional wb As Variant) '<--| you can pass the reference of the workbook whose named ranges you want to exploit
         If IsMissing(wb) Then Set wb = ActiveWorkbook '<--| if no workbook reference is passed then the currently active workbook is assumed
         If TypeName(wb) = "Workbook" Then '<-- check for a proper workbook reference being passed)
              On Error Resume Next '<-- to prevent unassigned named range throw an error
              wb.Names(name).RefersToRange.value = value '<--| write the  value of the `value` filed of the current instance in the named range of the passed workbook named after the `name` filed of the current instance
          End If
      End Sub 
      
  2. 在代码中利用Variable

    作为利用三个变量的Variable类的示例,例如,第一个String值,第二个Integer值和Double第3个值,在任何模块代码窗格中输入以下代码:

        Option Explicit
    
        Sub main()
            Dim myVariable1 As Variable, myVariable2 As Variable, myVariable3 As Variable '<--| declare your variables of type "Variable": choose whatever name you may want
    
            Set myVariable1 = CreateVariable("myVariable1", "this is a string value") '<-- set your 1st variable with its name (you must use the same name as the variable!) and value (myVariable1 will have a `String`type value)
            Set myVariable2 = CreateVariable("myVariable2", 10) '<-- set your 2nd variable with its name (you must use the same name as the variable!) and value (myVariable2 will have a `Integer`type value)
            Set myVariable3 = CreateVariable("myVariable3", 0.3)'<-- set your 3rd variable with its name (you must use the same name as the variable!) and value (myVariable3 will have a `Double` type value)
    
            'exploit `WriteRange` method of your Class to write the object value into the corresponding named range: you must have set proper named ranges in your currently active workbook
            myVariable1.WriteRange '<--| this will write the string "this is a string value" in named range "myVariable1" of your currently active workbook
            myVariable2.WriteRange '<--| this will write the number '10' in named range "myVariable2" of your currently active workbook
            myVariable3.WriteRange '<--| this will write the number '0.3' in named range "myVariable3" of your currently active workbook 
        End Sub
    
        ' helper Function to create an object of `Variable` class and initialize its `name` and `value` properties 
        Function CreateVariable(name As String, value As Variant) As Variable '<--| the function returns an object of `Variable` class
            Set CreateVariable = New Variable '<--| this creates a new object of `Variable` class
            With CreateVariable '<--| refer to the newly created object and ...
                .name = name '<--| ... set its `name` property ...
                .value = value '<--| ... and its `value` property
            End With
        End Function
    

答案 1 :(得分:0)

如果只有几个变量,则类模块已被终止。 虽然类模块是可以复制的模板是正确的,但我已经探索了一种模仿类模块的简化方法。

使用变量名作为模块名称创建一个标准模块。 在此模块内,创建诸如NameValue之类的函数 例如

Function Name()
    Name = "myNewName"
End Function

Function Value()
    Value = 10
End Function

在一个单元格中,粘贴=my_VBA_Project.myVariable.Name()

缺点是值像常量一样被硬编码。要更改值,需要手动编辑功能值。

我在VBA编程中使用这种格式来模拟OOP。