• ベストアンサー

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

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

  • Gntym
  • お礼率58% (39/67)

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

  • ベストアンサー
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

  • アクセス2003のサブフォームの値の代入

    アクセス2003でメインフォームにデータシートビューのサブフォームを作成しています。 そのサブフォームのフィールドにイベントで検索用の別のフォームを開くようにしています。 検索用フォームからサブフォームへマクロで値を代入するように しているのですが、サブフォームが見つからないというエラーが表示されます。 どこに問題があるのでしょうか? (ちなみにサブフォームだけ開いて検索フォームを開き値を代入するとうまく行きます。メインフォームからだとエラーになります。) どうぞよろしくお願いします。

  • アクセスのVBAについて

    アクセスのVBAでテーブルからウィザードでフォームを作成したのですが、その表示内容を昇順でソートしたいのですがどうすればよいのでしょうか?勝手に主キーでソートされてしまいます。違う値でソートしたいのですが・・・一応フォームLoadのイベントでSQLでテーブル内容をソートして値を代入していったのですがうまくいきません。 よろしくお願いいたします。

  • ACCESSで値を代入できないとは?

    ACCESS2000を使用しています。 フォームを作り、画面のテキストボックスに値を入れると、エラーになります。 エラーコードは 2448。 エラーメッセージは オブジェクトに値を代入できない と出ますが、ヘルプが参照できません。 どういうことなのでしょうか。

  • ACCESS2021に変えたら値が代入されない

    開いてくださりありがとうございます。 MS-ACCESS2003で開発した業務システムがあります。 今回、ACCESS2021(Microsoft365)に変更したところ、不可解な動作が生じていて非常に困っています。 以下に抜粋したコードを記載します。 -- Me!税抜合計 = Me!小計 Me!消費税 = Me!消費税計 Me!伝票合計 = Me!総額 -- 伝票入力フォームから伝票明細を入力し、その合計が表示されるテキストボックスの値を作業用のテキストボックスに代入しています。 ブレイクポイントで停止させて確認すると、右側の項目には間違いなく値が入っている(マウスポインターを合わせると例えば1000と表示される)のですが、左側の項目は0のままです。 この状況は伝票明細が5行以上の時に発生します。 (4行以下の伝票では発生しません) しかもACCESS2003では問題なく動作していました。 値が代入されないのは長く開発していて初めての現象です。 ぜひアドバイスをお願いします。

  • サブフォームをブランクで開きたい(値の代入)

    現在、サブフォームを開く時に値の代入の後、DMax関数で+1をして最後のレコードに+1したIDをマクロで行っていますが、VBAでできないでしょうか? 1.サブフォームを開く Cmd Open フォーム名 2.値の代入で(””)をいれフォームをクリア 3.値の代入でID=DMax"テーブル”+1 良い知恵があれば教えて頂けないでしょうか マクロにあまり頼りたくないので宜しくお願い致します。

  • Accessの「Form_AfterUpdate」イベントが実行されないんですが...

    現在、仕事でAccessを使用し始めましたが、イベントの発生するタイミングがわからなくて困っています。 「テーブルA」を元にした単純な帳票形式のフォームを作成し、そのフォームのレコードが1件更新(追加、変更)される度に、他のテーブルBの項目を更新する必要があり、VBでフォームのイベント「Form_AfterUpdate」に、テーブルBの更新内容を記述していますが、新規でレコードを入力しても、既存のレコードの変更を行っても、「Form_AfterUpdate」が実行されない様なのです。確認の為に、「Form_AfterUpdate」内にブレークポイントを設定していますが、ブレークする事も無く、テーブルBの更新もされていません。 ネット上で色々検索してみたのですが、結局見つけられずに、困っています。通常、レコードの変更時に、更新後処理が実行されない事ってあるのでしょうか?

  • フォームを開くときに、コンボボックスの値を選択(アクセスVBA)

    こんにちは。 アクセスVBAで、フォームを開いたとき (フォームのOpenイベント)に、 コンボボックスの値を選択したいのですが、 どういう方法が、あるでしょうか。 理想は、 フォームのOpenないし、Loadイベント内で、 コンボ0.ItemData(2).Selected と、書くような感じです。 (無論、Selectedは使えませんでした)。 よろしくお願いします。

  • ACCESSの値の代入に関して

    ACCESS2000を使用しています。 あるテキストコントロールに8桁のコードを入力します。 入力後、更新後のアクションで隣にあるコントロールに=left(8桁のコントロール,4)の 値を代入する仕組みを作成したのですが、この8桁に数字と文字(アルファベット)が 混在することがあり、数字のみの場合はなんなく代入できるのですが、文字が混在する 場合、エラーとなってしまいます。 代入するコントロールのデータ型は勿論テキスト型にしております。 このエラーの対処方をご存知の方がいらっしゃいましたらご教授お願いします。

  • Accessでレコードが更新された時に発生するイベント。

    こんにちは。 Accessでレコードが更新された時に発生するイベントを捜しています。 レコード項目に更新日付を付けました。 これに更新された日時をセットさせようと思っています。 各項目部分に記述するよりも、適当なイベントがあれば、 それを使いたいと思っています。 ご存知の方宜しくお願い致します。

  • このオブジェクトに値を代入することはできません

    Accessファイルを共有フォルダに入れ、複数のPCより使用しています。 (よくないのはわかっているのですが…) 「予定入力フォーム」というフォームよりデータを入力し、 次に「結果入力フォームから、予定入力したデータを引っ張りだしてきて、結果を入力しています。 テーブルは「マスタテーブル」ひとつです。 「結果入力フォーム」には「作成年月日」というテキストボックスがあり、「 結果入力フォーム」を読み込んだ時の処理に If IsNull(Me.作成年月日)=True Then  Me.作成年月日=Date Else End If という式を書き、 とりあえず「結果入力フォーム」を開いたときに今日の日付が自動で入るようにしています。 (Nullであった場合のみ自動で入るようにしています。 2回目以降に「結果入力フォーム」を開いたときは、前回開いたときの日付のままになるように。) ここで少し不具合が起きまして、1人でアクセスしている場合はよいのですが、 2人以上で「結果入力フォーム」にアクセスすると以下の様なエラーになります。 実行時エラー このオブジェクトに値を代入することはできません。 Me.作成年月日=Date の記述の部分が黄色くエラーになります。 違うレコードを引っ張っていてもなります。 テーブルの作成年月日のフィールドにすでにデータが入っている場合は、 2人以上でアクセスしても問題なく動作し、 その他の項目も普通に入力でき、テーブルへの更新も問題ないようです。 Me.作成年月日=Date ここがよくないのでしょうか? 2人以上でアクセスすると必ずこうなる、というわけでもないようで…。 1人が長い間、「結果入力フォーム」を開いた状態で放置していた場合、 次に別PCで結果入力フォームを開くとエラーになるような気がします。 テーブルを触ろうとすると、ロックされています、みたいな感じです。 そもそもAccessは共有に適していない、というお叱りはごもっともなのですが、 回避する記述等、方法があればお願い致します

専門家に質問してみよう