WorksheetFunction.Transpose 更改数据类型

WorksheetFunction.Transpose changes data type

我在 VBA 中使用 WorksheetFunction.Transpose 将混合 dates/strings 的一维数组转换为二维数组以写入工作表。

我的 windows 区域设置设置为 DMY,写回的日期被 months/day 切换。

关于 Dates 通过 WorksheetFunction.Transpose 方法转换为 Strings 的问题已在本论坛中提及。

我对此进行了更深入的研究。

似乎WorksheetFunction.Transpose转换了很多数据类型。转置后的结果将是 BooleanDoubleString

在VBA中使用此方法时需要考虑到这一点。

下面是一些演示问题的代码:

Option Explicit
Option Base 1
Sub Tester()
    Dim v, w, i As Long
    
v = Array(CBool(-1), CBool(0), CByte(9), CDbl(1234), CDec(1234), _
            CInt(1234), CLng(1234), CLngPtr(1234), CSng(1234), _
            CCur(123456), #5/1/2015#, "1234")
            
w = WorksheetFunction.Transpose(v)

For i = 1 To UBound(v)
    Debug.Print v(i), TypeName(v(i)), w(i, 1), TypeName(w(i, 1))
Next i


End Sub

debug.print输出

True          Boolean       True          Boolean
False         Boolean       False         Boolean
 9            Byte           9            Double
 1234         Double         1234         Double
 1234         Decimal        1234         Double
 1234         Integer        1234         Double
 1234         Long           1234         Double
 1234         Long           1234         Double
 1234         Single         1234         Double
 123456       Currency      3,456.00   String
01-May-15     Date          01-05-2015    String
1234          String        1234          String

编辑 WorksheetFunction.Transpose

的另一个问题
  • 给定一个一维数组
  • 转置数组第一维的上限将由公式Ubound(1D_array) mod 2^16
  • 给出
  • 只有 first uBound(1D_array) mod 2^16 元素将 returned 到转置数组。
    • 因此,如果一维数组的 ubound 为 65537,则转置数组将仅包含一个项目(原始数组中的第一项)
    • 不会return编辑任何错误消息。
      • 我认为缺少错误消息并且此行为始于 Excel 2013。我记得早期版本会 return 在这种情况下出现错误消息。

您可以在内存中使用 ListBox 进行转置,而无需使用 Transpose 并且数据类型保持不变:

Option Explicit
Option Base 1
Sub Tester2()
    Dim v, w, i As Long
    
v = Array(CBool(-1), CBool(0), CByte(9), CDbl(1234), CDec(1234), _
            CInt(1234), CLng(1234), CLngPtr(1234), CSng(1234), _
            CCur(123456), #5/1/2015#, "1234")
            
w = WorksheetFunction.Transpose(v)

For i = 1 To UBound(v)
    Debug.Print v(i), TypeName(v(i)), w(i, 1), TypeName(w(i, 1))
Next i
   
    With CreateObject("New:{8BD21D20-EC42-11CE-9E0D-00AA006002F3}")
    'Listbox always Base 0
        .List = v
         w = .List 'Now 2-dim with correct typenames, use .column for transpose Row-column)
    End With

For i = 1 To UBound(v)
    Debug.Print v(i), TypeName(v(i)), w(i - 1, 0), TypeName(w(i - 1, 0))
Next i

End Sub