VBA可变长度循环报subscript out of range错误无法定位原因
错误原因
你代码的核心问题是复用传入的玩家编号参数playernum作为掷骰循环的计数器,触发了连锁错误:
- VBA的
For循环结束后,循环变量的值会变为「循环终值 + 步长」,你用playernum做循环变量,会直接覆盖传入的玩家编号原值。 - 循环结束后
playernum的值等于NumThrowText.Value,而你存储单次掷骰结果的rolls数组最大索引是NumThrowText.Value - 1,此时访问rolls(playernum)必然触发下标越界。 - 你遇到的「仅玩家数大于掷骰次数时报错」是巧合:当玩家数<=掷骰次数时,
NumThrowText.Value会大于全局rollsum数组的最大索引,错误会发生在后面的rollsum(playernum)赋值行,只是你测试时没有覆盖这种场景。 - 额外逻辑错误:你写的
WorksheetFunction.Sum(rolls(playernum))是对单个元素求和,完全没有起到累加单次玩家所有掷骰结果的作用;且每次调用函数都重定义全局rollsum数组,会清空之前玩家的得分数据。
修正方案
- 单独声明掷骰循环的计数器变量,不要覆盖传入的玩家编号
- 对整个
rolls数组求和得到单玩家总分 - 全局
rollsum数组只在调用前初始化一次,避免清空历史数据
完整修正代码
' 全局变量需定义在模块顶部 Dim rollsum() As Long Function rollsumvalue(playernum As Long) As Long Dim rolls() As Long Dim throwIndex As Long ' 初始化当前玩家的掷骰结果数组 ReDim rolls(NumThrowText.Value - 1) For throwIndex = 0 To (NumThrowText.Value - 1) rolls(throwIndex) = random_generator(1, 6) Next ' 对当前玩家所有掷骰结果求和 rollsum(playernum) = WorksheetFunction.Sum(rolls) rollsumvalue = rollsum(playernum) End Function Private Sub callrollsumvalue() Dim player As Long ' 仅初始化一次全局得分数组 ReDim rollsum(NumPlayerText.Value - 1) For player = 0 To (NumPlayerText.Value - 1) Call rollsumvalue(player) MsgBox "玩家" & player + 1 & "总得分:" & rollsum(player) & " 点" Next ' 可选:自动计算获胜玩家 Dim maxScore As Long, winnerIndex As Long maxScore = WorksheetFunction.Max(rollsum) winnerIndex = WorksheetFunction.Match(maxScore, rollsum, 0) MsgBox "获胜者为玩家" & winnerIndex & ",最高得分:" & maxScore & " 点" End Sub
内容的提问来源于stack exchange,提问作者User123
相关产品推荐
相关产品推荐

