在不循环的情况下将字节数组写入Excel VBA中的范围

时间:2018-07-17 11:42:21

标签: arrays excel vba excel-vba

我正在尝试将数组直接转储到工作表而不循环。除“字节”数组外,所有数据类型均可以使用此功能。为什么会这样?

我想使用字节数组,以节省内存成本(数据经常超过2GB excel限制)。虽然我通过分成多个块来解决此问题,但我想了解为什么不能将Byte数组直接转储到范围中。

修改1:

该数组的值为0或1。我希望输出按原样显示。 使用布尔数组可将其设置为TRUE或FALSE,我不希望这样做。 有任何优化的(内存和速度)方式可以做到这一点吗?

Sub ArrayPasting()

    Dim byteArray(1 To 3) As Byte
    Dim intArray(1 To 3) As Integer

    For i = 1 To 3
        byteArray(i) = i
        intArray(i) = 2 * i
    Next i

    ActiveSheet.Range(Cells(1, 1), Cells(1, 3)).Value = intArray    'range populated with intArray
    ActiveSheet.Range(Cells(2, 1), Cells(2, 3)).Value = byteArray   'error

End Sub

3 个答案:

答案 0 :(得分:1)

您可以使用Application.transpose(在这种情况下):

Sub ArrayPasting()

    Dim byteArray(1 To 3) As Byte
    Dim intArray(1 To 3) As Integer

    For i = 1 To 3
        byteArray(i) = i
        intArray(i) = 2 * i
    Next i

    ActiveSheet.Range(Cells(1, 1), Cells(1, 3)).Value = intArray    'range populated with intArray
    ActiveSheet.Range(Cells(2, 1), Cells(2, 3)).Value = Application.Transpose(Application.Transpose(byteArray))

End Sub

答案 1 :(得分:0)

您不能在Excel中存储二进制数组值的直接性。您必须将它们转换为Excel可接受的格式。将数组值编码为base-64字符串。然后可以将其存储在Excel单元格中。

好吧,如果您真的需要在Excel中存储二进制数据(这是对Excel的一点滥用。不是为二进制数据存储创建Excel),您需要:

  1. 将二进制数据转换为文本(您已经通过base-64编码完成了此操作)
  2. 将文本分割成较小的块,并将每个块存储在单独的单元格中。这样一幅图像将被存储在几个单元格中。

答案 2 :(得分:0)

假设我们有一个非常大的布尔数组,我们想要:

  • 转储到单元格
  • 转换为1/0 (其中TRUE为1)

然后是这样:

Sub SayBoo()
    Dim Boo(1 To 2, 1 To 2) As Boolean
    Dim r As Range
    Set r = Range("A1:B2")

    Boo(1, 1) = True
    Boo(1, 2) = True
    Boo(2, 1) = False
    Boo(2, 2) = False
    r = Boo

    With r
        .Value = Evaluate("=IF(" & .Address & ",1,0)")
    End With

End Sub

会做到的。