VBA导出Oracle数据时遇错误Nº13类型不匹配问题求助
解决VBA从Oracle导出数据时的类型不匹配错误(错误Nº13)
你遇到的错误Nº13类型不匹配,大概率是Application.Transpose处理rs.GetRows返回的数组时,遇到了Oracle返回的特殊数据类型(如日期、空值或非常规字段),或是记录集为空导致转置操作失败。下面是几种可行的解决办法:
方法1:直接使用CopyFromRecordset(最简单高效)
不需要手动处理数组转置,直接让Excel从记录集读取数据,避开转置问题:
Sub start() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim strSQL As String Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open "user ID=user;Password=password;data source=source;Provider=OraOLEDB.oracle" strSQL = "SELECT * FROM table" rs.Open strSQL, cn, adOpenForwardOnly ' 直接从记录集写入单元格,从A1开始自动填充所有数据 If Not rs.EOF Then ActiveSheet.Range("A1").CopyFromRecordset rs End If rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub
这个方法会自动匹配记录集的列数和行数,不需要指定固定的A1:K22范围,更灵活。
方法2:手动转置数组(避免Transpose的兼容性问题)
如果必须使用数组中转,手动实现转置逻辑,避开Application.Transpose的限制:
Sub start() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim mtxData As Variant Dim transposedData As Variant Dim strSQL As String Dim rowCount As Long, colCount As Long Dim i As Long, j As Long Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open "user ID=user;Password=password;data source=source;Provider=OraOLEDB.oracle" strSQL = "SELECT * FROM table" rs.Open strSQL, cn, adOpenStatic ' 改用静态游标,确保能获取准确的行/列数 If Not rs.EOF Then rowCount = rs.RecordCount colCount = rs.Fields.Count mtxData = rs.GetRows ' 初始化转置后的数组 ReDim transposedData(1 To rowCount, 1 To colCount) ' 手动转置 For i = 0 To rowCount - 1 For j = 0 To colCount - 1 transposedData(i + 1, j + 1) = mtxData(j, i) Next j Next i ' 写入指定范围 ActiveSheet.Range("A1:K22") = transposedData End If rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub
注意这里把游标类型改成了adOpenStatic,这样rs.RecordCount才能返回准确的记录数(ForwardOnly游标无法获取RecordCount)。
方法3:先处理空记录集
如果你的查询可能返回空结果,先判断记录集是否为空,避免转置空数组出错:
' 在执行转置前添加判断 If Not rs.EOF Then mtxData = Application.Transpose(rs.GetRows) ActiveSheet.Range("A1:K22") = mtxData Else MsgBox "查询结果为空" End If
内容的提问来源于stack exchange,提问作者Savio
相关产品推荐
相关产品推荐

