vba中:如何将一个数组的一串元素复制给另外一个数组

例:数组A:{1,2,3,4,5,6,7,8,9,10}现在要将数组A中2~9这些元素一次性复制给数组BSubtest()DimarrA()AsIntegerDimarr... 例:
数组A:{1,2,3,4,5,6,7,8,9,10}
现在要将数组A中2~9这些元素一次性复制给数组B

Sub test()
Dim arrA() As Integer
Dim arrB() As Integer

For i = 1 To 10
arrA(i) = i
Next i
End Sub

不要循环复制,CopyMemory不会用,如可以实现请明示
我需要一次性复制过来,保证效率
问题的初衷是:
我想做个方法移除数组中的某个元素(像Java List 中的 Remove(Index)),因为是初学vba所以不是很了解,请帮忙
展开
 我来答
最美乡村行
2011-08-08 · TA获得超过1136个赞
知道大有可为答主
回答量:1191
采纳率:0%
帮助的人:1635万
展开全部
vb里面没有这样的函数,CopyMemory是可以的,看看下面的实例
vb6在我机子上用下面数据测试 时间差20倍左右,十万个数据就可以看出来了,我用的是一百万
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub Command1_Click()
Dim arrA() As Long
Dim arrB() As Long

ReDim arrA(1 To 1000000)
ReDim arrB(2 To 1000000)

For i = 1 To 1000000
arrA(i) = i
Next i
'取得开机至今的毫秒数
T = GetTickCount

For i = 2 To 1000000
arrB(i) = arrA(i)
Next
MsgBox "用时" + Str$(GetTickCount - T) + "毫秒"
'我的机子用时200毫秒左右,机子老古董了比较慢不要见笑
ReDim arrB(2 To 1000000) '注意这行已经清空了上面的赋值
T = GetTickCount
CopyMemory arrB(2), arrA(2), LenB(arrA(1)) * 999999
MsgBox "用时" + Str$(GetTickCount - T) + "毫秒"
'我的机子用时10毫秒左右
'看看最后一个数据对不对
MsgBox arrB(1000000)
End Sub
追问
您是个行家,能帮我看看这个问题能不能用别的方案解决,最好能保证效率
我想做个方法移除数组中的某个元素(像Java List 中的 Remove(Index)),因为是初学vba所以不是很了解,请帮忙
追答
写了一个函数,方法移除数组中的某个元素,注意类型匹配问题,要改成和你传过来统一类型,比如你的原数组是String的那么arr() As String  ,arrT() As String

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

'注意arr和你传过来的类型要匹配,现在是integer,还有里面arrT也要和这个统一类型
'arr是要传过来的数组,说明既然你要删除数组arr的中一个,那么自然你传过来的的数组要是动态的。index是要删除的那项下标
Sub Remove(arr() As Integer, index As Long)
Dim k As Long, j As Long, L As Long, arrT() As Integer
k = LBound(arr): j = UBound(arr)
L = LenB(arr(LBound(arr)))
ReDim arrT(k To j - 1)

Select Case index
Case k
CopyMemory arrT(k), arr(k + 1), L * (j - k)
Case j
CopyMemory arrT(k), arr(k), L * (j - k)
Case Else
CopyMemory arrT(k), arr(k), L * (index - k)
CopyMemory arrT(index), arr(index + 1), L * (j - index)

End Select
For i = 2 To UBound(arr)
Debug.Print arr(i)
Next
ReDim arr(k To j - 1)
For i = 2 To UBound(arr)
Debug.Print arr(i)
Next
CopyMemory arr(k), arrT(k), L * (j - k)

End Sub

Private Sub Command2_Click()
Dim arrA() As Integer
ReDim arrA(2 To 6)
For i = 2 To 6
arrA(i) = i
Next
'arrA数组是下标从2开始的一个数组,删除下标4的
Remove arrA, 4

Debug.Print UBound(arrA)

For i = 2 To UBound(arrA)
Debug.Print arrA(i)
Next

End Sub
百度网友bdb9803
2011-08-08 · TA获得超过1.1万个赞
知道大有可为答主
回答量:1.1万
采纳率:53%
帮助的人:1亿
展开全部
好像没你说的功能,VB.NET就有了,可以用ArrayList实现。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式