VBA中如何通过单行代码将一个数组赋值给另一个数组?
解决VBA中数组直接赋值的"Can't assign to array"错误
嘿,作为VBA新手遇到这个问题太正常了——我当初也踩过这个坑!你说的这个错误,核心原因是VBA对**静态数组(固定大小)和动态数组(不指定大小)**的赋值规则完全不一样。
为什么会报错?
当你声明类似Dim arr1(1 To 5) As Integer这种固定大小的静态数组时,VBA会在内存里给它分配一块固定的空间,不允许直接把另一个数组的整块数据塞进去,哪怕两者类型、大小完全匹配,这就是你看到"Can't assign to array"的原因。
而你不想用For循环的需求非常合理——尤其是调用慢加载函数的时候,重复调用简直是浪费时间。下面给你最实用的解决方案:
方案1:用动态数组直接赋值(推荐)
这是最简洁高效的方法,只需要把目标数组声明为不指定大小的动态数组,就能直接用=完成整数组赋值,而且慢加载函数只会执行一次。
举个完整的例子:
' 模拟你说的加载缓慢的函数,返回一个Integer类型数组 Function SlowLoadingArrayFunc() As Integer() Dim resultArr(1 To 4) As Integer ' 模拟加载延迟 Application.Wait Now + TimeValue("00:00:01") resultArr(1) = 100 resultArr(2) = 200 resultArr(3) = 300 resultArr(4) = 400 SlowLoadingArrayFunc = resultArr End Function Sub TestDirectAssignment() ' 声明动态数组:只指定类型,不写大小 Dim targetArr() As Integer ' 直接赋值!函数只运行一次,整数组直接传递 targetArr = SlowLoadingArrayFunc() ' 验证结果(打开立即窗口查看:Ctrl+G) Dim i As Integer For i = LBound(targetArr) To UBound(targetArr) Debug.Print "元素" & i & ": " & targetArr(i) Next i End Sub
运行这个代码,你会发现函数只执行一次,而且数组完美赋值,完全不需要循环。
额外注意事项
- 类型匹配:源数组和目标数组的类型必须完全一致(比如都是
Integer,或者都是String),如果函数返回的是Variant类型的数组,目标数组可以声明为Variant或者对应类型的动态数组。 - 动态数组的自动调整:赋值后,动态数组的大小会自动和源数组保持一致,不需要手动
ReDim。 - 静态数组的局限性:如果因为特殊需求必须使用固定大小的静态数组,那确实只能通过循环逐个赋值,这种情况就没办法避免遍历了,所以优先推荐动态数组方案。
希望这个方法能帮到你,解决你的痛点!
内容的提问来源于stack exchange,提问作者J R
相关产品推荐
相关产品推荐

