[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.089 Access 検索フォームで選択した番号を使用する その1

Access 検索フォームで選択した番号を使用する その1

メルマガ発行内容

<Access 検索フォームで選択した番号を使用する その1>

どうも、三流プログラマーのKen3です。 今回は、 フォーム間のデータのやり取りで、 固定の処理で通用する簡単なやり方を書きたいと思います。 ~~~~ 固定の処理とか言ってると、逆の汎用性のある方法から聞きたいよね。 まぁ、まぁ、あせらないでよ。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba089.lzh にdb089.mdb(Access2000版)が保存されています。

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

掲示板に下記の質問をもらいました。 --------------- In message "[BBS :142] Accessでのパラメータ引渡し方法", Yoshi さん wrote... >投稿時間:2003/06/18(Wed) 17:25 > >おなまえ:Yoshi >タイトル:Accessでのパラメータ引渡し方法 >URL : >コメント: > >こんにちは。はじめて書き込みます。 >現在「顧客画面」と「顧客番号検索画面」というものがあります。 >「顧客画面」は、KEYである顧客番号とその他情報を登録、修正、削 >除する画面です。 >「顧客番号検索画面」は、「顧客画面」の顧客番号の検索機能です >。 >つまり、「顧客画面」で登録されている顧客情報を変更する場合 >現在データベースに登録されている顧客番号を一覧(顧客番号検索画 >面)表示させ選択された顧客番号を「顧客画面」に戻すといった方法 >を教えてください。 >すいません、わかりずらいと思うので簡単な図を書きます。 > >1顧客画面 ← 顧客情報の一部の修正を行いたいためこの画面を >開く > >2顧客番号横の検索ボタンを押下 ← 顧客番号がすぐにわからな >いため検索画面を開く > >3顧客番号検索画面が開く ← リストボックスで作成した一覧を >表示 > >4リストボックスの対象行を選択 > >5顧客画面 ← 選択された顧客番号を表示させる --------------- そんな質問に対して、 今回は、単純にデータのセット、レコード移動でかわしてみたいと思います。

/* * 2.簡単に勝手な仕様を起す */

元になるテーブルは、顧客番号と適当に作成する。 テーブル名:顧客 ^^^^^^^^^^^^^^^ 顧客番号 point 住所 氏名 記号 1 120 名古屋 ドラキチ あ 2 15 北海道 どさんこ い 3 20 東京 ヤクルト う 4 5 神奈川 横浜 え 5 20 福岡 ダイエー お 顧客画面 ^^^^^^^^ この画面は、登録、修正、削除の機能を持っている。 画面フォーマットは凝らないで、単票形式のオートフォームで作成。 顧客番号 [ ______ ] の横(ここ)に[検索]のボタンがある。 処理機能、流れはいろいろあるけど、 [検索]ボタンがクリックされたら、 "顧客番号検索画面"を開く。 顧客番号検索画面 ^^^^^^^^^^^^^^^^ 画面は、リストボックス、選択ボタン、キャンセルボタンを持っている。 画面が開かれたら、(開かれたタイミングで) リストボックスで、 顧客番号 氏名 記号 1 ドラキチ あ 2 どさんこ い 3 ヤクルト う 4 横浜 え 5 ダイエー お を表示する。(顧客テーブルから、顧客番号、氏名、記号をリスト表示) 対象行を選択後、 [選択]のボタンが押されたら、 顧客画面!(の)顧客番号にデータをセットする。 顧客画面、該当レコードへデータを移動する。 検索フォームを閉じる。 [キャンセル]のボタンが押されたら、 行が選択されていても、何もしないで検索フォームを閉じる。

/* * 3.顧客番号検索画面の作成(まだ処理無し) */

顧客番号の選択画面を作成します。 lst顧客番号(リストボックス) 顧客番号 氏名 記号 1 ドラキチ あ 2 どさんこ い 3 ヤクルト う 4 横浜 え 5 ダイエー お を表示するリストボックス。 ↑リストボックスウィザードで簡単に作成 [btn選択] [btnキャンセル]とボタンを2つ作成する。 ↑ボタンウィザードで閉じるを簡単に作成 まだ何も本格的なコードは書いていないけど、 リストボックスにデータが表示されていると、 それらしく見えるから不思議。 ↑ボタンウィザードで閉じるを簡単に作成 まぁ、このへんは、べつに気にしないで。

/* * 4.顧客画面に検索ボタンの作成(顧客番号検索画面を開く) */

ウイザードで、簡単に単票フォームの画面を作ってから、 顧客番号 [ ______ ] の横に[検索]ボタンを作成する。 ↑ボタンウィザードでフォームを開くを簡単に作成 btn_Clickのイベントが完成する。
Private Sub btn検索_Click()
On Error GoTo Err_btn検索_Click

    Dim stDocName As String
    Dim stLinkCriteria As String

    stDocName = ChrW(-26521) & ChrW(23458) & ChrW(30058) & ChrW(21495) 
& ChrW(26908) & ChrW(32034) & ChrW(30011) & ChrW(-26782)
    DoCmd.OpenForm stDocName, , , stLinkCriteria

Exit_btn検索_Click:
    Exit Sub

Err_btn検索_Click:
    MsgBox Err.Description
    Resume Exit_btn検索_Click
    
End Sub
余談:オートで作成されたソースを見て ~~~~~ stDocName = ChrW(-26521) & ChrW(23458) & ChrW(30058) & ChrW(21495) & ChrW(26908) & ChrW(32034) & ChrW(30011) & ChrW(-26782) えっ、なにこれ?漢字のフォーム名ってダメなの? なめやがって、 stDocName = "顧客番号検索画面" DoCmd.OpenForm stDocName, , , stLinkCriteria と直してテスト。 あれ・・動くよ。まぁいっか。 びっくりさせやがって、Access2000から漢字のフォーム名ムリかと思ったよ。 (ホントのところは、ダメかもしれないけど、潔癖症じゃないので、  私はそのまま書いてみました)

/* * 5.選択後、顧客画面のレコードを移動させる */

さてと、無事に2つの画面が完成、開いたところで、 顧客番号検索画面 ~~~~~~~~~~~~~~~~ のbtn選択にコードを追加します。 フォームを閉じるコードが既に書かれていると思います。
Private Sub btn選択_Click()
On Error GoTo Err_btn顧客_Click


    DoCmd.Close

Exit_btn選択_Click:
    Exit Sub

Err_btn選択_Click:
    MsgBox Err.Description
    Resume Exit_btn選択_Click

End Sub
まぁ、エラー処理今回は、消しちゃいます。(オイオイ平気なの?)
Private Sub btn選択_Click()
    DoCmd.Close  '閉じる
End Sub
だけでいいんで。 これに、 顧客画面、該当レコードへデータを移動する。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 機能を追加してみます。
Private Sub btn選択_Click()

    Dim LNG顧客番号 As Long

    '番号選択のチェック
    If IsNull(Me![lst顧客番号]) Then '何も選択されていないか?チェック
        MsgBox "顧客番号を選択してください"
        Exit Sub '関数を抜ける
    End If
    
    '番号をローカル変数に保存する
    LNG顧客番号 = Me![lst顧客番号]
    Debug.Print LNG顧客番号  'テバックで表示
    
    'フォームを閉じる
    DoCmd.Close

    'レコードを移動する
    DoCmd.GoToControl "顧客番号"  '顧客番号フィールドにコントロールを移動
    DoCmd.FindRecord LNG顧客番号  '選択された番号のレコードに移動
    ' 
End Sub
あれ、質問は、フォーム間の代入処理なのに、代入してないよ? あっ、これですか・・・ Forms![顧客画面]!顧客番号 = LNG顧客番号 で、隣のフォームにデータをセットしたり・参照できるんだけど、 呼び出し元が連結フォームで処理していると、 Forms![顧客画面]!顧客番号 = LNG顧客番号 でセットすると、レコードは移動前の状態なので、 顧客番号を上から重ねて書いてしまいます。(データが壊れてしまいます) 非連結の番号エリアなら、閉じる前に、 Forms![顧客画面]![顧客番号] = Me![lst顧客番号] Forms!顧客画面!顧客番号 = Me!lst顧客番号 で、フォーム名、コントロール名を指定して簡単にセットできます。 Forms![フォーム名]![コントロール名] がデータセットのポイントかな。 連結フォームだと、データセット=代入になってしまうので、 前のデータを消してしまうので、 DoCmd.GoToControl "顧客番号" '顧客番号フィールドにコントロールを移動 で、コントロールを顧客番号にして、 DoCmd.FindRecord LNG顧客番号 '選択された番号のレコードに移動 で、レコードを探す(移動する) 代入はしていないのですが、レコードが移動しているので、 代入しているように見えます。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba089.lzh にdb089.mdb(Access2000版)が保存されています。 動きを見てもらうのが一番ハヤイかもしれません。 ※いろいろと追加して、テストしてみてください。

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

今回は、 別フォームで番号を選択、選択された番号を使用して、 該当レコードに移動する、 そんな処理方法の例でした。 ※汎用性のある方法は次回に・・・ 拾い読みして、 1つでも何かの参考となれば幸いです。 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系バックナンバー目次へ移動]