Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将字节数组写入Excel VBA中的某个范围而不循环_Arrays_Vba_Excel - Fatal编程技术网

Arrays 将字节数组写入Excel VBA中的某个范围而不循环

Arrays 将字节数组写入Excel VBA中的某个范围而不循环,arrays,vba,excel,Arrays,Vba,Excel,我试图直接将数组转储到工作表中,而不进行循环。这适用于除“字节”数组之外的所有数据类型。为什么会这样 我想使用字节数组,以节省内存成本(数据通常超过2GB excel限制)。虽然我通过划分块来解决这个问题,但我想了解为什么字节数组不能直接转储到一个范围中 编辑1: 数组值为0或1。我希望输出按原样显示。 使用布尔数组可以得到TRUE或FALSE,这是我不喜欢的。 有没有优化(内存和速度)的方法 Sub ArrayPasting() Dim byteArray(1 To 3) As By

我试图直接将数组转储到工作表中,而不进行循环。这适用于除“字节”数组之外的所有数据类型。为什么会这样

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

编辑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

您可以使用Application.transpose(在本例中):


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

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

  • 将二进制数据转换为文本(您已经通过base-64编码进行了转换)
  • 将文本拆分为较小的块,并将每个块存储在单独的单元格中。这样,一个图像将存储在多个单元格中
    假设我们有一个非常大的布尔数组,我们想要:

    • 倒进牢房
    • 转换为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
    

    可以。

    字节数组通常用于二进制数据,这些数据不能表示为可打印文本,因此不能像其他类型一样处理,因为它们总是有可读的表示形式。“为了节省内存成本”可能需要一些澄清。@AlexK。“为了节省内存成本”-使用字节数组将比使用整数消耗更少的内存空间。通过这种方式,我可以减少必须处理和转储的块的数量,从而提高速度。
    将文本分割成更小的块,并将每个块存储在单独的单元格中
    ——这涉及循环,但OP要求不使用循环。这是一种很好的方法。但这需要两倍的时间(转储+重新写入)。@Surya你是对的。潜在的节省是大阵列的内存存储,而不是执行速度。
    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