excel - 将一维数组(变体类型)转换为一维数组(字节类型)

标签 excel vba

我试图避免以下代码中的循环

Sub Demo()
    Dim v, en As ASCIIEncoding, myArr() As Byte, i As Long
    Set en = New ASCIIEncoding
    v = Array(89, 97, 115, 115, 101, 114)
    ReDim myArr(0 To UBound(v))
    For i = LBound(v) To UBound(v)
        myArr(i) = v(i)
    Next i
    Debug.Print en.GetString(myArr)
End Sub
我使用循环来转换一维数组,它是 Variant v至字节 myArr .该代码正在运行,但我正在尝试寻找一种避免使用循环的方法。

最佳答案

答案是否定的,您不能只将变体数组分配给字节数组而不使用循环。顾名思义,一个 Byte 在内存中占用 1 个字节,而持有一个 Byte 的 Variant 将占用 16 个字节 (x32) 或 24 个字节 (x64)。 SAFEARRAY(在 COM 中保存数组的结构)中的对齐将不允许简单的内存复制。更不用说 Variant 可以保存 Byte 的 0-255 范围之外的值。
我建议使用辅助功能来实现您的目标:

Public Function ArrayByte(ParamArray values() As Variant) As Byte()
    Dim b() As Byte
    Dim v As Variant
    Dim i As Long
    '
    ReDim b(LBound(values) To UBound(values))
    i = LBound(b)
    For Each v In values
        b(i) = CByte(v) 'This can throw an error. You might want to implement some checks in order to raise a custom error
        i = i + 1
    Next v
    ArrayByte = b
End Function
这样,您的代码将变为:
Sub Demo()
    Dim en As ASCIIEncoding
    Dim myArr() As Byte

    Set en = New ASCIIEncoding
    myArr = ArrayByte(89, 97, 115, 115, 101, 114)

    Debug.Print en.GetString(myArr)
End Sub

关于excel - 将一维数组(变体类型)转换为一维数组(字节类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64614027/

相关文章:

excel - ListBox 中的多选值可粘贴到另一张工作表的不同单元格中

json - 使用 VBA 和 VBA-JSON 从 Wordpress API 访问 JSON 数据

Excel VBA - 如果自动筛选器不包含记录,MsgBox

mysql - 如何在VBA上将单元格Excel单元格引用定义为SQL查询中的参数?

excel - 打开 Excel 工作簿时出错,程序停止响应

excel - 按名称引用 QueryTable 对象

vba - 使用嵌入变量引用范围

excel - 如何计算由另一列分组的同一列的时间差?

c# - 使用 C# 在 Powerpoint 2013 中创建具有多个系列的图表

c# - 在 C# Windows 应用程序中替换 Excel 单元格值时出现警告消息