[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.091 Access ダイアログフォームって?何? acDialogとPublic変数を使用

Access ダイアログフォームって?何? acDialogとPublic変数を使用

メルマガ発行内容

<Access ダイアログフォームって?何? acDialogとPublic変数を使用>

(検索フォームで選択した番号を使用する その3) どうも、三流プログラマーのKen3です。 今回は、 フォーム間のデータのやり取りで、 グローバルにデータを置いて置き処理してみます。 ※前回の続きで、開いた別フォームからデータを受け取りたい、  そんな感じの処理を書きたいと思います。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba091.lzh にdb091.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 では、 呼び出した検索画面から、呼び出し元画面の 'レコードを移動する DoCmd.GoToControl "顧客番号" '顧客番号フィールドにコントロールを移動 DoCmd.FindRecord LNG顧客番号 '選択された番号のレコードに移動 と、コントロール移動とレコード移動でかわし(逃げて) あまり意味の無い回答でした。 次の(前回の) [No.90 Access Form OpenArg引数でセット位置を渡す] http://www.ken3.org/backno/backno_vba19.html#90 では、 コントロールにアクセスする方法は、 Me.Controls!新規データ Me.Controls![新規データ] Me.Controls("新規データ") なんて、名前を指定する方法があるので、 OpenArg引数でフォーム名とコントロール名を検索フォームに渡し、 stDocName = "顧客番号検索画面" DoCmd.OpenForm stDocName, , , stLinkCriteria, , , "顧客データ印刷/txtSTART" DoCmd.OpenForm stDocName, , , stLinkCriteria, , , "顧客データ印刷/txtEND" (↑OpenArgパラメータを発見) 検索画面側で、 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顧客番号] と、 引数を分解、 Forms(フォーム名).Controls(コントロール名) へデータを代入してます。

/* * 2.掲示板やMLでもよくある話? */

ふう、前回の駆け足説明が終わったところで、 掲示板やMLでもよくある話? 読者の声を代弁(笑) 下記は作り話なので、今回の質問者からクレームもらっていないので、 誤解しないでくださいね。 ※質問者の立場と回答者の作り話ですよ(本気にしないでね) 前回の方法は、呼ばれたフォーム側で処理をする方法で、 私がやりたいのは、フォームから値を受け取りたいんです。 ※そんな参照方法で逃げる別の案は聞きたくないし、  OpenArgで渡し、Forms(strSETFORM).Controls(strSETCONTROL)へ代入  は、知ってるし、できなかったらやろうと思ってました。  *なんて書いたらケンカになるなマズ(注意してね) Input Box関数みたいに、ダイアログフォームから値を受け取りたいんです。 そんな方法を知りたくて質問したんです。
Private Sub 検索ボタン_Click()
  Dim MyValue as String
    'オリジナルのINPUTBOXもどき(ダイアログフォーム)から顧客番号が帰ってきて
    MyValue = INPUT_顧客番号検索()

    If MyValue = "" Then
	'キャンセル処理を記述
  Else 
	'ここに検索実行や値を使用したを記述します
        '・
        '・
    End If
End Sub
と、処理したいんです。 まぁ、質問者と受け手の回答者のイメージがズレていると発生する、 そんなよくある話しかなぁ。 最悪は、回答者が、初めから情報を全て出せ、こんなの聞いてない。 オレ様の方法で動くんだ、そんな処理作るな(オイオイ、何様だ?) となったりするし、、、、 そんな現場を目にした初心者の人は、 全文ソースを載せてしまいます。 すると、今度は、 ソースの丸投げですか?困ったもんだサポートセンターと勘違いしているよこの子? こっちは無償でやってんだから・・・と回答者のお偉いさんは言う(オーバーだけど) もっとマズイのが、 テストデータで潰さないといけないのに、 顧客のデータ(実データ)をそのまま掲示板などに載せてしまう。 また、 私宛の質問に添付ファイルで送ってくれる。信用しているのか? どこの誰ともわからない三流プログラマーに、 大事な顧客データを流してくれる・・・ 私が流用したら or メールで送っているので途中でパクられたら? こんな感じで意識が低いんだよね、データの流出って。 そんな暗い、ブラックな話題を主に扱っているのが(オイオイ大丈夫?) 愚痴マガと言われているマニアックな読者?が読んでる http://www.ken3.org/guchi/ --- 三流プログラマー業務の愚痴 です。 No.148 公園デビューする気持ち?と掲示板の猛者達(笑) http://www.ken3.org/backno/backno_guchi29.html#148 No.155 回答者の行き場の無い気持ち(笑) http://www.ken3.org/backno/backno_guchi31.html#155 なんて、書いてます。よかったら見に来てください。 読者の声:宣伝は終わりでいいの?ハヤク次やってよ(笑) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

/* * 3.話をやっと戻し、今回やりたいこと */

脱線した、いつものでも今回は長過ぎた前置き話は、置いといて、 話をやっと戻し、今回やりたいこと ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Dim MyValue as String 'オリジナルのINPUTBOXもどき(ダイアログフォーム)から顧客番号が帰ってきて MyValue = INPUT_顧客番号検索() If MyValue = "" Then たしかに、共通で番号検索フォームを使いたいなら、 DoCmd.OpenForm stDocName, , , stLinkCriteria, , , "顧客データ印刷/txtSTART" DoCmd.OpenForm stDocName, , , stLinkCriteria, , , "顧客データ印刷/txtEND" とセット位置をOpenArg引数で渡すよりは、 MyValue = INPUT_顧客番号検索() と、リターン値でもらえると、面白いよね。 顧客データ印刷画面 ^^^^^^^^^^^^^^^^^^ 顧客コード[ ______ ] 検索 〜 [ ______ ] 検索 (txtSTART) (txtEND) と、印刷開始コード、終了コードをそれぞれセットするサンプル だったら、
Private Sub btn開始番号検索_Click()
    Me!txtSTART = INPUT_顧客番号検索画面()
End Sub
Private Sub btn終了番号検索_Click()
    Me!txtEND = INPUT_顧客番号検索画面()
End Sub
なんて、してみたいよね。

/* * 4.フォームでリターン値を返せないので、 * 標準モジュールとPublic変数で対応してみた */

フォームでリターン値を返せない(もしかしたら返せる?) ので、 印刷指示画面から btn開始番号検索_Click()などの検索ボタンが押されたら、 Me!txtSTART = INPUT_顧客番号検索画面() と、Function INPUT_顧客番号検索画面 なんて、 標準モジュールに作成した、値を返す、Function関数を作成します。 値を返す、Function関数では、 グローバルの変数を初期化します。 顧客番号検索フォームをダイアログ指定で開きます。 ダイアログ指定でフォームを開くと、 開いたフォームを閉じるまで処理が止まっています。   顧客番号検索フォームの処理が走ります   キャンセルボタンが押されたらPublic変数に0をセット後閉じる。   顧客選択のボタンが押されたらPublic変数に顧客番号をセット後閉じる フォームが閉じると、処理が戻ってくるので。 単純に、Public変数をリターン値で返します。 INPUT_顧客番号検索画面 = Public変数みたいな感じで。 *なんだぁ、結局パブリック変数に頼るのね、期待して損したよ  そっ、そんなこと言わないでよ(笑) Access2000の画面だけど、 まずはモジュールを選択して、 新規のモジュールを追加します。 ※モジュールの新規作成 白紙のモジュール編集画面が表示されます。 Public 選択番号 As Long '選択された顧客番号(共通) と Public変数を定義します。 DoCmd.OpenForm stDocName, , , stLinkCriteria, , acDialog とフォームオープンのモードを変更します こんな感じで、フォームを開いて、値を返します。
Function INPUT_顧客番号検索() As Long

    Dim stDocName As String
    Dim stLinkCriteria As String

    stDocName = "顧客番号検索画面"
    'acDialog指定でフォームを開く
    DoCmd.OpenForm stDocName, , , stLinkCriteria, , acDialog
    
    INPUT_顧客番号検索 = 選択番号  '共通変数を代入しただけ

End Function
________________ 顧客番号検索画面の選択フォーム側は、 ~~~~~~~~~~~~~~~~
Private Sub btnキャンセル_Click()
    '共通変数に選択データをセットする
    選択番号 = 0  'ここではキャンセル時の0をセットする
    'フォームを閉じる
    DoCmd.Close
End Sub
Private Sub btn選択_Click()

    '番号選択のチェック
    If IsNull(Me![lst顧客番号]) Then '何も選択されていないか?チェック
        MsgBox "顧客番号を選択してください"
        Exit Sub '関数を抜ける
    End If
    
    '共通変数に選択データをセットする
    選択番号 = Me![lst顧客番号]  'リストボックスの値をセットする

    'フォームを閉じる
    DoCmd.Close

End Sub
と、選択結果を選択番号に代入しただけです。(Publicで定義の変数に代入) さてと、テストは、 ? INPUT_顧客番号検索 とイミディエイト ウインドウでテストしてみました。 無事選択され、データが返りました。 'acDialog指定でフォームを開く DoCmd.OpenForm stDocName, , , stLinkCriteria, , acDialog これを、 DoCmd.OpenForm stDocName, , , stLinkCriteria とすると、どうなるか?違いを試してみてください。 すると、いきなり結果が返ってくると思います。 ※これで、acDialogの動作がわかると思います、 __________________ 顧客データ印刷画面 ^^^^^^^^^^^^^^^^^^ 顧客コード[ ______ ] 検索 〜 [ ______ ] 検索 (txtSTART) (txtEND) 実際に顧客番号を共通で使用する画面に組み込んでみます。
Private Sub btn開始番号検索_Click()
    Dim lngNO As Long
    
    lngNO = INPUT_顧客番号検索 '共通の検索ダイアログ
    If lngNO <> 0 Then  'キャンセル0以外なら
        Me!txtSTART = lngNO  '検索された番号をセット
    End If

End Sub
Private Sub btn終了番号検索_Click()
    Dim lngNO As Long

    lngNO = INPUT_顧客番号検索 '共通の検索ダイアログ
    If lngNO <> 0 Then  'キャンセル0以外なら
        Me!txtEND = lngNO  '検索された番号をセット
    End If
End Sub
lngNO = INPUT_顧客番号検索 と関数的にフォームを呼び出し、リターン値を受け取ります。 キャンセルのチェックをしたいので、 If lngNO <> 0 Then とIf文を入れてます。 ホントは直接、 Me!txtSTART = INPUT_顧客番号検索 が、かっこいいんだけどね。

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

こんな感じで、 共通の顧客番号選択フォームをINPUT BOXもどきのように使用することができます。 って言っても、 Publicの共通変数とacDialogを使っただけの、 フォームを開く、中間で処理する関数を作っただけでした。 まぁ、人間関係も直接やり取りするのが難しかったら、 間に人を立てて(爆)なんて話は、愚痴マガネタでしたね。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba091.lzh にdb091.mdb(Access2000版)が保存されています。 拾い読みして、 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系バックナンバー目次へ移動]