无法使用索引函数从自定义类中获取值

时间:2018-08-08 17:46:54

标签: excel excel-vba

已修正编辑:更改添加以添加一个long而不是一个变体,并且在调用get item时不再尝试SET只是获取long并将其返回给调用函数。

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "CollectionOfGeneratedValues"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit
Private CollectionOfGeneratedValues As Collection

Private Sub Class_Initialize()
    Set CollectionOfGeneratedValues = New Collection
End Sub

Private Sub Class_Terminate()
    Set CollectionOfGeneratedValues = Nothing
End Sub

Private Property Get NewEnum() As IUnknown
    Set NewEnum = CollectionOfGeneratedValues.[_NewEnum]
End Property

Friend Property Get Count() As Long
    Count = CollectionOfGeneratedValues.Count
End Property

Friend Sub Add(num As Long)
    CollectionOfGeneratedValues.Add num
End Sub

Public Property Get Item(Index As Variant) As Long
Attribute Item.VB_UserMemId = 0
     Item = CollectionOfGeneratedValues.Item(Index)
    Debug.Print Item
End Property

Public Sub Clear()
    Set CollectionOfGeneratedValues = New Collection
End Sub

Public Sub shuffleCollection()

End Sub

Public Sub generateValues(ByRef userInput As Range)
Dim userSetValue                    As Long
Dim sumTarget                       As Long
Dim sumLeft                         As Long
Dim numbersToGenerate               As Long

    userSetValue = userInput.value
    sumTarget = getSumTarget(userInput)
    sumLeft = setInitialSumLeft(sumTarget, userSetValue)
    numbersToGenerate = getNumbersToGenerate(userInput)
    Call getValues(numbersToGenerate, sumLeft)
End Sub

Private Function getSumTarget(ByRef userInput As Range) As Long
    getSumTarget = Range("F" & userInput.Row)
End Function

Private Function setInitialSumLeft(ByVal sumTarget As Long, ByVal userSetValue As Long) As Long
    setInitialSumLeft = sumTarget - userSetValue
End Function

Private Function getNumbersToGenerate(ByRef userInput As Range) As Long
Dim rangeToFill                     As Range

    Set rangeToFill = Range("A" & userInput.Row & ":E" & userInput.Row)
    getNumbersToGenerate = rangeToFill.Columns.Count - 1
End Function

Private Sub getValues(ByVal numbersToGenerate As Long, ByVal sumLeft As Long)
Dim counter                         As Long
Dim value                           As Long

    For counter = 1 To numbersToGenerate - 1
        value = Application.WorksheetFunction.RandBetween(0, sumLeft / 2)
        Me.Add value
        sumLeft = sumLeft - value
    Next counter
    Me.Add sumLeft
End Sub

1 个答案:

答案 0 :(得分:0)

示例1中的场景让我失望-_-

Public Property Get Item(Index As Variant) As Long
Attribute Item.VB_UserMemId = 0
    Set Item = CollectionOfGeneratedValues.Item(Index)
    Debug.Print Item
End Property

Public Property Get Item(Index As Variant) As Long
Attribute Item.VB_UserMemId = 0
     Item = CollectionOfGeneratedValues.Item(Index)
    Debug.Print Item
End Property