[三流君] −−> [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でした。 ※評価は↓で投票してね。感想は掲示板かメールでくださいね。

フィードバック

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

評価・感想

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