如何在数组的特定索引处插入新值并将所有元素下移一个索引?

3

假设我在VBA中有这个数组:

a(0) = 1
a(1) = f
a(2) = g
a(3) = 4
.
..
..
a(k) = a

我想在(0)处插入一个新值,并将每个值下移一个索引,如下所示。
a(0) = newVal
a(1) = 1
a(2) = f
a(3) = g
a(4) = 4
.
..
..
a(k+1) = a

有没有简便的代码实现方式?如果没有,最快的方法是什么?

我可以用简单的for循环来实现,但我想知道是否有更有效率的方式?

例如,这是我能想到的:

Dim temp()

Redim Preserve temp(0)
temp(0) = "newVal"

For i= lbound(a) + 1 to ubound(a) + 1
     redim preserve temp(i)
     temp(i) = a(i-1)
Next i

来吧,你已经在这里待了足够长的时间,知道它是如何工作的,你到目前为止尝试了什么?分享你的代码尝试。 - Shai Rado
不,你需要循环! ;) 你可以将其放在过程中,这样易于重用,但是你必须传输数组的每个值!如果卡住了,就发布你的代码并寻求帮助吧!;) @ShaiRado: 早上好美女!^^ - R3uK
如果您事先知道需要执行此类操作,则应使用集合。 - Amorpheuses
4个回答

3
以下代码将通过变量NewVal向已有的填充数组添加一个值。您可以使用该代码在数组中间或末尾添加元素(如果需要),只需修改ElemId的值即可。 注意:如果您正在从工作表范围读取数组a的值,则可以简化代码。 代码
Option Explicit

Sub AddElemToArray()

Dim a() As Variant
Dim ElemId  As Long, i As Long
Dim NewVal As Variant

ReDim a(0 To 4) '<-- modify th value 4 to your array size
NewVal = "Test"

a(0) = 1
a(1) = "f"
a(2) = "g"
a(3) = 4
a(4) = "a"

ReDim Preserve a(0 To UBound(a) + 1)

ElemId = 2 '<-- which element ID inside the array to modify

For i = UBound(a) To ElemId + 1 Step -1
    a(i) = a(i - 1)
Next i
a(ElemId) = NewVal

End Sub

2
如果您不介意将所有字符串值放在最后。
Dim newVal As Variant
Dim tempVar As Variant

newVal = "newValue"

tempVar = newVal & "|"  & Join(a, "|")
ReDim a(0 To k + 1) As Variant
tempVar = Split(tempVar, "|")
For i = 0 To k + 1
    a(i) = tempVar(i)
Next

1
泛化@Shai Rado's answer,这里是ReDim方法作为通用可重复使用的函数。 参数index是可选的;如果省略,则新项目将被添加到末尾(类似于push)。
Function ArrayInsert(ByRef a As Variant, NewVal As Variant, Optional index As Integer = -1) As Variant
    Dim i As Long
    ReDim Preserve a(0 To UBound(a) + 1)
    If index = -1 Then index = UBound(a)
    For i = UBound(a) To index + 1 Step -1
        a(i) = a(i - 1)
    Next i
    a(index) = NewVal
    ArrayInsert = a
End Function

为了方便起见,这会改变输入数组a并返回已改变的数组。

1
Public Function InsertFrontArray(InputArr As Variant, value As Variant) As Variant

InsertFrontArray = Split(value & "|" & Join(InputArr, "|"), "|")

End Function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接