如何在VBA中重新格式化二维数组,使每个项之间有两个“0”值?

时间:2017-09-15 13:24:26

标签: arrays vba

我将在前言中说我对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()中的数据,我们将不胜感激。

1 个答案:

答案 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