[VBAで楽しく] −−> [バックナンバー一覧]

三流君VBA:Access 検索後・リストボックスで選択 サブフォームを移動

発行内容

<Access 検索後・リストボックスで選択 サブフォームを移動>

こんにちは。
年度末なのにヒマこいている、ダメダメな
AB型の変わり者 三流プログラマーのKen3です。

今回は、
Access の フォーム リストボックスで少し遊んでみたいと思います。
※と言っても、フィルターで絞って、ダブルクリックのイベントに書いただけだけど。

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

No.107 Access サブフォームの明細データを検索、メインを移動 http://www.ken3.org/vba/backno/vba107.html の問い合わせから、 >このメルマガの穴の部分、「穴その1は、鈴木やなた名、メンバー名、同じ人が >いた時、複数データが見つかった時。」の対策を教えていただけないでしょうか。 >この時、メインフォームに別途用意したリストボックスに、該当するバンド名を >全て表示し、どれかをクリックすることで、サブフォームを絞り込むなどしたい >のですが。。また、その場合、DLooUpだと該当した最初の値しか返してくれない >ので、DlookUpは使えないと思うのですが、どのように該当する名前を全て検索 >したらよいのでしょうか。是非ご教授いただきたく。。。よろしくお願いいた >します。m(__)m あらら、三流君の悪いところですね、、、穴をほったらかしにしとくなんて、 バグと虫歯は処置しないと治らないと誰かが言ってたけど、、、 ※痛くなってから処置すればいいや・・・だと、今回みたいに被害が広がるのかなぁ サンプルファイル、 http://www.ken3.org/vba/lzh/vba178.zip を解答して(.zip) 中の db178.mdb を実行しながら確認してみてください。

/* * 2.現象を確認・再現するためのデータ作り */

元のサンプルファイル、 http://www.ken3.org/vba/lzh/vba107.lzh のdb107.mdb を db178.mdbに名前を変えて、データを見てみる(現象を再現してみる) テストデータはバンドの検索だけど、音楽系はニガテなので、 ネットで検索し易い ドラマのタイトル(メイン) と 出演者(サブフォーム) にしてデータを作ります。 プロポーズ大作戦 バンドID=4 ^^^^^^^^^^^^^^^^ 山下智久  ケンゾー これが書きたかっただけ? 長澤まさみ    レイ 榮倉奈々     エリ 濱田岳      ツル 平岡祐太 ミキオ 重複データを作りたいので、 ドラゴン桜 バンドID=5 ^^^^^^^^^^ 山下智久  矢島 長澤まさみ  水野 中尾明慶 奥野 小池徹平 緒方 新垣結衣 香坂 サエコ    麻紀 クロサギ  バンドID=6 ^^^^^^^^ 山下智久 黒崎 堀北真希 氷柱 野ブタ。をプロデュース バンドID=7 ^^^^^^^^^^^^^^^^^^^^^^ 亀梨和也 修二 山下智久 彰 堀北真希 野ブタ 途中テストデータ作りに疲れた(オイオイ)なので、 出演者もっと居るだろとツッコマナイデネ。 このデータから、 山Pを検索後にメインのドラマタイトルを絞り込みたい、そんな感じですね。 現在 [山下智久] を検索すると、 下記の感じだと 確かにDLookupで一番最初に見つかったIDしか移動できませんね・・
Private Sub btn検索_Click()
    Dim str検索条件     As String
    Dim str検索されたID As String
    
    'フォームの値を元に検索条件を作成する
    str検索条件 = "名前 = '" & Me!txt検索 & "'"

    'str検索条件を条件にバンドIDをT_メンバーテーブルから検索する
    str検索されたID = "" & DLookup("バンドID", "T_メンバー", str検索条件)

    '結果のテスト表示
    If str検索されたID = "" Then '検索できなかった?
        MsgBox Me!txt検索 & "は、見つかりませんでした"
    Else
        'データを移動させる
        DoCmd.GoToControl "バンドID"  'コントロールをIDへ移動
        DoCmd.FindRecord str検索されたID    'データを検索する
    End If

End Sub

/* * 3.複数から選択したいので リストボックスを使ってみた */

複数から1つを選択したいので、リストボックスを使ってみます。 メインのテーブル T_バンド名 と サブのテーブル T_メンバー を バンドIDでつなげたクエリーを作成します。 クエリー名称:Q_メインとサブ として 名前 バンドID バンド名称 山下智久 4 プロポーズ大作戦 長澤まさみ 4 プロポーズ大作戦 榮倉奈々 4 プロポーズ大作戦 濱田岳 4 プロポーズ大作戦 平岡祐太 4 プロポーズ大作戦 山下智久 5 ドラゴン桜 長澤まさみ 5 ドラゴン桜 のクエリーを作ります。 ↑なんかバンドとメンバーだと変ですね。作品名と出演者に置き換えてね。 SQL を書き出すと、 SELECT T_メンバー.名前, T_バンド名.バンドID, T_バンド名.バンド名称 FROM T_バンド名 INNER JOIN T_メンバー ON T_バンド名.バンドID = T_メンバー.バンドID; こんな感じですが、普通にクエリーをつなげて下記のように作ってOKです。 http://ken3-info.blog.ocn.ne.jp/screen/2008/03/access_b04c.html ↑画像みたいに作成します。 次はフォームにリストボックスを1つ設置します。 名前は lstメンバー名 として、 作成したクエリー Q_メインとサブ をコントロールソースとして設置します。 リストボックス作成例↓ウィザードオンだとこんな感じかな。 http://ken3-info.blog.ocn.ne.jp/screen/2008/03/access2003_fd04.html ↑ちょっとクドイけど、  ポイントはクエリーを元に非連結で作成してアトで使う、そんな感じです。

