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所以不是很了解,请帮忙 展开
数组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所以不是很了解,请帮忙 展开
2个回答
展开全部
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
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
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询