在 Excel VBA 中生成随机数时出现 400 错误

问题描述 投票:0回答:1

如果 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

结束子

excel vba
1个回答
0
投票

生成随机整数

主要

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
© www.soinside.com 2019 - 2024. All rights reserved.