/* * 4.検索条件が入力されたら リストボックス内を絞り込む */

全てのデータがリストボックスに表示されています。 http://ken3-info.blog.ocn.ne.jp/screen/2008/03/post_ae72.html これは、これで、初期状態だと気になりますが、置いといて、 次に、 検索条件が入力されたら リストボックス内を絞り込む ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ そんな処理を行いたいと思います。 といっても、特に変わったことはなくて、 作成したリストボックスに対して、 SQLを書き換える、そんな感じです。 元のSQLは、こんな感じなので、 SELECT Q_メインとサブ.名前, Q_メインとサブ.バンドID, Q_メインとサブ.バンド名称 FROM Q_メインとサブ ORDER BY [バンドID]; 条件が入れられた時、 SQL文を SELECT Q_メインとサブ.名前, Q_メインとサブ.バンドID, Q_メインとサブ.バンド名称 FROM Q_メインとサブ Where [名前] Like 'XXXX' ORDER BY [バンドID]; と Where [名前] Like 'XXXX' を追加して絞り込みたいと思います。 ※listボックスの.RowSource を書き換える
Private Sub btn検索_Click()
    Dim str検索条件     As String
    Dim str検索されたID As String
    Dim strSQL As String
    
    '元のSQL
    strSQL = ""  '文字列にSQL文を入れる・・・
    strSQL = strSQL & "SELECT Q_メインとサブ.名前, Q_メインとサブ.バンドID, Q_メインとサブ.バンド名称 "
    strSQL = strSQL & "FROM Q_メインとサブ ORDER BY [バンドID];"

    '条件なしを判断する
    If Trim("" & Me!txt検索) = "" Then '条件がなかったら
        'そのまま元のSQLを使う
    Else  '条件アリの時、
        str検索条件 = "Where [名前] Like '" & Me!txt検索 & "'"  'フォームの値を元に検索条件を作成する
        'ORDER BYの前にWhere文を挿入する(せこく置き換えました)
        strSQL = Replace(strSQL, "ORDER BY", str検索条件 & " ORDER BY")
    End If

    'listボックスの.RowSource を書き換える
    Me!lstメンバー名.RowSource = strSQL
    
End Sub
んっ、チョット待ってよ? でっかい疑問だけど、元のSQLってどこ見ればいいの??? あっ、スイマセン、自分だけわかってて、 リストボックスを選択してプロパティを表示すると、 値集合ソースの部分に書いてあります。↓ http://ken3-info.blog.ocn.ne.jp/screen/2008/03/access_rowsourc_dc6c.html ↑ここからコピーしてください。 で、ついでに選択時に F1キー ヘルプを押すと 値集合ソース = .RowSource がわかります。

/* * 5.リストボックスがダブルクリック 選択されたら レコード移動 */

リストボックスで複数表示ができたので、 今度は、リストボックスを選択(ダブルクリック)されたら、 メインのレコードを移動させたいと思います。 データを移動させる のは、 DoCmd.GoToControl "バンドID" 'コントロールをIDへ移動 DoCmd.FindRecord str検索されたID 'データを検索する で行っていた処理を、 単純にリストボックスのダブルクリックイベントで、 実行する、そんな感じに変更してみます。 リストボックスを選択 イベントのタブを選択、 ダブルクリックを選択 右端の...をクリックしコードビルダを選択して、 http://ken3-info.blog.ocn.ne.jp/screen/2008/03/dblclick_6481.html ↑選択イメージ 下記のコードを入力します。
Private Sub lstメンバー名_DblClick(Cancel As Integer)

        DoCmd.GoToControl "バンドID"  'コントロールをIDへ移動
        DoCmd.FindRecord Me![lstメンバー名].Value  'データを検索する
        '↑リストボックスの値 = 連結されたIDなので、こんな処理ができます。

End Sub
ダブルクリックされた(データを選択した)ら、 レコード移動の処理を走らせた、そんな感じです。

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

今回は、複数のデータから選択したかったので、 Accessのリストボックス を 作り、 リストボックスの内容を変化させるために .RowSource を書き換えたり、 ダブルクリックで選択のイベントを書いてみました。 サンプルファイル、 http://www.ken3.org/vba/lzh/vba178.zip のdb178.mdbを実行しながら確認してみてください。 プログラム作りは ^^^^^^^^^^^^^^^^ う〜ん・・・ まぁ、人それぞれ、十人十色、百社百色だけどね。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 今回も逃げるように失礼します。 おい、待てよ。 えっ、何か? [何か]じゃねぇだろ、何かじゃ・・・ リストボックスをかまして、複数に対応したのは、 わかりにくかったけど、よしとして、 逆に1件しかデータにヒットしない時も ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ リストボックスを選択しないと データが移動しないぞ、普通該当データが1件なら自動的に移動するのでは? えっ、チョットまってね。 [榮倉奈々] を検索すると、該当が[プロポーズ大作戦]1つなのに、 リストボックスに表示されただけで、移動しないや。 不親切だねとても・・・ 該当データが1件の時は自動的に移動する・・・ そんな新たな問題点・改善点を残しつつ、次回ですね。 来週3/31から始まる NHK 連続テレビ小説 瞳 http://www3.nhk.or.jp/asadora/hitomi/ までには、直しときたいなぁ(オイオイ、違うだろ趣旨が・・・) 奥歯に物がはさまったような感じですが、きょうはこの辺で失礼します。 AB型の変わり者、三流プログラマーの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系バックナンバー目次へ移動]