我将在前言中说我对VBA很陌生,今天自从大学经济学以来没有使用它后,今天有效地重新启动了。
我创建了一个二维数组Answers()
,其中包含许多回答者(Resp
)对一些问题(Ques
)的回答。
以下是数组中第一行的示例:
[3,3,3,2,1,2,2,3,1,3,1,2]
我需要将其格式化为一个新数组,在原始数组中的每个值之间有两个0
值,最后一行,这样第一行最终会像这样结束:
[3,0,0,3,0,0,3,0,0,2,0,0,1,0,0,2,0,0,2,0,0,3,0,0,1,0,0,3,0,0,1,0,0,2,0,0]
我已经搜索了类似的例子并发现了一些接近的东西,但我无法弄清楚如何在for循环的每一步中从原始数组中读取正确的值:
Dim Resp As Integer
Dim Ques As Integer
Resp = 200
Ques = 12
Dim Answers() As Integer
ReDim Answers(1 to Resp, 1 to Ques) As Integer
Dim lastIndex As Integer
lastIndex = Ques * 3
Dim Answers_Long() As Integer
ReDim Answers_Long(1 To Resp, 1 To lastIndex) As Integer
For r = 1 To Resp
For i = 1 To lastIndex Step 3
Answers_Long(r, i) = Answers(r, CInt(i / 3))
Answers_Long(r, i + 1) = 0
Answers_Long(r, i + 2) = 0
Next i
Next r
如果您有关于如何更改该行的任何提示:
Answers_Long(r, i) = Answers(r, CInt(i / 3))
要正确阅读Answers()
中的数据,我们将不胜感激。
答案 0 :(得分:0)
在For i = 1 To lastIndex Step 3
内,变量i
从1开始,并在循环的每次迭代中递增3。也就是说,它取值1,4,7,10,13,16等
这些值不可被3整除(因为序列从1开始而不是0),所以当你将i
除以3时,最终会得到像0.3333这样的小数值, 1.3333,2.33333,3.33333等
幸运的是,CInt()
确实将这些小数舍入到最接近的整数,因此CInt(i / 3)
将取值0,1,2,3等。但是,您仍然得到了问题:由于您声明Answers()
数组使用基于1的索引(使用1 to Ques
),因此每行的第一个元素的索引不是0,而是1。
因此,您需要在CInt()
的输出中添加1以实际获得正确的索引。 (这是基于0的数组索引实际上会导致更简单的代码的情况之一。)
您可以对现有代码进行的最少更改是:
Answers_Long(r, i) = Answers(r, 1 + CInt(i / 3))
或者,您也可以使用以下方法避免对除法结果进行舍入:
Answers_Long(r, i) = Answers(r, 1 + CInt((i - 1) / 3))
在这种情况下,您应该能够完全摆脱CInt()
:
Answers_Long(r, i) = Answers(r, 1 + (i - 1) / 3)
当然,另一种选择是完全重写代码以使用基于0的数组索引,在这种情况下它看起来像这样:
Dim Answers() As Integer
ReDim Answers(0 to Resp-1, 0 to Ques-1) As Integer
Dim TripleQues As Integer
TripleQues = Ques * 3
Dim Answers_Long() As Integer
ReDim Answers_Long(0 to Resp-1, 0 to TripleQues-1) As Integer
For r = 0 To Resp - 1
For i = 0 To TripleQues - 3 Step 3
Answers_Long(r, i) = Answers(r, i / 3)
Answers_Long(r, i + 1) = 0
Answers_Long(r, i + 2) = 0
Next i
Next r