[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.107 Access サブフォームの明細データを検索、メインを移動

Access サブフォームの明細データを検索、メインを移動

メルマガ発行内容

<Access サブフォームの明細データを検索、メインを移動>

どうも、三流プログラマーのKen3です。 今回は、 読者よりもらった質問の続きを、処理してみたいと思います。 内容は、サブフォーム内のデータを検索して、 メインのデータを移動、そんな感じです。 いつものように、たいした解説、回答内容じゃないので、 暇つぶしに休み時間などに拾い読みしてください。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba107.lzh にdb107.mdb(Access2000版)が保存されています。

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

メールで下記の質問をもらいました。 ---- >例としまして(本当はもっとドロドロしたデータベースなんですが、 >       違う例えで書いてみました。) > >親フォームが音楽のバンド名が記載されてます。 >サブフォームには、 >そのバンドのメンバーと出身県と楽器と年齢などが記載されています。 > >そこで、親フォームには、そのバンドのメンバーの出身県が出るテキスト >ボックスがあります。 > >例えば・・・バンド名(BOOWY)−−−−−−−−−−親フォーム >      メンバー(氷室、布袋、松井、高橋)−−サブフォーム >      出身県(群馬、群馬、群馬、福島)−−−サブフォーム > >●質問1 > >で、このサブフォームに記載されている、出身県を親のフォームの >任意に作成したテキストボックスの中に「群馬、福島」とだけ表示したいのです。 > >「群馬、群馬、群馬、福島」と表示するのは、ちょっと・・・。 >群馬がだぶっているので、群馬の表示は1つとしたいのです。 > > >●質問2 > >また、沢山のバンドや歌手をこのデータベースに入力します。 >そこで、「布袋」と検索すると、親フォームの「BOOWY」が表示されるようにしたい >のです。 > >まず親フォームのバンド名には >「バンドID」と云う名のフィールド名の主キー(オートナンバー)がありまして > >それをサブフォームの中にもフィールド名で、 同じ「バンドID」という >固有のデータで繋がっているです。 > >こんな説明で分かってもらえるんでしょうか・・・。 >すごく不安です。 ----- 2つの親子テーブルが存在して、 バンドIDでつなげた、フォーム・サブフォームが存在する。 前回、サブフォームを作成して、 出身地をまとめる処理までやりました。 http://www.ken3.org/backno/backno_vba22.html#106 詳細は、↑を見てください。 今回は、サブフォーム(明細的子データ)のバンドのメンバー名を探して、 親フォーム、バンド名(台帳的親データ)を探して、移動してみたいと思います。

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

親テーブル名:T_バンド名 バンドID オートナンバー バンド名称 テキスト 備考 メモ型 子テーブル名:T_メンバー 個人ID オートナンバー バンドID 長整数型(親テーブルとリンクする) 名前 文字型 楽器 文字型 出身地 文字型 生年月日 日付型 *今回関係ないけど 備考 文字型 *今回関係ないけど なんて、テーブル構成にして、フォームを作成しました。 この親フォームに 検索用の非連結のフィールドと検索ボタンを追加します。 メンバー名検索[ ______ ] 検索        (txt検索 ) (btn検索)

/* * 3.DLookUp関数でデータを探す */

まずは、固定処理でテストする。 >●質問2 > >また、沢山のバンドや歌手をこのデータベースに入力します。 >そこで、「布袋」と検索すると、親フォームの「BOOWY」が表示されるようにしたい >のです。 子テーブル名:T_メンバー の 名前が「布袋」のデータを検索して、 バンドID 長整数型(親テーブルとリンクした) を検索したいので、 DLookUP関数を使ってみました。
Private Sub コマンド19_Click()

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

    'テスト表示
    MsgBox str検索されたID

End Sub
上記、固定の条件ですが、ID番号を検索できました。 これを元にして、フォームの値を使用してみます。
Private Sub コマンド19_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
        MsgBox "検索されたのは" & str検索されたID & "です"
    End If

End Sub
ポイントは、 ^^^^^^^^^^^^ str検索条件 = "名前 = '" & Me!txt検索 & "'" と、 名前 = 'テキストボックスの値' の条件を作成します。 あとは、検索されたIDをチェックと表示してます。

/* * 4.検索系のコマンド(命令)を探る */

さてと、IDがわかったので、そのIDに移動したいですよね。 コマンドボタンウィザードでボタンを簡単に作れますよね、 よく、次のレコードに移動、などのボタンを作っていると思います。 同様に、何かないかなぁと探ってみると、 レコードの移動のグループに次を検索とボタンが作れます。 ↑ウイザードのイメージ で、自動作成されたのが下記のモジュールです。
Private Sub コマンド20_Click()
On Error GoTo Err_コマンド20_Click

    Screen.PreviousControl.SetFocus
    DoCmd.FindNext

Exit_コマンド20_Click:
    Exit Sub

Err_コマンド20_Click:
    MsgBox Err.Description
    Resume Exit_コマンド20_Click
    
End Sub
F1を押して、コードを探ってみます。 Screen.PreviousControl 最後にフォーカスを与えられたコントロールへの参照 んっ、あまり関係ないような・・・ 気を取り直して、 DoCmd.FindNext メソッド を同様にF1(HELP)探ると 解説 このメソッドには引数はありません。 構文 DoCmd.FindNext で直接呼び出すことができます。 FindNext メソッドは、前回実行した FindRecord メソッド、または [編集] メニュー の [検索] をクリックすると表示される [検索と置換] ダイアログ ボックスで指定し た抽出条件を満たす次のレコードを検索するために使用します。FindNext メソッドを 使用すると、レコードを繰り返し検索できます。たとえば、すべてのレコードの中から 特定の得意先のレコードを連続して検索できます。 なんだよ、これもハズシかよ・・・と思ったが、よく見ると、 前回実行した FindRecord メソッド? おっ、なんかこのFindRecordって条件指定できそうな予感。 FindRecord メソッド expression.FindRecord(FindWhat, Match, MatchCase, Search, SearchAsFormatted, OnlyCurrentField, FindFirst) 使用例 次の例では、カレント フィールドに "山田" という名前が格納されているレコードの うち最初のレコードを検索します。"やまだ" や "山田山" は検索されません。 DoCmd.FindRecord "山田",, True,, True なるほどね、では、ID=2に移動する場合は、 カレントフィールドをIDにして、 DoCmd.FindRecord "2" でいいのかなぁ。テストしてみると。
Private Sub コマンド20_Click()
    
    DoCmd.GoToControl "バンドID"  'コントロールをIDへ移動
    DoCmd.FindRecord "2"    '2のデータを検索する
    
End Sub
ポイントは、 ^^^^^^^^^^^^ DoCmd.GoToControl "バンドID" で、カレントコントロールを移動 DoCmd.FindRecord "2" で バンドIDが2のデータに移動しました。

/* * 5.組み合わせて、組み込んでみた */

DLookUpで子テーブルがバンドIDを求めることに成功しました。 DoCmd.FindRecord で、レコードを移動できました。 これを組み合わせてみます。
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
処理のポイントは、 ~~~~~~~~~~~~~~~~~~ DLookUp関数で子テーブルから画面に入力された条件を指定して バンドIDを検索する。 バンドIDが存在したら、 DoCmd.GoToControl "バンドID"でカレントコントロールを移動、 カレントコントロール(バンドID)に対して、 DoCmd.FindRecord str検索されたID と、検索されたバンドIDを渡し、目的のデータを検索します。 まぁ、なんとか動作しました・・・

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

サンプルファイルは、 http://www.ken3.org/vba/lzh/vba107.lzh にdb107.mdb(Access2000版)が保存されています。 動作を見るのが一番早いかも。 今回は、 DLookUpでテーブルの検索、 DoCmd.FindRecord で検索したレコードへ移動 そんな組み合わせの処理でした。 実は、まだまだ、穴があって、 穴その1は、鈴木や田中、メンバー名、同じ人がいた時?複数データが見つかった時。 穴その2は、 DoCmd.GoToControl "バンドID" と、バンドIDにコントロールを移動させているが、 オートナンバー等の時、バンドIDは非表示にしていたりする(可視=いいえ) すると、バンドIDが見つからない(カレントコントロールに出来ない) なんてエラーが発生する。 ↑エラーのイメージ 複数レコードが該当(メンバー名で同じ名前)した場合 と 親子共通のID、バンドIDを非表示で管理していた場合、 DoCmd.GoToControl DoCmd.FindRecord で検索の手が使えない。 さて、対策を取らないとね。 メンバー名が同じって、1人が複数のグループに在籍ってあるだろうし、 よくわからない、有名なシャッフルユニットとか? あとは、データがフルネームで入っていない場合とか あっ、データがフルネームで気が付いたけど、 テーブルにはフルネームで入っているけど検索は一部でしたいなんてあるのかも。 何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

フィードバック

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

評価・感想

No.107を読んだ満足度(評価)は?
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に流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・