在一个数组中重复一个数字 N 次
Repeat a Number N Times in an Array
与 Excel 一起工作 VBA。
我正在尝试创建一个具有重复模式的数组,如下所示:
a = Array(1,1,1,1,1,2,2,2,2,2,2)
是否有一个巧妙的解决方案(无需通过循环)来做到这一点?在几乎所有其他统计语言中,这是通过重复函数完成的。例如 R 中的 "rep" 函数或 Matlab 中的 "repmat" 函数:
a = [repmat(1,1,5),repmat(2,1,6)]
首先不对所有内容进行硬编码的原因是实际数组的长度因其他一些变量而异。
输出: 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
像这样?
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
上面的代码会给你输出作为你的例子。
这里有一个比较灵活的函数:
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,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
与 Excel 一起工作 VBA。
我正在尝试创建一个具有重复模式的数组,如下所示:
a = Array(1,1,1,1,1,2,2,2,2,2,2)
是否有一个巧妙的解决方案(无需通过循环)来做到这一点?在几乎所有其他统计语言中,这是通过重复函数完成的。例如 R 中的 "rep" 函数或 Matlab 中的 "repmat" 函数:
a = [repmat(1,1,5),repmat(2,1,6)]
首先不对所有内容进行硬编码的原因是实际数组的长度因其他一些变量而异。
输出: 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
像这样?
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
上面的代码会给你输出作为你的例子。
这里有一个比较灵活的函数:
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,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