• ベストアンサー
  • 困ってます

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

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

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数2873
  • ありがとう数3

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

  • ベストアンサー
  • 回答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 にした状態のものの、変更イベントを取りたい・・・ 私にはチョッと理解できない部分になります。 ※ 他の方の回答を待ってください ※ 解釈違い等あれば、ごめんなさい。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • 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の違いはなんでしょうか・・

  • 数値型のテキストボックスを文字型に変えたい

    環境:XP&ACCESS2003 数値型のコントロールソースを持つテキストボックスがあります。このテキストボックスに、例えば「8+7」と入力するために、文字型に変換したいのですが。 *このコントロールソースの更新後処理に Me!テキスト0 = Eval(テキスト0) と記述しています。 数値型なので、「数値型の為入力できません」旨のエラーが出てしまいます。

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

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

その他の回答 (1)

  • 回答No.1

> 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

関連するQ&A

  • VBAのイベント発生時期について

    VBA初心者です。 コードの中で、トグルボタンのValueを変更しました。 Valueを変更するとClickイベントが発生しますが、コード実効時だとコードの途中で割り込んでイベントを実行した後、またコードに戻ってくるんでしょうか?それとも、プロシージャが終了して割り込むんでしょうか?それとも、パソコン内部の割り込みタイマーによってインターバルに割り込み処理を行なっているのでしょうか?MSGBOXなどを入れて色々調べてたのですが?テンで判りません。 デバッグモード(トレース)では、こちらの意図通り動くのですが?どうも、コードがスキップされているようで・・・? こんな質問方法で気持ちが通じますでしょうか? 宜しくお願いいたします。

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

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

  • VBA テキストボックスを選択状態にしたい

    Access2003 VBA で開発しています。初心者です。 テキストボックスに入力した値が、不正な値の場合、 次のオブジェクトに移動せずに、その値を選択状態にしたいのですが、 やり方が分かりません。 txtコード.SetFocus txtコード.SelStart = 0 txtコード.SelLength = Len(txtコード.Value) としてもうまくいきません。 初歩的な質問ですが、解決法をご教授いただければ幸いです。 よろしくお願いいたします。

  • テキストボックスの項目チェックをする場合どのイベントで?

    テキストボックスの入力内容が妥当か判断する場合はどのイベントで行いますか? 理想はチェックをしてエラーであれば、別のコントロールにフォーカスを移動させずに、現在のテキストボックスにフォーカスがある状態にしたいのです。 ACCESSのBeforeUpdateのようにキャンセルもでき、別のコントロールにフォーカスが移らずチェックするにはどのイベントでチェックすればよいですか?

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

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

  • TextChangeイベントが発生しない

    ASP.NETで開発を行っています。 クライアント側の処理はJavaScript、サーバー側の処理は VB.NETを使っています。 サーバー側であるテキストボックスに対してT extChangeイベントを発生させたいのですが、 クライアント側の処理で値を入力したときは、 イベントが発生しません。 サーバー側で値を変更したときは発生します。 具体的な手順は以下のとおりです。 Cookieから取得した値をテキストボックスにセット ↓ この時点でTextChangeイベントを発生させたいが、何も起こらない。 ↓ サーバー側の処理でそのテキストボックスの値を変更する。 ↓ この時点でTextChangeイベントが発生。 また画面上で直接値を入力したときはイベントが発生します。 クライアント側の処理でテキストボックスに入力した場合は、 サーバー側のイベントは発生しないのでしょうか。 この処理の中で値が入力された時点でイベントを発生させる にはどうしたらいいのでしょうか?

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

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

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

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

  • AccessVBA テキストボックスの内容を規定値

    AccessVBA テキストボックスの内容を規定値に設定したい 環境:Access2003 VBA WindowsXP sp3 テキストボックスに入力された値を、規定値として設定したいです。 テキストボックスは30個程度。 『任意』のテキストボックスのみ設定したいので関数の自作を考えています。 コマンドボタン『既定1』を押すと、右側の『テキストボックス1』の内容が既定として登録されるよう考えています。 イメージ ↓コマンドボタン    ↓テキストボックス [既定1]   [テキストボックス1         ] [既定2]   [テキストボックス2         ] [既定3]   [テキストボックス3         ] …… … VBAにて下記ソースを書いたのですが正常に動作しません。 自作関数にて、引数 textboxName へと "テキストボックス名"を代入しています。 プログラムを実行すると    『修飾詞が不正です』    textboxName.ForeColor = 255    ~~~~~~~~~~~ というエラーが出てしまいます。 この時の引数の中身は textboxName = "テキストボックス1"です textboxName.ForeColor を テキストボックス1.ForeColor として認識してくれないようです。 解決方法を教えてください ソースは以下の通り------------------------------------- Option Compare Database ------------------------------------------------------- Function textboxSetDefault(textboxName As String) 'テキストを赤に変更 textboxName.ForeColor = 255 '現在入力されている値をデフォルト値に設定 textboxName.DefaultValue = textboxName.Value End Function ------------------------------------------------------- Private Sub 既定1ボタン_Click() Call textboxSetDefault(テキストボックス1.Name) End Sub -------------------------------------------------------

  • Access VBA での Null と "" 

    以前組んだAccessVBA(ADPファイルにて使用)でのコードの中に、入力値のチェックとして -------------------------- Dim value as String If me!TextBoxA = "" then 'ここでテキスト未入力時の処理 Else   ’テキストが入力されているのでここで正常な処理 value = me!TextBoxA.value End If --------------------------- という記述をしていました。 今でしたら、これに加えてIsNullや他の仕組みを併用するのですが、 今まで上のものでも問題なく使えていました。つまり、  If me!TextBoxA = "" then  だけで、テキストボックスの未入力をきちんと検出していました。 ところが、最近新しいPCを導入したところ、  「Nullが不正です」 のメッセージが出るようになりました。 恐らくIf文で入力値の””が検出されず、Elseの部分で、Valueに代入しようとしたため、「Nullが不正」となったのだと思います。 本来はこちらの方が正しいと思うのですが、わからないのは今までなぜ Nullが不正とならなかったのか、です。 因みに、問題なく使えていたPCの組み合わせとしては、  ・XP(SP3) Office2010Pro(Access2010)   ・XP(SP3) Office2002Pro(Access2002) + AccessRuntime2007  ・XP(SP3) Officeなし + AccessRuntime2010  ・・・など、あらゆる組み合わせで10台ほど、問題なく動いていました。  (OSはすべて32Bit.エデイションはProやHomeなど混在) そして、問題となったPCは  ・XP(SP3)Pro Office2010Pro(Access2010) です。しかも、購入した直後は問題なかったものの、つい先日急にダメになったとの事でした。 何かきっかけとなった事はなかったか聞いてみましたが、心当たりはないとの事。 また、ネットワーク上にある同一ファイルをそれぞれのPCで個別に開いてみても、 やはり、Nullを検出するのは今回の新しいPCだけです。 何が原因なのかが気になって仕方ありません。 このような違いが起こる要因としてどのようなことが考えられるでしょうか。