我在VBA中使用WorksheetFunction.Transpose将混合日期/字符串的一维数组转换为用于写入工作表的2D数组。
当我的windows区域设置设置为DMY时,被写回的日期将有几个月/一天的切换。
发布于 2020-06-25 11:11:14
在这个论坛中,已经提到了关于通过Dates方法将Strings转换为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 Subdebug.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元素将返回给转置数组。因此,如果一维数组的平方值为65537,则
中返回一个错误消息
发布于 2020-06-25 15:03:13
您可以在内存中使用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 Subhttps://stackoverflow.com/questions/62573975
复制相似问题