【问题标题】:Populate Defined Named Range with multi-element array of multi-element arrays使用多元素数组的多元素数组填充定义的命名范围
【发布时间】:2019-11-26 07:11:08
【问题描述】:

我已经定义了 5 个数组。

一个具有未定义尺寸来存储其他 4 个:

Dim outputArr() As Variant

其余如下:

Dim Arr1(5, 0), Arr2(12, 0), Arr3(5, 0), Arr4(12, 0) As Variant

我将后者的元素分配如下:

Arr1(0, 0) = [{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}]
Arr1(1, 0) = [{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}]
Arr1(2, 0) = [{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}]
Arr1(3, 0) = [{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}]
Arr1(4, 0) = [{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}]
Arr1(5, 0) = [{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}]

上述适用于每个数组。

当我使用时

ReDim outputArray(3, 0)

outputArr = [{Arr1, Arr2, Arr3, Arr4}]

我收到 'Type Mismatch' 错误。

当我不使用Evaluate 并且不使用ReDim 进行分配时

outputArr = Array(Arr1, Arr2, Arr3, Arr4)

我可以在 Watch 窗口中看到元素及其值,但是当我尝试使用 outputArr 的元素填充定义的命名范围时,我得到一个空输出

Range("nRange1name").Value = outputArr(0)
Range("nRange2name").Value = outputArr(1)
Range("nRange3name").Value = outputArr(2)
Range("nRange4name").Value = outputArr(3)

我该如何解决这个问题?

【问题讨论】:

  • “我收到一个错误。” - 你得到什么错误?
  • @TimWilliams 类型不匹配错误。
  • 有什么想法@TimWilliams?
  • 让我们看看完整的代码。
  • @RyanWildry,恐怕就是这样。我唯一遗漏的是其他 3 个数组 Arr2, Arr3, Arr4 的分配和一个相当长的 Select Case,它在将值分配给数组元素之前将它们分配给父数组 outputArr。

标签: arrays excel vba multidimensional-array


【解决方案1】:

在 OP 代码中使用变体引入了不必要的维度。我不明白为什么需要两个转置函数,但以下代码令人满意地粘贴了二维数组。

选项显式

Sub TestArrays()

Dim outputArr               As Variant
Dim Arr1                    As Variant
Dim Arr2                    As Variant
Dim Arr3                    As Variant
Dim Arr4                    As Variant

Arr1 = Array(Array(1, 2, 3, 4, 5, 6, 7, 8, 9), Array(1, 2, 3, 4, 5, 6, 7, 8, 9))
Arr2 = Array(Array(1, 2, 3, 4, 5, 6, 7, 8, 9), Array(1, 2, 3, 4, 5, 6, 7, 8, 9))
Arr3 = Array(Array(1, 2, 3, 4, 5, 6, 7, 8, 9), Array(1, 2, 3, 4, 5, 6, 7, 8, 9))
Arr4 = Array(Array(1, 2, 3, 4, 5, 6, 7, 8, 9), Array(1, 2, 3, 4, 5, 6, 7, 8, 9))

outputArr = Array(Arr1, Arr2, Arr3, Arr4)
' For Horizontal ranges
Range("A1:H2") = Application.WorksheetFunction.Transpose(Application.WorksheetFunction.Transpose(outputArr(2)))


'For Vertical ranges
Range("A4:B11") = Application.WorksheetFunction.Transpose(outputArr(3))

End Sub

【讨论】:

  • 我会在早上测试这种方法。
【解决方案2】:

你需要构造一个实际的二维数组来做类似的事情。

Dim arr(1 to 6, 1 to 12)
dim r as long, c as long

for r = lbound(arr, 1) to ubound(arr, 1)
    for c = lbound(arr, 2) to ubound(arr, 2)
        arr(r, c) = 0
    next c
next r

Range("A1").Resize(ubound(arr, 1), ubound(arr, 2)).value = arr

【讨论】:

  • 非常感谢。我会试试你的方法。但是,我正在尽我最大的努力不要为此使用循环,因为元素数据来自的数据库非常大。我为此使用了Select Case,因为我无权在我的公司 Excel 帐户上使用Dictionaries,更不用说FSO。
  • 我从不担心性能,除非它被证明很差。显而易见的方法通常是最好的方法,只有偶尔你才需要回来重新工作。编辑:显然“显而易见”是主观的,我意识到不同的人会采取不同的方法......
  • 我早上试试这个。
  • 感谢您在我的问题上花费的时间和精力。然而,Freeflow 提供了一个更简单但有效的解决方案。使用循环将元素分配给二维数组就像循环遍历我需要填充的所有单元格。这是我一直在避免的,因为性能是这个项目首先返回给我们团队的原因。
  • 您的选择,但要指出的是,遍历数组的性能不与逐个单元格地遍历范围的性能相当。如果您需要确认,我建议您自己测试一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 2022-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
相关资源
最近更新 更多