【问题标题】:Assigning an array to another array in one line在一行中将一个数组分配给另一个数组
【发布时间】:2018-08-22 01:35:40
【问题描述】:

我是 VBA 新手,我似乎无法提出一个非常简单的概念 - 将一个数组分配给另一个数组,它们的大小和类型都相同。就像在这个例子中一样:

Option Explicit

Sub main()
    Dim arr1(2), arr2(2) As Double

    arr1(0) = 5
    arr1(1) = 10

    arr2 = arr1 'error here

    Debug.Print arr2(0)
    Debug.Print arr2(0)
End Sub

运行会返回错误

“无法分配给数组”

现在,我知道我可以使用 For 循环遍历每个元素,但在某些高级情况下,使用它是不切实际的 - 例如,我有一个返回数组的慢速加载函数,因此,我只想运行一次,获取整个返回值并分配给其他数组,如下所示:

arr1 = Very_Slow_Function_That_Returns_An_Array()

但显然,这也不起作用,并且会产生相同的错误。那么,可以做些什么呢?有人可以就如何将整个数组分配给另一个数组而不必遍历每个元素提供一些建议吗?

【问题讨论】:

  • 您将arr1 定义为Variant 并将arr2 定义为Double - 这是个问题。
  • This us is a nearly-XY 问题:您可能想询问为什么'Very_Slow_Function_That_Returns_An_Array()' 反而这么慢!

标签: arrays vba function


【解决方案1】:

您可以像这样在 VBA 中将一个数组分配给另一个数组:

Option Explicit

Sub main()

Dim arr1 As Variant
Dim arr2 As Variant

arr1 = Array(5, 10)

'Assign array1 to array2
arr2 = arr1

Debug.Print arr1(0)
Debug.Print arr2(0)
End Sub

【讨论】:

  • 但是那么arr2的数据类型还是Variant。如何将其转换为 Double 而不必遍历每个元素?
【解决方案2】:

这些变体有效:

Sub main()

    Dim arr1() As Double, arr2() As Double

    ReDim arr1(0 To 1)
    arr1(0) = 5
    arr1(1) = 10

    arr2 = arr1

End Sub  

Sub main()

    Dim arr1() As Variant, arr2() As Variant

    arr1 = Array(5, 10)

    arr2 = arr1

End Sub  

最接近OP代码的第三个变体:

Sub main()
    Dim arr1(0 To 1) As Double, arr2() As Double

    arr1(0) = 5
    arr1(1) = 10

    arr2 = arr1 'no error here now.

End Sub

【讨论】:

  • 但是那么arr2的数据类型还是Variant。如何将其转换为 Double 而不必遍历每个元素?
  • 第一个代码块将作为 double 工作。我会更新的。
  • 哇。它确实是这样工作的。但是,与我最初的示例相反,为什么这样写它会起作用?
  • 一开始我以为可能是因为您将arr2 声明为双精度,而将arr1 作为变体(您需要声明每个变量的数据类型),然后认为这是因为您的数组具有三个元素(0 到 2),然后发现如果您将两者都声明为双精度并将 arr2 的大小留空,您的代码将起作用。我将在我的答案中添加第三个变体。
  • 我现在试了一下,发现声明为 this -> Dim arr1(2) As Double, arr2() As Double 也可以。但为什么?你能解释一下为什么需要省略 arr2 的大小来完成这项工作吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多