已修正编辑:更改添加以添加一个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
答案 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