2016-07-07 55 views
1

必须有一种方法来做到这一点,但我只是不知道如何。使用变量作为参考VBA

说我有一个具有这些对象

 Set test = New clsMonth 

      With test 

       .January = 0.7136/20 
       .February = 0.6755/20 
       .March = 0.6528/20 
       .April = 0.7773/20 
       .May = 0.8213/20 
       .June = 0.8715/20 
       .July = 0.9/20 
       .August = 1.0243/20 
       .September = 1.0516/20 
       .October = 0.8514/20 
       .November = 0.7095/20 
       .December = 0.6994/20 

      End With 

一个数据类型和我有我想引用存储在数组中的人。我如何使用该数组来引用它们。我已经试过这样的事情(这是草率的,但我很快就做了一个例子):

Set test = New clsMonth 

        With test 

         .January = 0.7136/20 
         .February = 0.6755/20 
         .March = 0.6528/20 
         .April = 0.7773/20 
         .May = 0.8213/20 
         .June = 0.8715/20 
         .July = 0.9/20 
         .August = 1.0243/20 
         .September = 1.0516/20 
         .October = 0.8514/20 
         .November = 0.7095/20 
         .December = 0.6994/20 

        End With 

     Dim month(1 To 2) As String 

     month(1) = "March" 

     MsgBox test.month(1) 

谢谢你在先进。这将在很多方面帮助我!

ClsMonth:

Option Explicit 

'encapsulating values to be exposed as properties 

Private Type TMonth 
    January As Single 
    February As Single 
    March As Single 
    April As Single 
    May As Single 
    June As Single 
    July As Single 
    August As Single 
    September As Single 
    October As Single 
    November As Single 
    December As Single 
End Type 

Private this As TMonth 

'property accessors for each member 
'this "talks" to the form code to assign and retrieve values for each month 

Public Property Get January() As Single 
    January = this.January 
End Property 

Public Property Let January(ByVal value As Single) 
    this.January = value 
End Property 

Public Property Get February() As Single 
    February = this.February 
End Property 

Public Property Let February(ByVal value As Single) 
    this.February = value 
End Property 

Public Property Get March() As Single 
    March = this.March 
End Property 

Public Property Let March(ByVal value As Single) 
    this.March = value 
End Property 

Public Property Get April() As Single 
    April = this.April 
End Property 

Public Property Let April(ByVal value As Single) 
    this.April = value 
End Property 

Public Property Get May() As Single 
    May = this.May 
End Property 

Public Property Let May(ByVal value As Single) 
    this.May = value 
End Property 

Public Property Get June() As Single 
    June = this.June 
End Property 

Public Property Let June(ByVal value As Single) 
    this.June = value 
End Property 

Public Property Get July() As Single 
    July = this.July 
End Property 

Public Property Let July(ByVal value As Single) 
    this.July = value 
End Property 

Public Property Get August() As Single 
    August = this.August 
End Property 

Public Property Let August(ByVal value As Single) 
    this.August = value 
End Property 

Public Property Get September() As Single 
    September = this.September 
End Property 

Public Property Let September(ByVal value As Single) 
    this.September = value 
End Property 

Public Property Get October() As Single 
    October = this.October 
End Property 

Public Property Let October(ByVal value As Single) 
    this.October = value 
End Property 

Public Property Get November() As Single 
    November = this.November 
End Property 

Public Property Let November(ByVal value As Single) 
    this.November = value 
End Property 

Public Property Get December() As Single 
    December = this.December 
End Property 

Public Property Let December(ByVal value As Single) 
    this.December = value 
End Property 
'end of property accessors' 


Public Function ValueFor(ByVal monthName As String) As Single 'function to take month name and respond w property value 
    On Error GoTo CleanFail 

    Dim instance As Object 
    Set instance = Me 'CallByName can't take "me" directly for some reason, must create an instance of me 

    Dim result As Single 
    result = CallByName(instance, monthName, VbGet) 

CleanExit: 
    ValueFor = result 
    Exit Function 
CleanFail: 
    result = 0 
    Resume CleanExit 

End Function 
+0

你的意思'chillwater',或'test'?尝试'Msgbox(CallByName测试,月(1),vbGet)' –

+0

对不起,试图改变一切测试,但错过了一个。我试试这样。过了漫长的一天,忘记了CallByName – ct4242

+0

我以前见过这段代码......并且我特别记得使用'CallByName'来解决它。 –

回答

3

你可以调整该ValueFor函数接受monthNameOrIndex As Variant,像这样:

Public Function ValueFor(ByVal monthNameOrIndex As Variant) As Single 
    On Error GoTo CleanFail 

    Dim name As String 
    If IsNumeric(monthNameOrIndex) Then 
     name = MonthName(monthNameOrIndex) 
    Else 
     name = CStr(monthNameOrIndex) 
    End If 

    Dim instance As Object 
    Set instance = Me 'CallByName can't take "Me" directly 

    Dim result As Single 
    result = CallByName(instance, name, VbGet) 

CleanExit: 
    ValueFor = result 
    Exit Function 
CleanFail: 
    result = 0 
    Resume CleanExit 
End Function 

然后,你可以这样做:

MsgBox test.ValueFor(3) 

正如你可以这样做:

MsgBox test.ValueFor("March") 

看着这个片段接近:

Dim month(1 To 2) As String 

month(1) = "March" 

MsgBox test.month(1) 

如果你在阵列中存储的月份名称,并且要检索的值,并将它传递给这个test.ValueFor功能,你需要这样做:

Dim month(1 To 2) As String 
month(1) = "March" 

MsgBox test.ValueFor(month(1)) 
'same: text.ValueFor("March") 
+1

点击!现在有道理。谢谢,Matt! – ct4242

1
Sub Tester() 

    Dim o As New clsTest, arr, e 

    o.One = "First" 
    o.Two = "Second" 
    o.Three = "Third" 

    arr = Array("One", "Two", "Three") 

    For Each e In arr 

     Debug.Print CallByName(o, e, VbGet) 

    Next e 

End Sub 

输出:

First 
Second 
Third 

另clsTest:

Public One As String 
Public Two As String 
Public Three As String