我已经尝试了一些在此处发布的示例,但我似乎无法填充我的数组,如下图所示。理想情况下,我希望有一个输入框来指定学生人数,然后让 VBA 函数填充数组,如下所示:
这是可能的还是我只需要手动填充数字?
[如果以下内容构成“要求......澄清”,我深表歉意,但除非我听到更多,否则我无能为力]
从您的图像中,我看不到问题的症结所在。您的意图是否只是让单元格B5
(在您的示例中)始终具有值1
,C5
始终具有值N-1
(N
学生人数在哪里),然后在整个工作表中遵循您的“轮换”模式?
如果是这样,您可以在第一列中使用以下公式(我的示例是 for B6
)
=IF(OR(B5=number_of_students,B5=""),"",B5+1)
然后表中的每个其他单元格都可以有(我的例子是 for C5
):
=IF(B5="","",IF(B5=1,number_of_students,B5-1))
还是比这更复杂?
编辑显然,我没有阅读您的整个帖子。更新为使用输入框来输入您想要多少学生:
Option Explicit
Private theArray() As Long
Sub populateArray()
Dim elements As Long
Dim response As String
response = InputBox("Enter the number of students", "Number of students?")
If IsNumeric(response) Then
elements = CLng(response)
ElseIf response = "" Then
Exit Sub
Else
MsgBox "Invalid input!", vbCritical
Exit Sub
End If
ReDim theArray(1 To elements, 1 To elements)
Dim i As Long, j As Long, num As Long
For i = 1 To elements
For j = 1 To elements
num = i - j + 1
If num < 1 Then num = num + elements
populateArray(i, j) = num
Next
Next
End Sub
如下所示,您可以populateArray
替换为Cells
,它将直接写入ActiveSheet
.
原始答案 这将使用您列出的格式填充数组:
Dim yourArray(1 To 20, 1 To 20) As Long
Dim i As Long, j As Long, num As Long
For i = 1 To 20
For j = 1 To 20
num = i - j + 1
If num < 1 Then num = num + 20
yourArray(i, j) = num
Next
Next
顺便说一句,您还可以使用单元格而不是 yourArray 来填充工作表的一部分。
例如,如果您想在图像上列出的位置填充单元格,则可以直接在循环中使用以下方法:
Dim i As Long, j As Long, num As Long
For i = 1 To 20
For j = 1 To 20
num = i - j + 1
If num < 1 Then num = num + 20
Cells(i + 4, j + 1) = num
Next
Next
从技术上讲,整个数组只写入一次单元格会更快,但在这种情况下,速度差异可以忽略不计。
只有在绝对必要的情况下,我才会求助于 VBA。
这可以通过 3 个步骤完成:
命名您的 20 x 20 网格(例如 schedGrid)。
将此公式放入单元格中B5
=IF(COLUMN()=2,ROW()-ROW(schedGrid)+1,IF(A5-1=0,ROWS(schedGrid),A5-1))
而已。额外的好处是您可以将网格调整为任何大小。