Excelが大好きだ!

Excel大好き経理マンがExcelの事を書き綴っていきます。


スポンサードリンク

Recordsetのデータを分割して取得する方法


前回は「CopyFromRecordsetのデータ取得数」について紹介しました。

www.excellovers.com

今回はもう1つ別の機能を紹介して、Recordsetのデータを簡単に分割して取得する方法を説明します。


19件の元データを5件ずつ別のシートに転記する事例で説明します。


コード

コード全文は下記のようになります。

Sub DataPageSplit()
    Dim myCon As ADODB.Connection
    Set myCon = New ADODB.Connection
    Dim myRS As ADODB.Recordset
    Set myRS = New ADODB.Recordset
    Dim mySQL As String
    
'--ADODB.Connection作成
    myCon.Provider = "Microsoft.ACE.OLEDB.16.0"
    myCon.Properties("Extended Properties") = _
                    "Excel 12.0;HDR=YES;IMEX=1"
    myCon.Open ThisWorkbook.FullName
    
'--ADODB.Recordset作成
    mySQL = "select * from [Data$]"
    myRS.Open mySQL, myCon, adOpenStatic

'--Recordsetデータ分割・シート転記
    myRS.PageSize = 5
    Dim myWS As Worksheet
    Dim i As Long
    Dim p As LongPtr
    
    For p = 1 To myRS.PageCount
        Worksheets.Add after:=Worksheets(Worksheets.Count)
        Set myWS = ActiveSheet
        
        For i = 1 To myRS.Fields.Count
            myWS.Cells(1, i).Value = myRS.Fields(i - 1).Name
        Next
        myWS.Range("A2").CopyFromRecordset myRS, myRS.PageSize
    Next p
    
'--クロージング
    myRS.Close: Set myRS = Nothing
    myCon.Close: Set myCon = Nothing
End Sub


Pagesizeプロパティ

SQLを実行しRecordsetオブジェクトに取得したデータに分割線を設定します。
分割線の設定には、RecordsetオブジェクトのPagesizeプロパティを使用します。

上記コード内では以下の部分が該当します。

myRS.PageSize = 5

Pagesizeプロパティに設定した数値ごとにデータに分割線が設定されます。
今回は5を設定しましたので、5件ごとに分割線が設定されることになります。

Pagesizeを設定することで、指定した単位でデータが何分割されるのかを簡単に取得できるようになります。

For p = 1 To myRS.PageCount

RecordsetオブジェクトのPageCountプロパティを使用することで指定した単位で何ページに分割されたのかを取得することが出来ます。
今回の例では「4」ページという値が取得されます。

このPageCountをFor文に設定することで繰返し処理の回数を設定しています。
元データ数を単純に指定単位で割算して算出する場合、端数の処理が必要になりますが、PageCountを使用することでそのような処理が不要になり、可読性も向上します。


データの分割取得

データの処理回数の設定ができましたので、次はデータの取得部分を設定していきます。

データの取得数に関しては前回ご紹介したCopyFromRecordsetのデータ取得数を設定することで実現可能です。

myWS.Range("A2").CopyFromRecordset myRS, myRS.PageSize

CopyFromRecordsetの第2引数を設定することで、Recordsetから指定した数のデータを取得することができます。

CopyFromRecordsetはカレントレコードから指定した数のデータを取得します。
第2引数を省略した場合はカレントレコードから後ろのデータを全て取得します。

Recordset作成時はカレントレコードは一番最初の行に設定されています。
今回は第2引数にPageSizeを指定することで1~5行目のデータ、つまり1ページ目のデータを取得するようになっています。

CopyFromRecordsetを実行後にカレントレコードは取得したデータ数分後ろに移動します。

この状態で再びCopyFromRecordsetを行うことで、6~10行目のデータ(2ページ目)のデータを取得することが出来ます。

これを最終ページまで繰り返すことで、指定した行数でデータを分割して取得することが可能になります。