Vba CopyFromRecordset拷贝&;即使Excel中存在多条记录,也只粘贴前一行

Vba CopyFromRecordset拷贝&;即使Excel中存在多条记录,也只粘贴前一行,vba,excel,adodb,Vba,Excel,Adodb,我有一张Excel表格,里面有类似表格的数据 strSQL = "SELECT S.FIELD_NAME1,S.FIELD_NAME2,S.FIELD_NAME3 from [SourceData$A1:IV6] S" Dim cn as ADODB.Connection Dim rs as ADODB.Recordset cn.Open strCon Set rs = CmdSqlData.Execute() Worksheets("SourceData").Cells.ClearConte

我有一张Excel表格,里面有类似表格的数据

strSQL = "SELECT S.FIELD_NAME1,S.FIELD_NAME2,S.FIELD_NAME3 from [SourceData$A1:IV6] S"

Dim cn as ADODB.Connection
Dim rs as ADODB.Recordset
cn.Open strCon
Set rs = CmdSqlData.Execute()
Worksheets("SourceData").Cells.ClearContent
Worksheets("AnswerData").Cells(2, 1).CopyFromRecordset rs
结果:
只有第一行和其他记录被忽略

我试过下面的问题

strSQL = "SELECT COUNT(*) from [SourceData$A1:IV6] S"
结果是
5


请告诉我为什么其他记录没有复制到记录集中?

这里有一个成功粘贴记录集的子程序

请注意,它粘贴到的范围通过intMaxRow和intMaxCol变量与记录集大小相同:

Sub sCopyFromRS()
'Send records to the first
'sheet in a new workbook
'
Dim rs As Recordset
Dim intMaxCol As Integer
Dim intMaxRow As Integer
Dim objXL As Excel.Application
Dim objWkb As Workbook
Dim objSht As Worksheet
  Set rs = CurrentDb.OpenRecordset("Customers", _
                    dbOpenSnapshot)
  intMaxCol = rs.Fields.Count
  If rs.RecordCount > 0 Then
    rs.MoveLast:    rs.MoveFirst
    intMaxRow = rs.RecordCount
    Set objXL = New Excel.Application
    With objXL
      .Visible = True
      Set objWkb = .Workbooks.Add
      Set objSht = objWkb.Worksheets(1)
      With objSht
        .Range(.Cells(1, 1), .Cells(intMaxRow, _
            intMaxCol)).CopyFromRecordset rs
      End With
    End With
  End If
End Sub
以该示例为模型,我会尝试对您的代码执行以下操作:

strSQL = "SELECT S.FIELD_NAME1,S.FIELD_NAME2,S.FIELD_NAME3 from [SourceData$A1:IV6] S"

Dim cn as ADODB.Connection
Dim rs as ADODB.Recordset
Dim intMaxCol as Integer
Dim intMaxRow as Integer

cn.Open strCon
Set rs = CmdSqlData.Execute()
intMaxCol = rs.Fields.Count
'- MoveLast/First to get an accurate RecordCount
rs.MoveLast 
rs.MoveFirst

If rs.RecordCount > 0 then
    '-thought you could put the MoveLast/First here but maybe not.
    intMaxRow = rs.RecordCount
    With Worksheets("AnswerData")
        .Range(.Cells(2,1),.Cells(intMaxRow+1,intMaxColumn)).CopyFromRecordset rs
    End With
End If

此答案取决于Excel中可用的ODBC数据库驱动程序

由于我的公司环境,我不得不使用非常旧的Oracle ODBC驱动程序。在我的例子中,
Recordset.RecordCount
总是
-1
。默认情况下,不支持
Recordset.MoveLast
Recordset.MoveFirst
。像原来的问题一样,调用
Excel.Range.CopyFromRecordset(Recordset)
也只写一行

您可能需要以不同的方式配置
ADODB.Recordset
。请尝试以下代码:

Dim dbConn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim rng As Excel.Range
Dim rowCount As Long

' TODO: Init your dbConn here.
' TODO: Init your rng here.

Set rs = New ADODB.Recordset
' http://www.w3schools.com/ado/prop_rs_cursortype.asp
rs.CursorType = ADODB.CursorTypeEnum.adOpenKeyset
rs.Open sql, dbConn
rowCount = rng.CopyFromRecordset(rs)
对于我的驱动程序,这解决了这个问题。但是,您的里程数可能会有所不同


我遇到了同样的问题

仅替换

set rst = conn.execute("SELECT * FROM SOMETABLE;") 

然后问题就解决了


但是,我不知道为什么。

SQL只返回一个数字。您的意思可能是从中选择*。rs.RecordCount会给出记录集中存在的记录总数吗?在我的例子中,我得到的结果是-1,即使我在一个记录集中有5条记录。Recordcount在movelast和movefirst之后返回正确的记录数这是它解析和计数记录所必需的。我编辑了代码,将rs.MoveLast rs.MoveFirst放在if语句之前,因为我记不清是否可以将其放在if语句中(我以为可以))谢谢Logan-不幸的是,在我试图找出哪里出了问题之前,我没有阅读注释-它总是跳过IF语句,因为它返回-1-显然这意味着有记录,所以IF语句可能应该是IF rs.RecordCount=-1(在第一个示例中仍然错误)。谢谢你给我的其他礼物,否则会很有用的
call rst.open("SELECT * FROM SOMETABLE;", conn)