Access VBA Sub のパラメーター

このQ&Aのポイント
  • Access VBAのSubでは、イベントプロシージャでパラメーターを設定することはできない。
  • 代わりに、グローバル変数を使用することで、パラメーターのような機能を実現することができます。
  • または、Sub内で処理する前にフォームのコントロールの値を取得しておき、その値をSub内で使用することもできます。
回答を見る
  • ベストアンサー

Access VBA Sub のパラメーター

フォームに作ったボタンのイベントとして、 「イベント プロシージャ」→「クリック時」→ 「・・・」で サブルーチンを作ろうとしています。 「・・・」で Private Sub 名前_Click() が出ますが、パラメターを、例えば「名前_Click(p1)」と付けると 「イベントプロパティに指定した式 クリック時 でエラーが発生しました: ・・・」 が出ます。 (1)_Click()には、パラメターを設定できないのでしょうか? (2)もし、付けられるのでしたら、付ける方法を教えて下さい (3)もし、_Click()には、パラメターを設定できないのでしたら、代替え方法を教えて下さい よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8508/19344)
回答No.1

>(1)_Click()には、パラメターを設定できないのでしょうか? 出来ません。 「呼び出される側でパラメーターを受け取る」には「呼ぶ側でパラメーターを指定する必要」があります。 ですが、クリック時のプロシージャは「クリック時に勝手に呼ばれる」ので「呼ぶ側でパラメーターを指定する事が不可能」です。 「呼ぶ側でパラメーターを指定する事が不可能」なのであれば「呼び出される側でパラメーターを受け取る事も不可能」です。 >(2)もし、付けられるのでしたら、付ける方法を教えて下さい そういう方法はありません。 >(3)もし、_Click()には、パラメターを設定できないのでしたら、代替え方法を教えて下さい 「なぜパラメーターが必要になってしまったのか?」を、良く検討して下さい。 質問に「なぜパラメーターが必要になってしまったのかの理由」が書かれていないので、代替方法の提案は出来ません。 提案が欲しいなら「なぜパラメーターが必要になってしまったのかの理由」を明記して下さい。 それが明記されれば「パラメーターを使わないで解決する方法」を思考する事が可能です。

hiroishi
質問者

お礼

下記の様なことを考えています。 顧客テーブル  顧客ID  氏名  電話番号 コード  (1)sub S1(電話番号) で、フォームに同じ電話番号(家族等)をリスト  (2)上記フォームで、特定の一人の行をクリック ← ここで Call S2(顧客ID)  (3)sub S2(顧客ID) では、顧客IDで抽出してフォームに表示 を考えていました。 所が、明確に「出来ません」と言われてみて気が付いたら、どうも(2)で フォームに移った時点で、変数、顧客IDは生きていないのではと考えるように なりました。 明確に「出来ません」と言って頂き、本当にありがとうございました。

hiroishi
質問者

補足

早速のご回答、ありがとうございました。 明確にできないと言うことでした、或いは私がやろうとしているロジックが根本的に勘違いしていることも考えられます。 やりたいことをもう一度整理してみます。 ただ、たった今仕事が入ってしまったので、2,3日後に連絡いたします。 とにかく、ありがとうございました。

その他の回答 (1)

回答No.2

例えば、 ・モジュール内に通用する変数の値をセットする。 ・各Clickイベントでセットした値を利用したい。 というのが目的ではなくて・・・。 ・各コントロールのClickイベントにコードを書くことをしない。 ・そうではなく、Accessが生成するClickイベント以外を利用したい。 ・つまり、自分が用意したClickイベントで処理をしたい。 ・そのイベントで用いる値はSET()でセットしたい。 ・もって、各コントロールに共通の独自のClickイベント処理を行いたい。 具体的には、 1、あるコントロールで値を選ぶ。 2、Set()でその値をクラス変数にセットする。 3、そうするとクリックした各コントルールでその値を利用した処理がなされる。 という仕組みを実現するには? という質問であれば・・・。それは、独自のクラスライブラリを作成するしかありません。

hiroishi
質問者

お礼

お返事、ありがとうございました。 chie65535さんとのやり取りでもお分かりと思いますが、VBAはよちよち歩きでして、 クラスライブラリを作る力はありませんので、何とか別の方法を考えます。

