[三流君] −−> [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でした。

フィードバック

VBA系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.104を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

ページフッター(リンクや広告など)


[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます


広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列

情報を探す

情報を探すならGoogleかな?

↓Web全体、サポート情報(support.microsoft.com)や三流君VBA(ken3.org)から検索する
Google
Web www.ken3.org
www.microsoft.com support.microsoft.com

あとは、項目別にMSでお勉強かな?
◆ マイクロソフト サイトの歩き方
◇ How-To インデックス
◇ FAQ インデックス
◇ スキルレベル別おすすめコンテンツ
◇ テクノロジ マップ
◇ テーマ別技術資料一覧

書籍の購入

Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??

コンピュータ書籍の発送がハヤイ専門店

コンピュータの本・専門店
種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり

amazon.co.jpでキーワード別チェック

下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・