VBA中Double与Variant数组转置时的差异原因咨询
VBA中转置数组时Variant与Double类型的差异原因
核心原因:Transpose函数的返回类型与强类型数组的赋值限制
Application.WorksheetFunction.Transpose函数的返回值始终是Variant类型的二维数组——哪怕输入的是Double类型数组,返回的数组整体类型依然是Variant(仅数组元素为Double值)。
VBA中,强类型数组(比如Double())只能接收同类型的数组,无法直接接收Variant类型数组。哪怕元素类型匹配,数组本身的类型不兼容,赋值时就会触发类型不匹配错误。而Variant类型数组属于弱类型,可以接收任意类型的数组,因此能正常接收Transpose的返回结果。
为什么调整输入数组维度也没用?
哪怕你把输入数组c改为二维Double数组(ReDim c(1,5)),Transpose返回的依然是Variant类型的二维数组,数组类型不匹配的问题依然存在,所以还是会报错。
解决方法
方法1:手动实现转置,直接操作Double数组
绕开WorksheetFunction.Transpose,用循环完成转置,避免类型不兼容问题:
Option Base 1 Sub testDELput() Dim c() As Double Dim d() As Double Dim i As Integer ReDim c(5) For i = 1 To 5 ' 给c赋值测试值 c(i) = 10 * i Next ReDim d(5, 1) ' 初始化列向量数组 ' 手动转置 For i = 1 To 5 d(i, 1) = c(i) Next End Sub
方法2:先通过Variant数组中转,再转换为Double数组
先把Transpose的结果存到Variant数组,再逐个元素赋值到Double数组:
Option Base 1 Sub testDELput() Dim c() As Double Dim tempArr As Variant Dim d() As Double Dim i As Integer ReDim c(5) For i = 1 To 5 c(i) = 10 * i Next ' 先接收Transpose的结果到Variant数组 tempArr = Application.WorksheetFunction.Transpose(c) ' 初始化Double数组并赋值 ReDim d(UBound(tempArr, 1), UBound(tempArr, 2)) For i = 1 To UBound(tempArr, 1) d(i, 1) = tempArr(i, 1) Next End Sub
内容的提问来源于stack exchange,提问作者Guille
相关产品推荐
相关产品推荐

