使用变量作为参考VBA

时间:2016-07-07 18:46:05

标签: vba excel-vba excel

必须有办法做到这一点,但我不知道如何做。

假设我有一个包含这些对象的数据类型

        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 

2 个答案:

答案 0 :(得分: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 :(得分: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