いつも勉強させていただいているinfomentさんのblogで以下のような記事を公開されていました。
ADODBにまさに上記のような機能があったはずと思いだして自分なりに作ってみた。
早速コード
Sub ページ分割() '参照設定でMicrosoft ActiveX Data Objects XXX(最新版) Libraryにチェックを入れておく Dim myCon As ADODB.Connection Dim myRS As ADODB.Recordset Set myCon = New ADODB.Connection Set myRS = New ADODB.Recordset 'Excel2007以降の設定。2003まではコメントアウト部分。 myCon.Provider = "Microsoft.ACE.OLEDB.12.0" myCon.Properties("Extended Properties") = "Excel 12.0;IMEX=1" ' myCon.Provider = "Microsoft.JET.OLEDB.4.0" ' myCon.Properties("Extended Properties") = "Excel 8.0;IMEX=1" myCon.Open ThisWorkbook.FullName Dim mySQL As String mySQL = "select * from [元データ$]" myRS.Open mySQL, myCon, adOpenStatic '転記する単位を設定。設定した件数を転記したら次のシートを作成する。 myRS.PageSize = 10 '見出し行の取得 Dim myHeader As Variant Dim n As Long ReDim myHeader(myRS.Fields.Count - 1) For n = 0 To myRS.Fields.Count - 1 myHeader(n) = myRS.Fields(n).Name Next Dim i As Long Dim myVar As Variant For i = 1 To myRS.PageCount myRS.AbsolutePage = i Worksheets.Add after:=Worksheets(Worksheets.Count) myVar = Application.WorksheetFunction.Transpose(myRS.GetRows(myRS.PageSize)) Range("A1").Resize(, UBound(myHeader, 1) + 1).Value = myHeader Range("A2").Resize(UBound(myVar), UBound(myVar, 2)).Value = myVar Next myRS.Close Set myRS = Nothing myCon.Close Set myCon = Nothing End Sub
Recordset.Pagesize
例によってなんちゃって個人情報で作成したデータでテストしてみます。
今回のシートに指定した件数ずつ転記するにはADODBのRecordset.Pagesizeを利用する。
Pagesizeに指定した数字の箇所毎にページ番号をつけるようなイメージ。
Recorset.AblolutePageは指定したページの1行目に移動します。
Pagesizeを10に指定するのであれば
1ページ→1行目
2ページ→11行目
GetRowsメソッドでRecordsetオブジェクトの内容を配列として返す。
Recorset.GetRows([Rows],[Start],[Fields])
引数 | 内容 |
---|---|
Rows | 取得するレコードの数を示す値。 既定値はadGetRowsRestします。未指定の場合は全レコードを返す。 |
Start | 読み込みを開始するレコードの位置を指定。指定しない場合は現在のレコード位置から。 |
Fields | 指定したフィールドのデータのみ返します。 |
今回の場合はGetRows(Rows =10,Start=それぞれのページの最初の行)という設定になっている。
つまり1ページめは1行目から10行のデータ。
2ページ目は11行目から10行のデータをそれぞれ配列に返すようになっている。
しかしこのGetRowsメソッドはちょっとクセがあって、データの1行目が1列目に、2行目がが2列目という風に順に記載されている。
そのためTranspose関数を利用して行列変換を行っている。
GetRowsではタイトル行を取得できないので別で取得していたタイトル行とデータ部分をセルに転記して次のページ番号の処理を開始する。
最終ページの指定行数に満たない場合もよろしく処理を行ってくれます。
59件のレコードでテストしました
まとめ
正直Pagesizeを使用するのは初めてでした。
過去に本を読んでそんな機能あったよなぁと思い読み返しながら作成してみました。
うろ覚えでも知識が頭に入ってるのは大事だなぁと思った次第です。
仕事に役立つExcel&Accessデータベース連携テクニック
- 作者: 古川順平
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2004/02
- メディア: 単行本
- クリック: 1回
- この商品を含むブログ (1件) を見る