VBAテキストボックスのイベントについて

このQ&Aのポイント
  • VBAを使用してテキストボックスの値を変更する方法を教えてください。
  • テキストボックスのイベントでコードをまとめたいですが、どのイベントを使用すれば良いですか?
  • テキストボックスの値を変更した時に別のコードを動作させる方法をお教えください。
回答を見る
  • ベストアンサー

VBA テキストボックスのイベントについて

Microsoft ACCESS 2010を使用しています。 「テキスト0」という名前のテキストボックスがあり、 Me![テキスト0].Value = "こんにちは" というコードでテキストボックスの文字を変更します。 この時、テキストボックスの値が変更されたという条件でまた別のコードを動作させたいのですが、テキストボックスのイベントである、「更新前処理」「更新後処理」「ダーティー時」「変更時」では、動作しませんでした。 テキストボックスの値を変更する段階で別のコードを入力すれば対応は可能なのですが、「テキストボックスの値を変更した時」のタイミングで別コードを動作させることで、コードをまとめたいと考えています。 これに対して良い方法はありますか?よろしくお願いします。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

#1です > 通常状態で触れさせないようにする良い方法はないでしょうか? VBA は大丈夫だったでしょうか。 考え方をちょっと変えてみます。 テキストボックス「テキスト0」をいじらせたくないので、Enabled / Locked で制御している。 ↓ テキストボックス「テキスト0」の Enter で異なるコントロールに Focus を移動する。 例えば、テキストボックス「テキスト0」の フォーカス取得時に以下を記述しておきます。 Private Sub テキスト0_Enter()   Me.テキスト1.SetFocus End Sub この場合、「テキスト0」にフォーカスが入ろうとした場合、「テキスト1」に無条件で移動させます。 意味合い的に、「テキスト0」にはフォーカスが入らないので修正等できません。 では、テキスト0.Text にどうやって値を設定し、イベントを発生させるかですが・・・・ 一旦、「テキスト0」の フォーカス取得時を無効にしてから設定して、終わったら戻します。 Dim ctl As Control Dim sS As String Set ctl = Me.ActiveControl sS = Me.テキスト0.OnEnter Me.テキスト0.OnEnter = "" Me.テキスト0.SetFocus Me.テキスト0.Text = "こんにちは" ctl.Setfocus Me.テキスト0.OnEnter = sS 今の アクティブコントロールを覚えておいて、 フォーカス取得時を無効にして、 "こんにちは" を設定して フォーカスを元のところに戻して、 フォーカス取得時を有効にして・・・・ お礼にあった記述と変わらないですかね・・・・(上記コードは未検証) また、違う方法と言えば、手間でも自分で呼び出す・・・・ 設定後、「テキスト0」の更新後処理を動かしたい場合、 Me.テキスト0.Value = "こんにちは" Call テキスト0_AfterUpdate とすれば、同じことになると思います。 ※ フォーカスがあるうちに、Enabled = False はエラーになったような・・・・ ※ ご質問の内容をもう一度読み直してみました。 > テキストボックスの値を変更する段階で別のコードを入力すれば対応は可能なのですが、「テキストボックスの値を変更した時」のタイミングで別コードを動作させることで、コードをまとめたいと考えています。 という事ですが、アクセスで用意されているイベント(フォームに関して)は、操作する人がいること・・・ が、主だと思います。 VBA とかで値を設定する・・・・操作の範疇じゃないので自分で面倒をみることになると思います。 上記での SetFocus しないとイベントが発生しない・・・・操作していればあたり前のことなので・・・ Enabled = False / Locked = True にした状態のものの、変更イベントを取りたい・・・ 私にはチョッと理解できない部分になります。 ※ 他の方の回答を待ってください ※ 解釈違い等あれば、ごめんなさい。

weeeeeeeeeek
質問者

お礼

