You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 19:55:17