使用数组。这会读入标头,但仅输出重新排列的数据而没有新标头。这是为了处理超过 1 个人行,以防您添加数据。请注意,我已经纠正了我认为您重复 q2_s2 的错字。第一个实例应该是q2_s1。
Option Explicit
Public Sub test()
Dim arr(), ws As Worksheet, i As Long, j As Long, r As Long, c As Long, outputArr()
Set ws = ThisWorkbook.Worksheets("Sheet5"): arr = ws.[B1:I2].Value '<=adjust if more rows
ReDim outputArr(1 To 2 * (UBound(arr, 1) - 1), 1 To UBound(arr, 2) / 2)
For i = 2 To UBound(arr, 1)
For j = LBound(arr, 2) To UBound(arr, 2) Step 4
r = r + 1
outputArr(r, 1) = arr(i, j + 3)
outputArr(r, 2) = arr(i, j)
outputArr(r, 3) = arr(i, j + 1)
outputArr(r, 4) = arr(i, j + 2)
Next
Next
ws.Cells(5, 1).Resize(UBound(outputArr, 1), UBound(outputArr, 2)) = outputArr
End Sub
如果学生可以有不同的学期数,请将您的表格设置为最大可能的学期数,并将这些学期留空,不对给定学生进行测验,然后使用代码:
Option Explicit
Public Sub test()
Dim arr(), ws As Worksheet, i As Long, j As Long, r As Long, c As Long, outputArr(), numberOfColumns As Long
Set ws = ThisWorkbook.Worksheets("Sheet5"): arr = ws.[B1:M3].Value
numberOfColumns = UBound(arr, 2) / 4
ReDim outputArr(1 To numberOfColumns * (UBound(arr, 1) - 1), 1 To UBound(arr, 2) / numberOfColumns)
For i = 2 To UBound(arr, 1)
For j = LBound(arr, 2) To UBound(arr, 2) Step 4
r = r + 1
outputArr(r, 1) = arr(i, j + 3)
outputArr(r, 2) = arr(i, j)
outputArr(r, 3) = arr(i, j + 1)
outputArr(r, 4) = arr(i, j + 2)
Next
Next
ws.Cells(Ubound(arr,1) + 5 , 1).Resize(UBound(outputArr, 1), UBound(outputArr, 2)) = outputArr
End Sub
最多 3 个学期且 1 名学生仅完成 2 个学期的示例布局: