我有一個 vba 程式,可以向我正在開發的用戶發出考試/測驗。我創建了用戶表單來遍歷作業表資料庫中的問題,以下是用戶表單的代碼。它回圈遍歷問題,并在我創建的每個標簽中輸入我的資料陣列中的資訊,但有一個問題:
當我到達最后一個問題時,如果我單擊“下一步”,它會回傳“下標超出范圍”錯誤。當我在 section 中查看代碼的那Sub RangeRow (byVal Direction As Long)
部分時,當r
變數增加到大于測驗表最后一行的數字時,它應該默認為最后一行(基本上將問題保留在最后一個問題上)。我認為它會這樣做,但它仍然會回傳此Subscript out of range
錯誤。我嘗試更改此 if 陳述句以讀取類似內容If r > Lastrow Then r = LastRow - 1
和其他變體,但我認為問題出在陣列不存在時(通過頂部的 LastRow 宣告)。我對如何解決這個問題感到困惑。
Dim LastRow As Long
Dim r As Long
Dim Data As Variant
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
r = Range("A3").Row - 1
RangeRow r
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 = IIf(Direction = xlPrevious, r - 1, r 1)
If r < 1 Then r = 1
If r > LastRow Then r = LastRow
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
uj5u.com熱心網友回復:
您需要區分Excel 作業表中的行號和陣列中的行索引。
您的陳述句Data = .Range("A3:D" & LastRow).Value
將創建一個二維陣列,但是,兩個維度的索引都從 1 開始。因此,第 3 行(這是您的第一個資料行)的資料位于索引 1 中,第 4 行位于索引 2 中,并且LastRow
它是在索引中LastRow - 2
。
更改RangeRow
-routine 以考慮到這一點。也許
Sub RangeRow(ByVal Direction As Long)
Const RowOffset = 2
Dim lastIndex as Long
lastIndex = LastRow - RowOffset
r = IIf(Direction = xlPrevious, r - 1, r 1)
If r < 1 Then r = 1
If r > lastIndex Then r = lastIndex
(...)
End Sub
注意在您的 Initialize-Routine 中,您可能想要設定r = 1
.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/508290.html
下一篇:合并行和總和值( 洗掉合并的)