我一直试图转置一个数组,将ADODB.recordset中的记录粘贴到excel行中。 (记录存储在2D Variant数组中)。但是,每当我尝试类似下面代码的第一行时,我会得到一个13:类型不匹配的错误代码。因此,我试图深入了解错误的确切位置,并构建了一个简单的整数2d数组。转置功能似乎无法在不丢弃13错误代码的情况下进行此转置。在线研究似乎表明,当被转置的元素数超过64k时会引起这种错误,但这不能低于它。有什么想法吗?
varRecords = rs2.GetRows(3) ' rs2 is a ADOBD.Recordset
intNumReturned = UBound(varRecords, 2) + 1
intNumColumns = UBound(varRecords, 1) + 1
For intRow = 0 To intNumReturned - 1
For intColumn = 0 To intNumColumns - 1
Debug.Print varRecords(intColumn, intRow)
Next intColumn
Next intRow
Dim Destination As Range
Set Destination = Range("k1")
Dim i, j As Integer
'Destination.Resize(UBound(varRecords, 2) + 1, UBound(varRecords, 1) + 1).Value = Application.Transpose(varRecords) - COMMENTED OUT BECAUSE IT ERRORS TYPE 13 TYPE MISMATCH
Dim myarr(3, 4) As Integer
myarr(0, 1) = 4
myarr(2, 4) = 6
Dim myvar As Variant
Set myvar = Application.Transpose(myarr) ' - ERROR THROWN HERE
答案 0 :(得分:5)
我遇到了同样的问题,我打赌你收到类型不匹配的原因和我做的一样。其中一个单元格包含一个长度大于255个字符的字符串。我无法解释为什么Transpose无法处理变体/字符串> 255,但它没有。看起来像一个Excel错误。这就是编码自己的转置功能的原因。
答案 1 :(得分:3)
我有这个问题,原因是来自NULL存储在数组中。快速解决方法是在转置之前替换数组中的Null值。
For i = 0 To 17
If IsNull(MetaAy(i, 0)) Then MetaAy(i, 0) = ""
Next i
如果最后一个字段包含NULL,请小心使用UBound。 UBound()以最后输入的非空值的长度显示数组。
答案 2 :(得分:1)
我还发现问题出在数组元素太长时。我喜欢@one愤怒的研究人员的回答,想要一个我可以使用的数组转置函数。我不能发表评论,但是在修复了一些循环之后,我得到了:
Function transposeArray(myarr As Variant) As Variant
Dim myvar As Variant
ReDim myvar(LBound(myarr, 2) To UBound(myarr, 2), LBound(myarr, 1) To UBound(myarr, 1))
For i = LBound(myarr, 2) To UBound(myarr, 2)
For j = LBound(myarr, 1) To UBound(myarr, 1)
myvar(i, j) = myarr(j, i)
Next
Next
transposeArray = myvar
End Function
答案 3 :(得分:0)
我得到了同样的错误(13:类型不匹配)。一个简单的解决方法是自己转置数组:
Sub arrTest()
Dim myarr(3, 4) As Integer
myarr(0, 1) = 4
myarr(2, 4) = 6
Dim myvar As Variant
ReDim myvar(1 To UBound(myarr, 2), 1 To UBound(myarr, 1))
For i = 1 To UBound(myvar, 2)
For j = 1 To UBound(myarr, 1)
myvar(i, j) = myarr(j, i)
Next
Next
End Sub
编辑:Simoco是对的,删除“Set”关键字可以完全解决问题。
第二次编辑:以下内容适用于我:
Destination.Resize(UBound(varRecords, 2) + 1, UBound(varRecords, 1) + 1) = Application.Transpose(varRecords)
执行第一行代码时会收到什么样的错误?