如果 numCells 即 (ActiveSheet.Range("W2").Value) 大于 8,例如(9、10,15、20 等),则此 VBA 代码工作完美。但是,如果我的 numCells 值小于 9(如 8、7、6、5、4 等),则会给出 400 错误。
Sub Generate_Random_Value()
Dim total As Double
Dim numCells As Integer
Dim minValue As Double
Dim maxValue As Double
Dim rng As Range
Dim cell As Range
Dim i As Integer
' Define parameters
total = ActiveSheet.Range("T2").Value
numCells = ActiveSheet.Range("W2").Value
minValue = ActiveSheet.Range("U2").Value
maxValue = ActiveSheet.Range("V2").Value
' Clear existing values in the range
Set rng = ActiveSheet.Range("E9:E" & numCells)
rng.ClearContents
' Generate and distribute random numbers
Randomize ' Initialize the random number generator
For i = 1 To numCells - 1
Set cell = rng.Cells(i, 1)
cell.Value = WorksheetFunction.RandBetween(minValue, maxValue)
total = total - cell.Value
Next i
' The last cell gets the remaining value to ensure the sum is equal to total value (Target Value).
rng.Cells(numCells, 1).Value = total
结束子
主要
Sub GenerateRandomIntegers()
' Reference the worksheet.
Dim ws As Worksheet: Set ws = ActiveSheet ' improve!
' Retrieve arguments.
Dim Total As Long: Total = ws.Range("T2").Value
Dim MinValue As Long: MinValue = ws.Range("U2").Value
Dim MaxValue As Long: MaxValue = ws.Range("V2").Value
Dim IntegersCount As Long: IntegersCount = ws.Range("W2").Value
With ws.Range("E9") ' references the top cell
' Populate.
PopulateColumnOfRandomIntegers .Cells, IntegersCount, MinValue, MaxValue
' Clear below.
.Resize(ws.Rows.Count - .Row - IntegersCount + 1) _
.Offset(IntegersCount).ClearContents
' Append totals adjacent to the bottom of the integers.
.Offset(IntegersCount) = Application.Sum(.Resize(IntegersCount), Total)
End With
End Sub
帮助
Sub PopulateColumnOfRandomIntegers( _
topCell As Range, _
IntegersCount As Long, _
MinValue As Long, _
MaxValue As Long)
Dim Data() As Variant: ReDim Data(1 To IntegersCount, 1 To 1)
Dim r As Long
For r = 1 To IntegersCount
Randomize ' Docs: "Int((upperbound - lowerbound + 1) * Rnd + lowerbound)"
Data(r, 1) = Int((MaxValue - MinValue + 1) * Rnd + MinValue)
Next r
topCell.Resize(IntegersCount).Value = Data
End Sub