chr*_*isc 3 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
Run Code Online (Sandbox Code Playgroud)
我遇到了这个问题,原因是 NULL 存储在数组中。一个快速解决方案是在转置之前替换数组中的 Null 值。
For i = 0 To 17
If IsNull(MetaAy(i, 0)) Then MetaAy(i, 0) = ""
Next i
Run Code Online (Sandbox Code Playgroud)
如果最后一个字段包含 NULL,请小心使用 UBound。UBound() 显示最后输入的非空值长度处的数组。
小智 5
我遇到了同样的问题,我打赌你收到类型不匹配的原因和我做的一样.其中一个单元格包含一个长度大于255个字符的字符串.我无法解释为什么Transpose无法处理变量/字符串> 255,但事实并非如此.看起来像一个Excel错误.这就是编码你自己的转置功能的原因.
我还发现问题出在数组元素太长时。我喜欢@一位愤怒的研究人员的回答,想要一个我可以使用的数组转置函数。我无法发表评论,但在修复了一些循环后,我得到了这个:
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
Run Code Online (Sandbox Code Playgroud)
one*_*her -1
我得到同样的错误(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
Run Code Online (Sandbox Code Playgroud)
编辑:Simoco 是对的,删除“Set”关键字完全解决了问题。
第二次编辑:以下内容对我有用:
Destination.Resize(UBound(varRecords, 2) + 1, UBound(varRecords, 1) + 1) = Application.Transpose(varRecords)
Run Code Online (Sandbox Code Playgroud)
执行第一行代码时会收到什么样的错误?