4

データのようなテーブルを含む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られます。

他のレコードがレコードセットにコピーされない理由を教えてください。

4

3 に答える 3

3

これは、レコードセットを正常に貼り付けるサブルーチンです。

貼り付ける範囲は、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
于 2012-07-11T12:05:20.190 に答える
2

この回答は、Excelで使用可能なODBCデータベースドライバーによって異なります。

corp envが原因で、非常に古いOracleODBCドライバーを使用せざるを得なくなりました。私の場合、Recordset.RecordCountは常に-1です。デフォルトでRecordset.MoveLastRecordset.MoveFirst、サポートされていません。元の質問と同様に、呼び出しExcel.Range.CopyFromRecordset(Recordset)も1行だけを書き込みます。

別の方法で構成する必要がある場合があります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)

私のドライバーの場合、これで問題が解決します。ただし、マイレージは異なる場合があります。

ADOカーソルタイプの詳細については、こちらをご覧ください

于 2013-03-28T03:54:25.287 に答える
1

私は同じ問題に直面します。

交換のみ

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

call rst.open("SELECT * FROM SOMETABLE;", conn)

その後、問題は解決されます

でも、理由はわかりません。

于 2018-11-14T10:34:11.830 に答える