[三流君] −−>
[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系の→[掲示板]←を覗く、質問を書き込む
評価・感想
ページフッター(リンクや広告など)
[三流君(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)から検索する
書籍の購入
Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??
コンピュータ書籍の発送がハヤイ専門店
コンピュータの本・専門店
|
※種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり
|
amazon.co.jpでキーワード別チェック
下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・