[三流君] −−>
[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でした。
※評価は↓で投票してね。感想は掲示板かメールでくださいね。
フィードバック
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に流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・