[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.104 Access DAO Recordset = Me.RecordsetClone

Access DAO Recordset = Me.RecordsetClone

メルマガ発行内容

<Access DAO Recordset = Me.RecordsetClone>

どうも、三流プログラマーのKen3です。 今回は、 Access97で、フォームのレコードセット複製を使って、遊んでみたいと思います。 たいした解説、回答内容じゃないのですが。

/* * 1.今回のキッカケ */

VBA系の掲示板 http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi で、下記の質問をもらいました。 ---- >>Access97だと、レコードセットを直接、 >>フォームの元に出来ないので(出来ないと思います) > >やはり、駄目でしたか。 >どうしてもAccess97の環境で動かす必要があるのですが、対応していないので >あれば仕方がないです。 > >>何らかの事情があって、 >>Me.RecordSourceにセットしていないとは思いますが。 > >このような仕組みを考えたのは、元になるクエリーが重くて、せっかく開いたク >エリーの結果をExcelの作成にそのまま使いたかったからです。 >今動かしているのは、フォーム上にExcelのボタンがあり、そこからExcelに吐き >出すために再度同じクエリーを動かしています。 >Accessのフォーム用とExcelのシート用と、同じ結果を出すために一つのクエリ >ーを二回動かしているイメージです。 >そこでレコードセットにすることで、一回のクエリーの結果で二つのフォーム >とシートに出力できないものかと考えました。 >もっとスマートな方法がありそうなのですが、知識がなくて先に進めません。 >もし何らかのヒントでもあればアドバイスしていただければ助かります ---- やりたいことは、重たいクエリーを2回走らせたくないかぁ。

/* * 2.調べごと、下準備 */

フォームに表示しているデータを取れないかなぁ・・・と探すと。 .RecordsetCloneなんてのが見つかる。 ヘルプを見ると、 >フォームの "RecordSource/レコードソース" プロパティに設定されている >テーブルまたはクエリの Recordset オブジェクトを参照します。 となっています。 下記、Access97でテストした結果。
Private Sub コマンド8_Click()

    Dim rs As Recordset   'フォームのレコードセットのクローンをもらう

    Set rs = Me.RecordsetClone  'レコードセットのクローンを代入

    MsgBox rs.RecordCount

End Sub
Dim rs As Recordsetとレコードセットの変数を定義して、 Set rs = Me.RecordsetClone で複製を代入。 あとは、普通のレコードセット同様に使用可能です。 MsgBox rs.RecordCount とテストでは、レコード数を表示しましたたが。 ※ある意味、フォームデータのソートやフィルターとかも効くし  便利です。 これができるなら、Me.Recordsetってあってもいいと思うのに、 Access97では、出てこなかった。 ※いまファミレスやフォースとフードで流行っている  裏メニューって感じで裏プロパティがあるのかなぁ・・う〜ん。  クローンで複製作れるなら、そのままセットできてもと思うが、 Access97は、Me.RecordSourceで切り替えみたいです。 Access2000でDAO関係を使用するには、DAOの参照設定を行い。 Dim rs As DAO.Recordset とDAO.のレコードセットですよと変数宣言で書く。
Private Sub コマンド40_Click()
    'Access2000の場合、DAOの参照設定を入れて使用する
    Dim rs As DAO.Recordset   'フォームのレコードセットのクローンをもらう

    Set rs = Me.RecordsetClone  'レコードセットのクローンを代入
    MsgBox rs.RecordCount

End Sub

/* * 3.関数を組み合わせる(組み込む) */

やりたいことは、重たいクエリーを2回使いたくない、 なので、フォームのレコードソースを重たいクエリーにして表示する。 Excel出力のボタンが押されたら、 フォームで操作中のレコードセットの複製を作成して、 Excelのデータを作成する。 って、感じの流れで作業してみたいと思います。
Private Sub コマンド9_Click()
On Error GoTo Err_コマンド9_Click

    Dim oApp As Object
    Dim y As Integer

    Set oApp = CreateObject("Excel.Application")
    oApp.Visible = True
    'Only XL 97 supports UserControl Property
    oApp.UserControl = True

    'ブックを作成
    oApp.Workbooks.Add  '新規ワークブックの追加

    'フォームのレコードセットを代入する
    Dim rs As Recordset   'フォームのレコードセットのクローンをもらう
    Set rs = Me.RecordsetClone  'レコードセットのクローンを代入

    rs.MoveFirst  '先頭行へ移動
    y = 1
    While rs.EOF = False
        'フィールドを転記
        oApp.Cells(y, "A") = rs![ID]
        oApp.Cells(y, "B") = rs![F_TITLE]
        oApp.Cells(y, "C") = rs![F_MEMO]
        '次のレコードへ移動
        rs.MoveNext  'レコードセット移動
        y = y + 1    'セット位置を移動
    Wend

    'クローンを破棄する
    Set rs = Nothing


Exit_コマンド9_Click:
    Exit Sub

Err_コマンド9_Click:
    MsgBox Err.Description
    Resume Exit_コマンド9_Click
    
End Sub
ポイントは、 ^^^^^^^^^^^^ Dim rs As Recordset 'フォームのレコードセットのクローンをもらう Set rs = Me.RecordsetClone 'レコードセットのクローンを代入 で、 フォーム.レコードセット複製を受け取り、 Set oApp = CreateObject("Excel.Application") で作成したExcelに対して、 下記のように、レコードの先頭から終わりまで、データを転記してます。 rs.MoveFirst '先頭行へ移動 y = 1 While rs.EOF = False 'フィールドを転記 oApp.Cells(y, "A") = rs![ID] oApp.Cells(y, "B") = rs![F_TITLE] oApp.Cells(y, "C") = rs![F_MEMO] '次のレコードへ移動 rs.MoveNext 'レコードセット移動 y = y + 1 'セット位置を移動 Wend この処理で、重たいクエリーが2回まわらなければいいけど。 余談ですが、 Set rs = Me.RecordsetClone で面白いなぁと感じたのは、 フォームのメニューでフィルターとか並べ替えとか、 ユーザーさんが操作する、 その状態でレコードセットの複製が作成されるみたいなので フォームの順番どおりにExcelにデータを転記することが出来ました。 別の処理で、フォームからExcelデータ作成時、使えるかなぁとフト思いました。

/* * 4.終わりの挨拶 */

今回は、 レコードセットのクローンを使ってみました。 フォームにデータを表示してるんだから、 同じクエリーでExcelを作らないで、 レコードセットの複製を作成して、自分で代入してみました。 何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]