在数组中重复N次

使用Excel VBA。

我试图创build一个像这样的重复模式的数组:

a = Array(1,1,1,1,1,2,2,2,2,2,2) 

有没有一个整洁的解决scheme(没有经过一个循环)来做到这一点? 在几乎所有其他统计语言中,这都是通过重复函数来完成的。 例如R中的“rep”函数或者Matlab中的“repmat”函数:

 a = [repmat(1,1,5),repmat(2,1,6)] 

首先不硬编码的原因是因为实际的数组具有不同的长度,取决于其他一些variables。

输出: A,B,B,1,1,1,2,2,2,2

 Sub ArrayHack() Dim a() BuildArray a, "A", 1 BuildArray a, "B", 2 BuildArray a, 1, 3 BuildArray a, 2, 4 Debug.Print Join(a, ",") End Sub Function BuildArray(a As Variant, v As Variant, n As Integer) Dim i As Integer, count As Integer On Error Resume Next count = UBound(a) If Err.Number <> 0 Then ReDim a(0) count = -1 End If On Error GoTo 0 ReDim Preserve a(count + n) For i = 1 To n a(count + i) = v Next End Function 

输出: 1,1,1,1,1,2,2,2,2,2

 Sub ArrayHack2() Dim a Dim s As String s = Replace(String(5, ","), ",", 1 & ",") & Replace(String(5, ","), ",", 2 & ",") s = Left(s, Len(s) - 1) a = Split(s, ",") Debug.Print Join(a, ",") End Sub 

这是一个有点灵活的function:

 Function BuildArray(ParamArray params()) As Variant Dim A As Variant, v As Variant Dim i As Long, j As Long, k As Long, n As Long, m As Long, b As Long n = UBound(params) If n Mod 2 = 0 Then b = params(n) n = n - 1 End If For i = 1 To n Step 2 m = m + params(i) Next i ReDim A(b To b + m - 1) k = b For i = 0 To n - 1 Step 2 v = params(i) For j = 1 To params(i + 1) A(k) = v k = k + 1 Next j Next i BuildArray = A End Function 

它需要任何数量的参数。 如果有偶数个参数,则将它们分解为v,iforms的连续对v,i其中v是一个值, i是重复该值的次数,返回第一个索引为0的结果数组。如果存在奇数个传递的参数,最后一个参数被解释为数组的基数。 例如:

 Sub test() Dim A As Variant A = BuildArray(1, 3, 2, 4) 'creates 0-based array [1,1,1,2,2,2,2] 'verify: Debug.Print "A = " & LBound(A) & " to " & UBound(A) Debug.Print "Items: " & Join(A, ",") A = BuildArray(1, 3, 2, 4, 1) 'creates 1-based array [1,1,1,2,2,2,2] 'verify: Debug.Print "A = " & LBound(A) & " to " & UBound(A) Debug.Print "Items: " & Join(A, ",") End Sub 

输出:

 A = 0 to 6 Items: 1,1,1,2,2,2,2 A = 1 to 7 Items: 1,1,1,2,2,2,2 

喜欢这个?

 Const U = 11 'U = (4 + Max(i)) * Max(i) + Max(j) Sub ManipulatingArray() Dim InputArray As String, i As Long, j As Long, MyArray(1 To U) As Variant For i = 0 To 1 For j = 1 To 5 + i MyArray((4 + i) * i + j) = i + 1 Next Next Debug.Print Join(MyArray, ",") End Sub 

上面的代码会给你输出作为你的例子。