2016-07-07 49 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