首页 > 解决方案 > Excel转置二维数组 - 内存不足问题

问题描述

我有一个 VBA 宏,我想在其中将一个数组写入 Excel 工作表。我在某些机器上收到“内存不足”运行时错误。我可以在我的开发 PC 上轻松运行它,但我的客户遇到了问题。

在这里,我定义了我的Values数组:

Dim Values()
Dim idx As Long
idx = 0

然后我有一个 for 循环,我动态地重新调整数组,并将我的值添加到它:

for cycle...
    ReDim Preserve Values(16, 0 To idx)
    Values(0, idx) = "some text"
    Values(1, idx) = "some other text"
    ....
    Values(15, idx) = "last values for this row"
    idx = idx + 1
next

然后这是我的代码失败的地方:

With ws
    .Range(.Cells(1, 1), .Cells(1+ idx - 1, 16)).value = TransP(Values)
End With

这是TransP转置功能:

Public Function TransP(var As Variant) As Variant
    Dim outP() As Variant, i As Long, j As Long
    ReDim outP(LBound(var, 2) To UBound(var, 2), LBound(var, 1) To UBound(var, 1))
    For i = LBound(outP) To UBound(outP)
      For j = LBound(var) To UBound(var)
        outP(i, j) = var(j, i)
      Next
    Next
    TransP = outP
End Function

正如我所说,我可以运行宏,并得到类似 108770 行的内容。相同的 108770 行在我的客户端 PC 上不起作用。

我希望 TransP 函数在他的 PC 上放弃,所以我应该将数组拆分为多个较小的块,并逐个写入它们吗?还是我的数据模型不好?

标签: arraysexcelvbatranspose

解决方案


您还可以创建一个循环来逐行写入输出数组,这将花费更多时间,但您很可能不会出现内存不足错误。

过去,当我遇到数组内存不足问题时,我只是尝试使用常规 excel 命令执行操作,在这种情况下,您可以只复制范围,然后粘贴转置的值:

.PasteSpecial Paste:=xlPasteValues, Transpose:=True

推荐阅读