oracle SQL/VBA代码中的“应用程序转置(rs.GetRows)”类型不匹配错误第13号

bjg7j2ky  于 2022-11-22  发布在  Oracle
关注(0)|答案(1)|浏览(371)

我尝试通过VBA从Oracle数据库导出数据,但在以下行中收到第13号错误“类型不匹配”:

mtxData = Application.Transpose(rs.GetRows)

下面是我的完整代码

Sub start()

Dim cn              As ADODB.Connection
Dim rs              As ADODB.Recordset
Dim mtxData         As Variant
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")
    
    rs.CursorType = adOpenForwardOnly
    strSQL = ("SELECT * FROM table")
    rs.Open strSQL, cn
    mtxData = Application.Transpose(rs.GetRows)
        
    ActiveSheet.Range("A1:K22") = mtxData

下面是我期待的结果...

abithluo

abithluo1#

如果通过GetRows接收到的数据包含任何空值,则Transpose将出现类型不匹配错误。
但是,有一种更好的方法可以将记录集中的数据转储到Excel中:只需使用Range.CopyFromRecordSet方法,优点是不需要转置,只需指定起始单元格。

Const connStr = "(Your connection String)"
Const sql = "(Your SQL)"

Dim cn              As ADODB.Connection
Dim rs              As ADODB.Recordset

Set cn = New ADODB.Connection
cn.Open connStr
Set rs = cn.Execute(sql)

With ActiveSheet
    .UsedRange.Clear
    .Range("A1").CopyFromRecordset rs
End With

如果还需要列名,请尝试以下操作:

With ActiveSheet
    .UsedRange.Clear
    Dim destRange As Range, colIndex As Long
    Set destRange = .Range("A1")
    ' Write column names
    For colIndex = 0 To rs.Fields.Count - 1
        destRange.Offset(0, colIndex) = rs(colIndex).Name
    Next colIndex
    ' Dump the data
    destRange.Offset(1, 0).CopyFromRecordset rs
End With

相关问题