• ベストアンサー

Access2003 VBAからの値の代入時に更新イベントを実行できない??

access2003+WinXP_Pro環境です。 値の代入について質問させて頂きます。 フォーム上の値を同時に、開いている他のフォームから値を代入したのですが、 元フォーム上で更新時イベントに記述している値の代入が動作しません。 他のフォームのVBAから値の更新をした場合、どのように更新時イベントを設定すればよいのでしょうか?

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

  • ベストアンサー
noname#140971
noname#140971
回答No.7

SetFocus を忘れたゴミ回答をしょっぱなにしたために混乱したようですね。 お詫びします。 お詫びとして、Form2からForm1の任意のイベントを起動するテクニックを一つ Form1: Private Sub Form_Timer()   テキスト1_AfterUpdate   Me.TimerInterval = 0 End Sub Private Sub テキスト1_AfterUpdate()   MsgBox "テキスト1_AfterUpdate" End Sub Form2: Private Sub コマンド0_Click()   Forms("Form1").TimerInterval = 1000 End Sub この単純な仕掛けで、Form_Timer() に書いたイベントが Form2 から起動できます。 ただし、Me.TimerInterval = 0 を忘れないで書く必要があります。

Gntym
質問者

お礼

ホントにいろいろと有難うございます。 コードなどを見直して、No.1のご回答の手法で対応できました。 尚、元のフォームで値を代入したいテキストボックス(txt_商品ID)のDblclickイベントで検索フォームを表示しているので、 フォーカスをコードで指定しなくてもOKでした。 No.7のご回答はテキスト保存してとっておきます。 有難うございました。

その他の回答 (6)

noname#79209
noname#79209
回答No.6

言い訳に聞こえるかも知れませんが、「別フォームで検索をかけて戻ってくる」というユーザーインターフェースを私は採りませんので、チグハグナなお答えになってしまいました。 私なら、 F_販売記録にコンボボックスcmb_商品IDを置き、この値集合ソース(R owSource)に商品マスタテーブルをセットします。 このコンボボックスの連結列の番号を商品マスタテーブルの商品IDフィールドの順番をいれておきます。 その上で、このコンボボックスの更新後イベントプロシージャに所定のコードを書きます。 なので、取り立てて商品ID検索フォームを作成する必要を私は感じません。 直接の回答でなくて申し訳ないですが...

Gntym
質問者

補足

このようなご意見、本当にうれしいです。 コンボボックスによる商品選択のことでよろしいですよね? 現在使用している商品マスタには約3000のアイテムが存在しています。 基幹システムではこのコンボ検索があちこちに見られるのですが、 現在の業務では検索性が良くありませんでした。 その原因としては、 ・商品数が多くスクロールで検索するには労働衛生上(笑)好ましくない。  (実際似たような品番も多く、かなりつらいです) ・商品名に統一性をもたせることができない。 ・使われなくなった商品について、廃止フラグがない。 ・表示される順番について部門毎に要望が異なる。 というのが主な原因です。 一見簡単に対応できそうですが、この基幹システムは外部製作のものであり、 手を加える事はちょっとまずいので困っていました。 また、使用者のスキル面からも"商品名での検索"が必須条件であり、 コンボボックスの表示件数を増やす程度の事はしてみましたが、反応はよくありませんでした。 そういうわけで、基幹システムのテーブルを参照したサブシステムを構築してみました。 その中で、今回のような仕組みを考えてみたわけです。 質問板でこのようなご意見まで頂けたことに、誠に感謝いたします。

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.5

簡単に実現するには、No1 さんの回答になります。 ただし、Textプロパティは、 コントロールにFocusがないとエラーになりますので テキストボックスに Focus を移動するコードが必要です。 > Form2: > Private Sub コマンド0_Click()   Forms("Form1").Controls("テキスト1").SetFocus >   Forms("Form1").Controls("テキスト1").TEXT = "AAAAAAA" > End Sub

noname#79209
noname#79209
回答No.4

フォームの関連がはっきりしなかったので、 > F_商品検索のコントロール名をtxtItemとして、 と書きましたが、 F_販売記録のtxt_商品IDのAfterUpdateのイベントが正解です。

Gntym
質問者

補足

>F_販売記録のtxt_商品IDのAfterUpdateのイベントが正解です。 ここにcall~の記述を行うという意味でしょうか? だとすると、F_商品検索のVBAから更新されているので、イベントが実行されないのでは、、、? 一応試してみましたが、更新時のタイミングでは実行されませんでした。 誠に恐れ入りますが、F_商品検索.txt_商品IDのDblclickイベントに記述する場合に、 "特定の"(この部分がわからりません)フォーム上のafterupdateイベントを実行する記述方法を教えて頂けないでしょうか?

noname#79209
noname#79209
回答No.3

F_商品検索のコントロール名(仮にテキストボックスのタイプとします)をtxtItemとして、 このコントロールの更新後イベントプロシージャ名は「txtItem_AfterUpdate()」となりますから 値の代入直後に call txtItem_AfterUpdate でよろしいかと...

Gntym
質問者

補足

ご回答有難うございます。 教えて頂いたcall~の記述について教えて頂きたいのですが、、、 現在までだとぼやけた部分があると思いますので、現在のフローを説明します。 1. F_販売記録.txt_商品ID のDblclick時イベントに F_商品検索フォームを開くコードを記述(F_商品検索が開く) 2. F_商品検索.txt_商品IDをDblclick時イベントに Me.txt商品IDを F_販売記録.txt_商品IDに値を代入し F_商品検索を閉じるコードを記述(値が代入される) 3. F_販売記録.txt_商品IDの値は更新されるが、AfterUpdateのイベントは作動しない。 ~ここまでが新規に質問した時点での構成です。 F_商品検索.txt_商品ID のDblclick時イベントに下記の記述を追加しましたが、エラーがでます。 F_商品検索に記述するのが正しいかと思います。 その場合"どのフォームの"txt_商品IDの更新時イベントをcallするのかという風にしなければいけないと思うのですが、その場合の記述方法がわかりません。 お世話になりますが、よろしくお願いします。

noname#79209
noname#79209
回答No.2

基本的にVBAによるコントロールへの値の代入時には イベントは発生しない仕様になっています。 > 元フォーム上で この記述があいまいです。 「元」というと、データの参照元(開いている他のフォーム)なのかと思ってしまいます。 さて、ご質問への回答ですが、 開いている他のフォームからデータを拾って代入したら、そのデータ代入したコントロールの 更新後イベントプロシージャをCallすればよいのでは?

Gntym
質問者

補足

ご回答有難うございます。 この場合「元フォーム」とは例えば販売記録等を一覧形式で表示しているフォームのイメージです。(F_販売記録) また、同時に開いているフォームは検索用です。(F_商品検索) あいまいな表現に気をつけます。 色々と勉強中なのですが、この場合のプロシージャをCallするとは、どのような記述でできるのでしょうか? 上記のフォームの例をとると、 F_商品検索での「値の代入」の記述の直後にcall~とするということでしょうか? call命令について検索してみましたが、いまひとつ使い方がわかりません。 恐れ入りますが、教えて頂けないでしょうか?

noname#140971
noname#140971
回答No.1

Form1: Private Sub テキスト1_AfterUpdate()   MsgBox "テキスト1_AfterUpdate" End Sub Form2: Private Sub コマンド0_Click()   Forms("Form1").Controls("テキスト1").TEXT = "AAAAAAA" End Sub これで、イベントは発生しますが・・・。

Gntym
質問者

お礼

有難うございます。 早速試してみます!!

関連するQ&A