我正在尝试将数组直接转储到工作表而不循环。除“字节”数组外,所有数据类型均可以使用此功能。为什么会这样?
我想使用字节数组,以节省内存成本(数据经常超过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
答案 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),您需要:
答案 2 :(得分:0)
假设我们有一个非常大的布尔数组,我们想要:
然后是这样:
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
会做到的。