【发布时间】:2020-06-25 11:11:14
【问题描述】:
我在 VBA 中使用WorksheetFunction.Transpose 将混合日期/字符串的一维数组转换为二维数组以写入工作表。
当我的 Windows 区域设置设置为 DMY 时,写回的日期会切换月/日。
【问题讨论】:
标签: excel vba transpose worksheet-function
我在 VBA 中使用WorksheetFunction.Transpose 将混合日期/字符串的一维数组转换为二维数组以写入工作表。
当我的 Windows 区域设置设置为 DMY 时,写回的日期会切换月/日。
【问题讨论】:
标签: excel vba transpose worksheet-function
关于Dates 被WorksheetFunction.Transpose 方法转换为Strings 在本论坛中已经提到。
我对此进行了更深入的研究。
看来WorksheetFunction.Transpose 转换了很多数据类型。转置后的结果将是Boolean、Double 或String
在 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 $123,456.00 String
01-May-15 Date 01-05-2015 String
1234 String 1234 String
编辑WorksheetFunction.Transpose的另一个问题
Ubound(1D_array) mod 2^16 给出
uBound(1D_array) mod 2^16 元素将返回到转置数组。
【讨论】:
Range.Value2 而不是Range.Value。它保留了潜在价值。
您可以在内存中使用 ListBox 进行转置,而无需使用 Transpose 并且 DataTypes 保持不变:
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
【讨论】:
ListBox 方法,但它似乎有效。但是,对于 100,000 个日期的数据样本,ListBox 方法比简单循环花费的时间长 3-4 倍。 (原始数据样本也需要更长的时间)。