dポイントプレゼントキャンペーン実施中!

access2003+WinXP_Pro環境です。

値の代入について質問させて頂きます。

フォーム上の値を同時に、開いている他のフォームから値を代入したのですが、
元フォーム上で更新時イベントに記述している値の代入が動作しません。

他のフォームのVBAから値の更新をした場合、どのように更新時イベントを設定すればよいのでしょうか?

A 回答 (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 を忘れないで書く必要があります。
    • good
    • 0
この回答へのお礼

ホントにいろいろと有難うございます。

コードなどを見直して、No.1のご回答の手法で対応できました。

尚、元のフォームで値を代入したいテキストボックス(txt_商品ID)のDblclickイベントで検索フォームを表示しているので、
フォーカスをコードで指定しなくてもOKでした。

No.7のご回答はテキスト保存してとっておきます。
有難うございました。

お礼日時:2007/08/22 09:00

言い訳に聞こえるかも知れませんが、「別フォームで検索をかけて戻ってくる」というユーザーインターフェースを私は採りませんので、チグハグナなお答えになってしまいました。


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

この回答への補足

このようなご意見、本当にうれしいです。

コンボボックスによる商品選択のことでよろしいですよね?

現在使用している商品マスタには約3000のアイテムが存在しています。
基幹システムではこのコンボ検索があちこちに見られるのですが、
現在の業務では検索性が良くありませんでした。

その原因としては、
・商品数が多くスクロールで検索するには労働衛生上(笑)好ましくない。
 (実際似たような品番も多く、かなりつらいです)
・商品名に統一性をもたせることができない。
・使われなくなった商品について、廃止フラグがない。
・表示される順番について部門毎に要望が異なる。
というのが主な原因です。
一見簡単に対応できそうですが、この基幹システムは外部製作のものであり、
手を加える事はちょっとまずいので困っていました。

また、使用者のスキル面からも"商品名での検索"が必須条件であり、
コンボボックスの表示件数を増やす程度の事はしてみましたが、反応はよくありませんでした。

そういうわけで、基幹システムのテーブルを参照したサブシステムを構築してみました。
その中で、今回のような仕組みを考えてみたわけです。

質問板でこのようなご意見まで頂けたことに、誠に感謝いたします。

補足日時:2007/08/22 09:14
    • good
    • 0

簡単に実現するには、No1 さんの回答になります。


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

フォームの関連がはっきりしなかったので、


> F_商品検索のコントロール名をtxtItemとして、
と書きましたが、
F_販売記録のtxt_商品IDのAfterUpdateのイベントが正解です。

この回答への補足

>F_販売記録のtxt_商品IDのAfterUpdateのイベントが正解です。

ここにcall~の記述を行うという意味でしょうか?
だとすると、F_商品検索のVBAから更新されているので、イベントが実行されないのでは、、、?

一応試してみましたが、更新時のタイミングでは実行されませんでした。

誠に恐れ入りますが、F_商品検索.txt_商品IDのDblclickイベントに記述する場合に、
"特定の"(この部分がわからりません)フォーム上のafterupdateイベントを実行する記述方法を教えて頂けないでしょうか?

補足日時:2007/08/21 16:02
    • good
    • 0

F_商品検索のコントロール名(仮にテキストボックスのタイプとします)をtxtItemとして、


このコントロールの更新後イベントプロシージャ名は「txtItem_AfterUpdate()」となりますから
値の代入直後に
call txtItem_AfterUpdate
でよろしいかと...

この回答への補足

ご回答有難うございます。

教えて頂いた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するのかという風にしなければいけないと思うのですが、その場合の記述方法がわかりません。

お世話になりますが、よろしくお願いします。

補足日時:2007/08/21 14:41
    • good
    • 0

基本的にVBAによるコントロールへの値の代入時には


イベントは発生しない仕様になっています。
> 元フォーム上で
この記述があいまいです。
「元」というと、データの参照元(開いている他のフォーム)なのかと思ってしまいます。

さて、ご質問への回答ですが、
開いている他のフォームからデータを拾って代入したら、そのデータ代入したコントロールの
更新後イベントプロシージャをCallすればよいのでは?

この回答への補足

ご回答有難うございます。

この場合「元フォーム」とは例えば販売記録等を一覧形式で表示しているフォームのイメージです。(F_販売記録)
また、同時に開いているフォームは検索用です。(F_商品検索)
あいまいな表現に気をつけます。

色々と勉強中なのですが、この場合のプロシージャをCallするとは、どのような記述でできるのでしょうか?

上記のフォームの例をとると、
F_商品検索での「値の代入」の記述の直後にcall~とするということでしょうか?
call命令について検索してみましたが、いまひとつ使い方がわかりません。
恐れ入りますが、教えて頂けないでしょうか?

補足日時:2007/08/21 11:54
    • good
    • 0

Form1:


Private Sub テキスト1_AfterUpdate()
  MsgBox "テキスト1_AfterUpdate"
End Sub

Form2:
Private Sub コマンド0_Click()
  Forms("Form1").Controls("テキスト1").TEXT = "AAAAAAA"
End Sub

これで、イベントは発生しますが・・・。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/20 17:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!