- ベストアンサー
VBAテキストボックスのイベントについて
- VBAを使用してテキストボックスの値を変更する方法を教えてください。
- テキストボックスのイベントでコードをまとめたいですが、どのイベントを使用すれば良いですか?
- テキストボックスの値を変更した時に別のコードを動作させる方法をお教えください。
- みんなの回答 (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 にした状態のものの、変更イベントを取りたい・・・ 私にはチョッと理解できない部分になります。 ※ 他の方の回答を待ってください ※ 解釈違い等あれば、ごめんなさい。
その他の回答 (1)
- 30246kiku
- ベストアンサー率73% (370/504)
> Me![テキスト0].Value = "こんにちは" この Value に値を設定する方法では、イベントは発生しません。 Me![テキスト0].Text = "こんにちは" の様に Text に設定すると、変更時、更新前等のイベントが発生します。 ただし、Text に値を設定できる条件として、 ・そのテキストボックスにフォーカスがあること があります。 なので、 Me![テキスト0].SetFocus Me![テキスト0].Text = "こんにちは" のペアで・・・と覚えておいた方が良いかも・・・・
お礼
回答ありがとうございます。 SetFocusするためには、「使用可能」にしなければなりませんが、通常状態で触れさせないようにする良い方法はないでしょうか? 以下のような感じだとかえって長くなってしまうのですが。。。 Me![テキスト0].Enabled = True Me![テキスト0].Locked = False Me![テキスト0].SetFocus Me![テキスト0].Text = "こんにちは" Me![テキスト0].Enabled = False Me![テキスト0].Locked = True
お礼
ありがとうございます。 今回の質問は「いかにしてコードをまとめるか」というところが疑問でしたが、いろいろ考えたところ標準モジュールを使うことで自己解決しました。 結果としては、 【標準モジュール】 Public Sub Info(Sentence As String) Me![テキスト0].Value = Sentence 'その他複数同時にしたい処理を記載 End Sub 【テキスト0を変更させる記載】 Call Info("こんにちは") これで問題なく動作しました。 このアンサーでひらめきましたのでベストアンサーとします。