[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.090 Access Form OpenArg引数でセット位置を渡す

Access Form OpenArg引数でセット位置を渡す

メルマガ発行内容

<Access Form OpenArg引数でセット位置を渡す>

(検索フォームで選択した番号を使用する その2) どうも、三流プログラマーのKen3です。 今回は、 フォーム間のデータのやり取りで、 前回の続きで、開いた別フォームからデータを受け取りたい、 そんな感じの処理を書きたいと思います。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba090.lzh にdb090.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顧客画面 ← 選択された顧客番号を表示させる --------------- そんな質問に対して、 前回の [No.89 Access 検索フォームで選択した番号を使用する その1] http://www.ken3.org/backno/backno_vba18.html#89 では、 顧客画面の該当レコードへデータを移動する。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 方法、
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
と、 DoCmd.GoToControl "顧客番号" '顧客番号フィールドにコントロールを移動 で、コントロールを顧客番号にして、 DoCmd.FindRecord LNG顧客番号 '選択された番号のレコードに移動 で、レコードを探す(移動する) 代入はしていないのですが、レコードが移動しているので、 代入しているように見えます。 なんて、勝手に作ってました。

/* * 2.読者の心の声を代弁してみる(笑) */

読者が心の中で、下記のように言ったかどうかは不明ですが、 勝手な物語を少し読んでください。 読者の声を代弁(笑)※自分落としネタ ^^^^^^^^^^^^^^^^^^^^ へぇ〜、動いてるけど、それだと、顧客番号を使用する違う画面から、 顧客番号検索画面が使えないジャン。 例えば、印刷処理で、 顧客データ印刷画面 ^^^^^^^^^^^^^^^^^^ 顧客コード[ ______ ] 検索 と、印刷画面でも検索ボタンを作って、 顧客番号検索画面(共通)を呼びたいのに 顧客番号検索_印刷用とフォームをもう一つ作って、
Private Sub btn選択_Click()
    '番号選択のチェック
    If IsNull(Me![lst顧客番号]) Then '何も選択されていないか?チェック
        MsgBox "顧客番号を選択してください"
        Exit Sub '関数を抜ける
    End If
    
    '番号を親フォームに保存する
    Forms!顧客画面!顧客番号 = Me!lst顧客番号    
     '↑↑↑
    'ここを印刷画面に変えて
    Forms!顧客データ印刷!顧客番号 = Me!lst顧客番号    

    'フォームを閉じる
    DoCmd.Close
End Sub
と、 Forms!顧客画面!顧客番号 = Me!lst顧客番号      '↑↑↑ 'ここを印刷画面に変えて Forms!顧客データ印刷!顧客番号 = Me!lst顧客番号 だけ、違うフォームを作れって? 検索数分、同じ処理なのに、コピーしてフォームを作れ?って? フォームの数が多いほうがプログラム作った気になれるって? イヤ、そこまでは、考えてなくて、 ただ、検索できればいいのかなぁと思って・・・ だから三流作者とかクレームのメールたくさんもらうんだよ。 (※お礼メールの方が多くなるように努力しないとね)

/* * 3.フォームに引数を渡して逃げる OpenArg引数 */

さてと、 今の問題を少し整理すると、 ^^^^^^^^^^^^^^^^^^^^^^^^^^ 新たに開いた検索画面で データ選択後の処理で、 Forms!顧客画面!顧客番号 = Me!lst顧客番号      '↑↑↑ Forms!顧客データ印刷!顧客番号 = Me!lst顧客番号 だけ、違うフォームを作れって? なんて、言ってました。 下記のような、印刷開始番号〜印刷終了番号を入れる画面を例にして、 処理を考えて見ます。 顧客データ印刷画面 ^^^^^^^^^^^^^^^^^^ 顧客コード[ ______ ] 検索 〜 [ ______ ] 検索 (txtSTART) (txtEND) と、印刷開始コード、終了コードをそれぞれセットするサンプルを作ってみます。 ↑作成した画面 違うのは、 選択されたデータのセット位置(フォームと項目)なので、 顧客番号検索フォームに 選択された番号をセットするフォーム名と項目名を渡します。 フォームに渡す? ~~~~~~~~~~~~~~~~ なにそれ? えっと、 DoCmd.OpenForm に何かいいパラメータ無いかなぁ、、と探っていたら、 一番最後に、OpenArg引数なんて引数があるじゃないですか・・・ ↑パラメータヒントの画面 さっそく、ヘルプで調べてみると、 Forms!社員.OpenArgs me.OpenArgs など、 フォームオブジェクト.OpenArgs で、フォームを開くときに指定した引数を参照できる。 でも、1つしか渡せないのかぁ、/(スラッシュ)で区切って渡し、 分解してもらうか。 下記の2つの検索ボタンが押されたら、
Private Sub btn開始番号検索_Click()
    Dim stDocName As String
    Dim stLinkCriteria As String

    stDocName = "顧客番号検索画面"
    DoCmd.OpenForm stDocName, , , stLinkCriteria, , , "顧客データ印刷/txtSTART"
End Sub
Private Sub btn終了番号検索_Click()
    Dim stDocName As String
    Dim stLinkCriteria As String

    stDocName = "顧客番号検索画面"
    DoCmd.OpenForm stDocName, , , stLinkCriteria, , , "顧客データ印刷/txtEND"
End Sub
と 顧客番号検索画面フォームに引数を渡し、 顧客番号検索画面で顧客番号が選択されたら、 結果を引数で受け取った場所にセットしてみますか。

/* * 4.検索画面、Me.OpenArgsを参照して、データをセットする */

顧客番号検索画面 ^^^^^^^^^^^^^^^^ のモジュールを下記のように修正しました。 キャンセルボタンの時は、何もしないで閉じてます(変更無し)
Private Sub btnキャンセル_Click()
    'フォームを閉じる
    DoCmd.Close
End Sub
選択ボタンの時、Me.OpenArgsを参照して、データをセットする
Private Sub btn選択_Click()

    '番号選択のチェック
    If IsNull(Me![lst顧客番号]) Then '何も選択されていないか?チェック
        MsgBox "顧客番号を選択してください"
        Exit Sub '関数を抜ける
    End If
    
    '変換場所の判断
    Dim n As Integer '/の位置判断
    Dim strSETFORM As String  'フォーム名
    Dim strSETCONTROL As String 'セットするコントロール名
    n = InStr(Me.OpenArgs, "/")
    If n <> 0 Then  'スラッシュの位置によって処理する
        strSETFORM = Left(Me.OpenArgs, n - 1)   '左から/の前まで
        strSETCONTROL = Mid(Me.OpenArgs, n + 1) '/の次から最後まで
        '顧客番号を指定フォームのコントロールにセット
        Forms(strSETFORM).Controls(strSETCONTROL) = Me![lst顧客番号]
    Else  '下記、普通は通らないエラー処理
        MsgBox "パラメータエラー、プログラム管理者にお伝えください"
    End If
   
    'フォームを閉じる
    DoCmd.Close

End Sub
ポイントは、 ~~~~~~~~~~~~ n = InStr(Me.OpenArgs, "/") If n <> 0 Then 'スラッシュの位置によって処理する strSETFORM = Left(Me.OpenArgs, n - 1) '左から/の前まで strSETCONTROL = Mid(Me.OpenArgs, n + 1) '/の次から最後まで で、/の位置を探し、 DoCmd.OpenForm stDocName, , , stLinkCriteria, , , "顧客データ印刷/txtSTART" で送られてきた、 "顧客データ印刷/txtSTART" のフォーム名とテキストボックスの名前を分解します。 '顧客番号を指定フォームのコントロールにセット Forms(strSETFORM).Controls(strSETCONTROL) = Me![lst顧客番号] で、 フォーム名とコントロール名を指定して、データをセットしています。 あまり見慣れない書き方かもしれませんが、 Forms(文字列).Controls(文字列) で、代入/参照することが出来ます。 おまけで、
Private Sub lst顧客番号_DblClick(Cancel As Integer)
    'リストボックスをダブルクリックしたら
    Call btn選択_Click    'と、選択ボタンの処理を呼ぶ
End Sub
と リストボックスをダブルクリックで、選択ボタンを押した処理を走らせてます。 Call btn選択_Click と、イベントの btn選択クリック処理を呼ぶ、みたいな書き方も出来ます。 ※操作になれた人だと、リストボックスダブルクリックで選択にしておくと、  便利だと思います。  (本題と関係ない、余談ですが、入れておくと便利ですよ)

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

検索フォームで選択した番号を使用する その2 Access Form OpenArg引数でセット位置を渡す方法はどうでしたか? これなら、共通の番号選択処理を使うことができそうですね。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba090.lzh にdb090.mdb(Access2000版)が保存されています。 実は、検索フォームで選択した番号を使用する その3があるのですが、 続きは、次回のお楽しみで。 ※読者の心の声:その3はたぶんあの方法だな、読めたよ三流君。  と聞こえてきたところで。。。  (次回の展開を予想するのも一流読者の密かな楽しみみたいなので(笑)) 拾い読みして、 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系バックナンバー目次へ移動]