VBA用户表单遍历试题时点击Next触发下标越界错误求助
VBA考试程序:最后一题点击Next出现下标越界错误的解决办法
开发的VBA考试发放程序,用户表单遍历试题数据库时,到达最后一题点击“Next”会触发Subscript out of range错误。原代码试图通过限制r不超过LastRow来避免越界,但问题依然存在。
问题根源
Data数组读取的是工作表A3:D<LastRow>区域,数组的实际行数为LastRow - 3 + 1 = LastRow - 2,索引范围是1到LastRow-2- 原代码用工作表的
LastRow作为r的上限,当r超过数组最大索引(LastRow-2)时,访问Data(r,列号)必然触发下标越界 - 初始化时
r = Range("A3").Row -1得到的是2,既跳过了第一题,还混淆了RangeRow方法的参数逻辑(该方法参数应为方向常量xlNext/xlPrevious,而非行号)
解决方案及修正代码
Dim LastRow As Long Dim r As Long Dim Data As Variant Dim MaxDataRow As Long ' 存储Data数组的最大行数 Private Sub Userform_Initialize() Dim ws As Worksheet Set ws = Sheets("Test") With ws LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row Data = .Range("A3:D" & LastRow).Value End With MaxDataRow = UBound(Data, 1) ' 获取数组第一维的最大索引 r = 1 ' 初始化r为数组第一行,对应工作表A3的试题 LoadQuestion ' 直接加载第一题 End Sub Private Sub NextRecord_Click() RangeRow xlNext End Sub Private Sub PreviousRecord_Click() RangeRow xlPrevious End Sub Sub RangeRow(ByVal Direction As Long) ' 根据方向调整r的值 r = IIf(Direction = xlPrevious, r - 1, r + 1) ' 修正边界判断:基于数组的实际最大行数 If r < 1 Then r = 1 If r > MaxDataRow Then r = MaxDataRow LoadQuestion ' 调用通用加载方法 End Sub ' 通用方法:加载指定索引的试题数据 Private Sub LoadQuestion() With Me .Label5.Caption = "Question ID: " & Data(r, 1) .Label6.Caption = "STS: " & Data(r, 2) .Label7.Caption = Sheets("Test").Cells(1, 3).Value .Label8.Caption = Data(r, 3) .txtAns.Text = Data(r, 4) End With End Sub
修改说明
- 新增
MaxDataRow变量,确保使用数组的实际边界而非工作表最后一行,从根源避免越界 - 初始化
r为1,保证首次加载第一题 - 抽离
LoadQuestion方法,避免代码重复,逻辑更清晰 - 边界判断改为基于
MaxDataRow,彻底解决越界问题
内容的提问来源于stack exchange,提问作者ATCEO
相关产品推荐
相关产品推荐

