vba转置类型不匹配错误

时间:2014-04-26 18:59:02

标签: arrays excel vba transpose

我一直试图转置一个数组,将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

4 个答案:

答案 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)

执行第一行代码时会收到什么样的错误?