VBA中用Resize+Transpose粘贴二维数组遇类型不匹配错误求助
解决VBA数组转置粘贴时的类型不匹配错误(错误13)
你遇到的这个问题很典型——明明数组和目标区域的尺寸完全匹配,但Application.Transpose就是抛出类型不匹配的错误。我来帮你拆解可能的原因和对应的解决方案:
可能的原因1:Application.Transpose的隐性限制
Excel内置的Transpose函数虽然好用,但存在一些容易被忽略的隐性限制:
- 32位版本的Excel对转置数组的元素总数、数据类型组合有隐藏上限,哪怕你的数组元素只有5*439=2195个,若包含特殊数据类型(比如混合了字符串、空值和数值),也可能触发这个限制;
- 当数组里存在VBA特定的对象、错误值(比如
Error 2007这类)时,Transpose无法正确转换这些元素,直接导致类型不匹配。
可能的原因2:数组维度的隐性转换问题
虽然你的Resize参数逻辑上完全正确(Resize(行数, 列数)对应转置后的数组维度),但Application.Transpose有时会自动调整数组的上下界(比如把1-based数组转成0-based),导致实际传递给单元格区域的数组维度和预期不符,进而触发错误。
最优解决方案:自定义转置函数替代内置Transpose
最可靠的办法是自己写一个VBA转置函数,完全控制数组的转换过程,避开内置函数的bug:
Function CustomTranspose(arr As Variant) As Variant Dim rowCount As Long, colCount As Long Dim i As Long, j As Long Dim transposedArr As Variant ' 先确认输入是二维数组 If Not IsArray(arr) Or UBound(arr, 0) <> 2 Then CustomTranspose = arr Exit Function End If rowCount = UBound(arr, 1) colCount = UBound(arr, 2) ' 初始化转置后的数组(行变列,列变行) ReDim transposedArr(1 To colCount, 1 To rowCount) ' 遍历原数组填充转置数组 For i = 1 To colCount For j = 1 To rowCount transposedArr(i, j) = arr(j, i) Next j Next i CustomTranspose = transposedArr End Function
然后把你的代码改成调用这个自定义函数:
ReDim conceptArray(1 To 5, NumberOfConcepts + 1) Dim firstcellofTbl As Range Set firstcellofTbl = qbaTbl.ListColumns("name").Range.Item(1).Offset(1, 0) ' 用自定义转置替代Application.Transpose firstcellofTbl.Resize(UBound(conceptArray, 2), UBound(conceptArray, 1)) = CustomTranspose(conceptArray)
额外排查点
如果自定义函数还是报错,你可以检查这几点:
- 确认
conceptArray里的所有元素都是可以写入单元格的类型(比如字符串、数字、日期,避免对象或VBA错误值); - 检查目标区域
firstcellofTbl.Resize(...)是否处于受保护的工作表,或者包含合并单元格; - 打印数组的实际维度和元素,确认没有超出预期的空值或错误值:
Debug.Print "原数组维度:行=" & UBound(conceptArray,1) & ",列=" & UBound(conceptArray,2) Debug.Print "转置后数组维度:行=" & UBound(CustomTranspose(conceptArray),1) & ",列=" & UBound(CustomTranspose(conceptArray),2)
内容的提问来源于stack exchange,提问作者JFerro
相关产品推荐
相关产品推荐