関連するQ&A

  • アクセス2002 VBA

    フォームを保存せずに閉じたいのですが、 当該フォームの「閉じる時」プロパティーにイベントプロシージャを設定し、 Private Sub Form_Close() DoCmd.Close acForm, "フォーム1", acSaveNo End Sub と記述しました。  ところが、実行すると 「Close アクションの実行はキャンセルされました。」とエラーになってしまいました。  間違いの指摘をお願いします。

  • 不要なイベントを削除したい

    フォームにコマンドボタン(名前:コマンド0)を置いて、 [イベント プロシージャ]にしてクリックするとVBE画面にプロシージャーが作成されますよね。 しかしそのコマンドボタンの名前を変更して(新しい名前:新コマンド0)、さっきと同じように [イベント プロシージャ]にしてクリックすると新たなプロシージャの型が作成されますよね。 Private Sub コマンド0_Click() End Sub Private Sub 新コマンド0_Click() End Sub こんなかんじで。 そんな事を一杯やり過ぎて、 Private Sub コマンド0_Click() End Sub の方がいっぱい余ってる?浮いてる?イベントに紐づいてない状態なのですが、 量が多すぎてどれが不要なプロシージャーなのかわからないのですが、 一気に削除する方法はありますか? 別にほっといても問題ないとは思うのですが、不要なものは削除したいです。

  • アクセスVBAのエラーについて

    フォームを閉じるためにフォームにボタンを置いて、イベントプロシージャに下記のように書き込みました。すると添付画像のエラーが返ってきてマクロが動きません。 Private Sub コマンド103_Click() On Error GoTo Err_コマンド103_Click DoCmd.Close Exit_コマンド103_Click: Exit Sub Err_コマンド103_Click: MsgBox Err.Description Resume Exit_コマンド103_Click End Sub で、「ファイル-オプション-現在のデータベース」の”フォームの表示”を問題のフォームに切り替えたら問題なく動作します。 つまり”フォームの表示”で選んだフォームでしかコマンドボタンのマクロが動きません。全てのフォームでマクロが動くにはどうしたらよいのでしょうか?

  • アクセスvba [イベント プロシージャ]つけたい

    もうフォームモジュールにイベントは出来上がってるのですが コントロールの名前を変更したため デザインビューのプロパティの[イベント プロシージャ]と言う文字が消えてしまいました。 フォーム上の全てのコマンドボタンのクリック時に [イベント プロシージャ]と言う文字を入れたいのですが そのような作業は可能でしょうか? [イベント プロシージャ]と言う文字が入れば、該当のイベントは既にモジュールにある為 イベントとして機能します。

  • 2003アクセス → 2010移行のトラブル

    アクセス2003で作成したものがアクセス2010では全く使用できなくなりました。 どのボタンを押しても下記メッセージがでます。 ●イベントプロパティに指定した式 クリック時 エラーが発生しました。 ・修正候補 ステートメントの最後 ・マクロ名、ユーザー定義関数名、(イベントプロシージャ)以外の式が指定されています。 ・関数、イベント、マクロの評価でエラーが発生しました。 ●ヘルプを表示すると  このエラーはイベントのロジックの場所を評価できない為にイベントを実行できなかった為に発生します。例えば、フォームの OnOpen/開く時”” プロパティが=[フィールド]に設定されている場合、イベントが開始されたときに、マクロまたはイベントの名前が実行対象として予期されるため、このエラーが発生します。 コードを見ると赤くなっているのは下記だけだったのですが、他にも問題があるような気がします。。。。 Private Sub 見積書(少数点)ボタン_Click() End Sub Private Sub 報告書(少数点)ボタン_Click() End Sub ご教授宜しくお願い致します。

  • Access 1つのイベントに複数のVBA

    こんにちは! Accessについて、質問です!! あるフォームの『修正』というボタンのクリック時プロパティに、以下のVBAが組み込まれています。 Private Sub 修正_Click() CopyRec End Sub ここに新たに、 『メッセージボックス』『ウインドウを閉じる』VBAを加えたいのです。 現状として…… (1)Private Sub 修正_Click() CopyRec MsgBox "修正が完了しました" End Sub (2)Option Compare Database (下線) Private Sub 修正_Click() CopyRec End Sub Option Compare Database (下線) MsgBox "修正が完了しました" End Sub 上記(1)(2)は、失敗しています。 質問は2つあります。 (1)1つのプロパティに、複数のVBAを設定するのは可能ですか?可能なら、どのようにVBAを入力すれば正常作動するのでしょうか? (2)『ウインドウを閉じる』VBAの書き方が調べても分かりませんでした……。どのように入力するのですか? どちらか1つが分かる方でもかまいません。 回答よろしくお願いします!

  • Sub ***( ) と Private Sub ***( ) の違い

    初歩的な質問で申し訳ありませんが・・・ 自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。 ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。 Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか? どなたか説明頂けませんか? よろしくお願いします。

  • アクセスVBA 変数を渡したい

    フォーム1のcmd_ボタンをクリックして、フォーム2を開く際に、変数を渡したいのですが、どう渡せばいいのでしょうか? Private Sub cmd_ボタン_Click() myStr = "あああ" DoCmd.OpenForm "フォーム2" (myStr) End Sub とすると、エラーになります。 文の書き方を教えてください。

  • イベントプロシージャーでPublic Subにする意味はありますか?

    フォームのイベントプロシージャーは Private Subで作成していますが 仮にPublic Subにしても他のモジュールから呼び出すことはないから意味ないですよね?

  • access2000のVBAのことで教えてください。

    プログラム初心者でプログラム作った方がいきなり辞めてしまって困ってます。 市販の本とか見ても解りませんし、質問の仕方も良くわかりませんが 教えてください。 マクロの項目には何も無くマウスクリック時のイベントプロシージャでボタンを作ってるようです。 下記のプログラムですがクエリどこの命令文なるのですか? Private Sub 顧客名検索_Click() On Error GoTo Err_顧客名検索_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = \"F_顧客名検索\" DoCmd.OpenForm stDocName, , , stLinkCriteria Exit_顧客名検索_Click: Exit Sub Err_顧客名検索_Click: MsgBox Err.Description Resume Exit_顧客名検索_Click End Sub