ありがとうございます。 今回の質問は「いかにしてコードをまとめるか」というところが疑問でしたが、いろいろ考えたところ標準モジュールを使うことで自己解決しました。 結果としては、 【標準モジュール】 Public Sub Info(Sentence As String) Me![テキスト0].Value = Sentence 'その他複数同時にしたい処理を記載 End Sub 【テキスト0を変更させる記載】 Call Info("こんにちは") これで問題なく動作しました。 このアンサーでひらめきましたのでベストアンサーとします。

その他の回答 (1)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

> Me![テキスト0].Value = "こんにちは" この Value に値を設定する方法では、イベントは発生しません。 Me![テキスト0].Text = "こんにちは" の様に Text に設定すると、変更時、更新前等のイベントが発生します。 ただし、Text に値を設定できる条件として、 ・そのテキストボックスにフォーカスがあること があります。 なので、 Me![テキスト0].SetFocus Me![テキスト0].Text = "こんにちは" のペアで・・・と覚えておいた方が良いかも・・・・

weeeeeeeeeek
質問者

お礼

回答ありがとうございます。 SetFocusするためには、「使用可能」にしなければなりませんが、通常状態で触れさせないようにする良い方法はないでしょうか? 以下のような感じだとかえって長くなってしまうのですが。。。 Me![テキスト0].Enabled = True Me![テキスト0].Locked = False Me![テキスト0].SetFocus Me![テキスト0].Text = "こんにちは" Me![テキスト0].Enabled = False Me![テキスト0].Locked = True

