You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:10:32