関連するQ&A

  • ACCESSのコンボボックスについて

    ACCESSのコンボボックスに「012/015/028/125」等が設定されているて、 コンボボックスのプロパティの「入力チェック」は「はい」の設定になっております。 そういった場合、「12」と入力した場合、「012」とすることは可能でしょうか? テキストボックスの場合には、そのテキストボックスの更新後処理で Me.コード = Format(Me.コード, "000") のように記述し変更していたのですが・・・。 コンボボックスでは、「指定した値はリストにありません」と表示され、更新後処理がが実行されません。

  • テキストボックスに値を入力し終わったらイベントを発

    エクセル2007を使用しています。 アクセスで言う「更新後処理」のAfterUpdateイベントは エクセルのActiveXコントロールのテキストボックスイベントにはないのでしょうか? 例えば、テキストボックスに「aiu」と入力し終わったらイベントを発生させたいのですが、 Private Sub TextBox1_Change() MsgBox "" End Sub にしすると 「a」を入力した時点で、MsgBox が表示されてしまいます。 テキストボックスに値を入力し終わったらイベントを発生させる方法はありますか? VBE画面でシートイベントを見ても AfterUpdateイベントは見当たりません。 ご回答よろしくお願いします。

  • access2000 vba の テキストイベント取得

    access2000 vbaで、プログラムを組んでいます。 画面にテキストボックス1と、表(あるテーブルの内容をあらわしているもの)があります。 [初心者でこの表のうまい言い方がよくわかりません・・] テキストボックス1は、プロパティの、データ/コントロールソースが、あるテーブルのコードになっています。 このテキストボックス1は表のレコードを選択することにより、内容が変わります。(選択したレコードの、コード値になります。) ここで、テキストボックス1の値が変化したときに、イベントを発生したいのですが、なかなかできません。 change,afterupdateではだめでした。 うまくつたわらないかもしれませんが、手入力以外による値の変化は、テキストボックスイベント検知はできないものでしょうか。

  • フォームのテキストボックス内の改行について

    セルが繰返し処理で選択させるのですが。 その選択されるセルをいちいち、フォーム内のテキストボックスに表示されるようにしたいのですが。 普通の改行は VbCrLf でおこなうのはわかるのですが、それぞれ、記述するコードが別になっていて、各文字列は変数に入っているのですが。 こういうときはどうすればいいのでしょうか。 ↓ ↓ 例 繰り返す処理の中で、テキストブックにかかるイベントはひたすら書き込みです。 フォーム1.text = Range("苗字").Value      処理 フォーム1.text = Range("苗字").Value       処理  フォーム1.text = Range("苗字").Value 上のを改行させてテキストボックスに並べたいのです。 例:  田中 佐藤 鈴木 ・  というように。 どなたかご教授お願い致します。

  • Access VBAボタンでテキストボックスを入力

    access2010を使用しております。 フォームでボタンをクリックしたときに、テキストボックスを書換える コードを作りたいのですが、 Private Sub コマンド111_Click() ME!テキストボックス.value= "あああ" End Sub としても、テキストボックスは書き換わりません。 でも、ボタンをクリックした後にそのテキストボックスをクリックすると ちゃんと「あああ」と入力されています。 つまり、ボタンをクリックしても入力はされても表示がされず、 ただ、テキストボックスをクリックすると「あああ」と表示されると言った具合です。 また、テキストボックスをクリックする以外にも 違うレコードに移動してもとのレコードに戻ってもおなじように 表示されます。 これを押した時に表示を変更させるには どのようにすればよろしいでしょうか?

  • テキストボックスの値変更時のイベント

    フォーム上のテキストボックスに、前の画面で入力したデフォルト値が表示されている状態で、テキストボックスの値を変更したらJavaScriptの関数でチェックさせたいと考えているのですがうまくいきません。 onChangeイベントは値を変更(例えば削除するなど)して、Enterキーを押すなりフォーカスを移すなりしないとイベントが発生しないので、変更されたら即座にチェックということができません 何かうまい方法はないでしょうか?

  • エクセルVBAのテキストボック、Exitイベント

    エクセルのVBAで簡単なデータ登録のマクロを作成しています。 フォームのテキストボックスに入力した値を、エクセルシートに展開する程度の機能です。 製品コードを必須にしており、製品コードが入っていない時はエラーメッセージを表示します。 製品コードが入力されていないときは、製品コードのテキストボックスにフォーカスがあたったままにしたく、ネットで調べてExitイベントに以下の処理を作成しました。 Private Sub mySeiCD_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim myMsgBoxValue As String If Len(mySeiCD.Value) = 0 Then myMsgBoxValue = MsgBox("製品コードは入力必須です。" ,vbOKOnly, "製品コード未入力") Cancel = True End If End Sub 製品コード未入力の際にフォーカスはそのままになりましたが、フォームを閉じることができなくなりました。 閉じるボタンを押しても、Exitイベントにひっかかてしまいます。 当然の動きと思いますが、回避する方法はありませんでしょうか? Exitイベントを使わずに、SetFocus を使った場合は、どうしても、次のテキストボックスにフォーカスが移動してしまいました。 以上、長くなりましたが、よろしくお願い致します。

  • Access2000のVBAのイベントプロシージャについて

    以前から疑問に思っていましたが、イベントプロシージャの「更新前」と「更新後」と 「変更時」の意味、というかタイミングがよくわかりません。例えばコンボボックスの 「更新前」とは、具体的にはどういうときなのでしょうか。コンボの値を更新する前と いうのなら、何もいじってない状態という意味に取れるのですが、何もいじってないなら イベントは発生していないと思うのですが。また、コンボボックスの「更新後」は、 値が変わったときだと思うのですが(例えば「北海道」が選択されているコンボの値を 「東京都」に変えたときなど)、「更新後」と「変更時」はどう違うのですか? どうぞよろしくご教授ください。

  • テキストボックスがなくなる!?

    更新前処理のイベントプロシージャで、入力すればテキストボックス表示・未入力ならばテキストボックス非表示に設定しました。そのときはうまくいくのですが、いったんフォームを閉じて新たに開けると、入力しているのに元のテキストボックスしか表示されていなくて、でも、レコードのデータは消えてないのです。このほかに設定しないとだめなんですか?

  • Excelシート内セル記述の違いについて・VBA

    ワークシート内コードの記述で、 シート上のテキストボックスの値を変えています。 テキストボックスのChangeイベントで動かしていますが、起動した際や、他シートからテキストボックスのvalueを変えたりしています。 1.テキスト1.value = activesheet.range("a1") 2.テキスト1.value = me.range("a1") 3.テキスト1.value = range("a1") 3にすると上手く動かない場合があるので現在は2で記述しています。 1~3の違いはなんでしょうか・・