• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【Access】テキストボックスに入力後、そのテキストボックスを無効化する方法について)

【Access】テキストボックスを入力後に無効化する方法

このQ&Aのポイント
  • テキストボックスに入力後、入力内容がデータベースに存在した場合、テキストボックスを無効化する方法について説明します。
  • ソースコードを使用して実装する際に発生するエラーについても解説します。
  • 正しい方法をお教えしますので、参考にしてください。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

横レス失礼致します。 > 下記のソースで試してみた所、下記のエラーが表示され駄目でした。 更新前(BeforeUpdate)イベントは、フィールドやレコードの更新前に 発生するイベントで、そのイベント内で更新を完了させることはできません。 ですので、コントロールを移動させる(=フィールド(=コントロール)の更新を 確定させる)場合は、更新後(AfterUpdate)イベントで行う必要があります。 【更新前/更新後イベントの大雑把な使い分け】 更新前イベント:  イベントのキャンセルを可能にしたい場合に使用  (指定した条件が満たされない場合、Escキーなどで入力を取り消さない限り、  そのコントロール(またはそのレコード)からの移動を許可しない) 更新後イベント:  上記以外で、入力値に対する対応を行う場合に使用  (上述した通り、こちらではコントロールの移動やレコードの(強制)保存が   できます。また、値の代入(例えば値を削除(=Nullを入力)した場合に   強制的に代替値を入力するなど)も行えます)  なお、このイベントは、対応する更新前イベント(→同じコントロールの  更新前/後、フォームの更新前/後)でCancel=Trueにされた場合は  発生しません。 今回のように、フォーカスの移動などが必要になる場合は、  a)値のチェックのみを更新前イベントで行い、フォーカス移動などは更新後   イベントで実行、と分割して対応するか、  b)全てを更新後イベントで行う形にして、条件を満たさなかった場合は   更新前イベントの「Cancel=True」の代わりに、OldValueプロパティを   使用して、更新前の値に戻す(→コントロールの更新前イベントの場合)   ※コントロールソースがないコントロール(=非連結コントロール)では、    OldValueプロパティでは更新前の値は取得できません。    (変更後と同じ値が返されます) のどちらかを選択することになります。 以下は、全てを更新後イベントで対応した場合のサンプルです: Private Sub txt_ID_AfterUpdate()   Dim Record_Existence As Boolean   Record_Existence = True   If Record_Existence Then     '→If文での「= True」は省略可なので私は省略しています     Me.txt_Name.Enabled = True     Me.txt_Name.SetFocus     Me.txt_ID.Enabled = False   Else     'OldValueプロパティにより、直前の更新を行う前の値に戻します。     Me.txt_ID = Me.txt_ID.OldValue     '他のフィールドの編集は有効とした上で、「ID」のみ取り消す場合は、     'レコードを保存し直します。     '(レコード全体の編集を取り消す場合は、提示のコード(=Escキーの     ' 送信でもOkです)     DoCmd.RunCommand acCmdSaveRecord     'SendKeys "{Esc}"   End If End Sub

iroha_168
質問者

お礼

ご回答ありがとうございます。 ご提示いただいたソースで意図した動作が行われる事を確認しました。 また、更新前イベント、更新後イベントの解説をしていただき、ありがとうございます。 なお、よく考えたら「txt_ID」は下記の感じの動作でいいのかなと思ったので、 Else内のソースを変更させていただきました。 【動作】 1. 異常時は、入力欄を空白にして問題なさそうでした (入力エラーの内容はメッセージボックスでポップアップ表示するようにしました)。 2. 異常時は、txt_IDにフォーカスがとどまっていた方が良いと思いました。 【変更後のソース】 ' ------------------------------------------------------------------------------ Me.txt_ID = "" ' 一度適当な生きているコントロールにフォーカスを飛ばした後、フォーカスを戻す Me.preview.SetFocus Me.txt_ID.SetFocus ' ------------------------------------------------------------------------------ このたびはどうもありがとうございました。 以上、よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • tag1701
  • ベストアンサー率54% (67/123)
回答No.1

>コントロールがフォーカスを取得しているときは、コントロールを無効にすることはできません。」 これがネックであればif文のあとにフォーカスを移動させてから 無効化は駄目でしたか?

iroha_168
質問者

お礼

ご回答ありがとうございます。 下記のソースで試してみた所、下記のエラーが表示され駄目でした。 【エラー内容】 「実行時エラー '2108': "GoToControl/コントロールの移動"アクション、GoToControl メソッド、または SetFocus メソッドを実行する前に、フィールドを保存する必要があります。」 【ソースコード】 Private Sub Form_Open(Cancel As Integer) Me.txt_name.Enabled = False End Sub Private Sub txt_ID_BeforeUpdate(Cancel As Integer) Dim record_Existence As Boolean ' 本来はDBにアクセスして入力したIDが存在するかチェックしています。 record_Existence = True If record_Existence = True Then Me.txt_name.Enabled = True Me.txt_name.SetFocus Me.txt_ID.Enabled = False Else Cancel = True SendKeys "{Esc}" End If End Sub 動作としては、起動時はtxt_nameを無効化しておき、txt_IDの入力値が正常の場合、txt_nameを有効化した上で、txt_IDを無効化したいと思います。 以上、よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 【Access】コントロールのプロパティをまとめて設定する方法について

    ソース内で一つのコントロールに複数のプロパティを設定しており、 コントロールが複数あるため、関数内でコントロールのプロパティを設定したいと思いました。 よって、下記のようなソースを記述しましたが、 「NULLの使い方が不正です。」と表示されてしまいました。 【ソース】 Private Sub Form_Load() ' Me.txt_1.Enabled = False ' Me.txt_1.Locked = True SET_LOCK (Me.txt_1) SET_LOCK (Me.txt_2) End Sub Public Function SET_LOCK(CtrName As String) CtrName.Enabled = False CtrName.Locked = True End Function その為、上記のように、コントロール名を関数に渡し、 関数内でプロパティをまとめて設定する方法をご存知の方がいらっしゃいましたら、 ご教示いただければと思います。 よろしくお願いします。

  • 【Access】サブフォームの項目選択時、対応するコントロールの有効無効を制御する方法

    サブフォーム内にテーブル名tblのデータを帳票フォームで連結し、 サブフォーム内のチェックボックスをクリックすると、 対応するコンボボックスの有効無効を制御したい (ID=1のチェックボックスクリック時、ID=1のコンボボックスの有効無効を制御)と思いましたが、 どのチェックボックスをクリックしても、 ID=0~ID=2のすべてのコンボボックスが有効になったり、無効になったりしてしまいました。 【テーブル名:tbl】 ID, checkbox, combobox 0, false, A 1, true, B 2, false, C 【サブフォーム名のチェックボックスのクリックイベント】 Private Sub checkbox_Click() If Me.checkbox = True Then Me.combobox.Enabled = True Else Me.combobox.Enabled = False End If End Sub 何かしら添え字を渡す事ができれば、対応できるのではと思いましたが、 どのように記述すればよいか分かりませんでした。 その為、上記のような場合、個別で制御する方法をご存知の方がいらっしゃいましたら、 ご教示いただければと思います。 よろしくお願いします。

  • Accessにて、コントロールの編集可能、使用可能の設定

    Access2002を使用しています。 表形式で作成したフォームで、 Aというチェックボックスに、チェックが入っている場合  Bのコントロールは入力可能、  Cのコントロールは入力不可 チェックが入っていない場合、  Bのコントロールは入力不可、  Cのコントロールは入力可能 というふうにしたいのですが、 Private Sub A_AfterUpdate()   If A = -1 Then     B.Locked = False     B.Enabled = True     C.Locked = False     C.Enabled = False   Else     B.Locked = False     B.Enabled = False     C.Locked = False     C.Enabled = True   End If End Sub 上記のように設定すると、すべてのレコードに対しての設定になってしまいます。 1件ずつのレコードに対して、条件を設定するにはどのようにすればよいでしょうか? よろしくお願いいたします。

  • 【Excel VBA】ユーザーフォーム テキストボックスの有効・無効について

    Excel2003を使用しています。 ユーザーフォームにテキストボックスを11個とコマンドボタンを2個配置しています。 TextBox9に“0000”(文字列です)が入力されたら、TextBox10を有効に、それ以外は無効に設定したく、TextBox10のEnabledプロパティをFalse、LockedプロパティをTrueにして、コードを下記のように書いたのですが、うまくいきません。どこか、間違っているでしょうか? コードは該当部分だけ、載せています。よろしくお願いします。 -------------------------------------------------- If TextBox9.Text = "0000" Then TextBox10.Enabled = True TextBox10.Locked = False TextBox10.BackStyle = fmBackStyleOpaque Else TextBox10.Enabled = False TextBox10.Locked = True TextBox10.BackStyle = fmBackStyleTransparent End If

  • コントロールに触れたら使用可能にしたい

    通常は「使用可能」を「いいえ」にして、テキストボックスにカーソルが振れたら、使用可能を「はい」にしたいのですが Private Sub ID_Enter() Me.ActiveControl.Enabled = True End Sub Private Sub ID_GotFocus() Me.ActiveControl.Enabled = True End Sub Private Sub ID_LostFocus() Me.ActiveControl.Enabled = True End Sub Private Sub ID_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Me.ActiveControl.Enabled = True End Sub どれもクリックしないと動作しないようなのですが、このような場合、どのイベントを使えばいいのでしょうか?

  • アクセス 抽出条件が一致したらフォームを開く

    教えてください! フォームを「開くとき」イベントに、以下のコードを書きました。 Private Sub Form_Open(Cancel As Integer) Me!コマンド24.Enabled = False End Sub そのフォームの中には、以下のふたつ(a,b)と、コマントボタン「コマンド24」があります。 a:テキストボックス「当月の名前」『コントロールソースに、=DatePart("m",Date())を設定』 b:コンボボックス「月」『リスト値で、4,5,6,7,8,9を設定』月 そして、aとbの数値が一致した時に、検索ボタンを使用可能にする というコードを書きました。(というか、書いたつもりです) Private Sub 月_AfterUpdate() If (Me!当月の名前) = (Me!月) = True Then Me!24.Enabled = False Else Me!コマンド24.Enabled = True End If End Sub ですが、数値が一致しなくても、検索ボタンどうも、うまくいきませんでした。 このコードのどこが間違っているのでしょうか?

  • EXCEL VBA コンボボックス、テキストボックスが未入力のときメッセージを表示する方法

    ユーザーフォームにコンボボックス2個textboxが2個あります コンボは選択のみです。 コンボとtextbox1は入力必須にして、空欄でコマンドボタンが押された時はメッセージを表示したいです OKwebを参考に作ったのですが、コンボ1が空欄でもMsgが出ません 願いします Private Sub CommandButton1_Click() Dim ctrl As Control, tst1 As String, txt2 As String Dim ws As Worksheet Set ws = Sheets("sheet1") For Each ctrl In Me.Controls Select Case ctrl.Name Case "ComboBox1", "ComboBox2", "TextBox1" If Me.Controls(ctrl.Name).Value = "" Then txt1 = txt1 & ctrl.Name & vbLf Else txt2 = txt2 & Me.Controls(ctrl.Name).Value & vbLf End If End Select Next If Len(txt1) > 0 Then MsgBox "以下の値を入力してください" & vbLf & txt1, vbExclamation Exit Sub Else ret = MsgBox("以下の値を入力します" & vbLf & txt2, vbOKCancel) If ret <> vbOK Then Exit Sub

  • コンボボックスの変更に応じてテキストボックスの有効を切り替える(ExcelVBA2007)

    お世話になります。 Excel VBA 2007で質問です。 今、  Label1 ComboBox1 TextBox1  Label2 ComboBox2 TextBox2 ・・・  Label100 ComboBox100 TextBox100 のようなフォームがあるとします。 ComboBox1~100は「Any」「is」「is not」のいずれかの値が取れ、初期値はAnyとします。 TextBox の Enabled プロパティの初期値は False とします。 やりたいことは、 ComboBox が「Any」でない場合(is または is not のいずれかの場合)にのみその右隣の TextBox の Enabled プロパティを True にしたいのです。 いま、ComboBox30 を Any から is に切り替えたとします。 すると、TextBox30.Enabled を False から True にしたいのです。 ここで、ComboBox30 を is から is not に切り替えたとします。 TextBox30.Enabled は True のままです。 ここで、ComboBox30 を is not から Any に切り替えたとします。 すると、TextBox30.Enabled を True から False にしたいのです。 ComboBox のイベントハンドラで Sub ComboBox30_Change ()  If ComboBox30.Value = "Any" Then   TextBox30.Enabled = "False"  Else   TextBox30.Enabled = "True"  End If End Sub のように書けばいいことは分かっているのですが、その場合は数字だけ変えたイベントハンドラを100個書かなければなりません。 このイベントハンドラを1個にすることはできるでしょうか。 (コンボボックス100個のうちどれかが変更されたら、変更されたコンボボックスの番号を知りながら呼び出されるハンドラ) 次善の策として、 Sub ComboBox30_Change ()  userSubroutine End Sub のように書くこともできるかと思いますが、この場合、どのコンボボックスが変更されたか(どのイベントハンドラが起動されたか)を知って、userSubroutine に渡さなければなりません。 よろしくお願いします!

  • リストボックスからの入力をテキストに貼付

    下記コードではリストボックあ行選択しテキスト1~6に入力後、クリアボタンで消去したあと、か行選択しテキストに入力したら7~貼付けになるクリアボタンで消去後、改めてテキスト1~入力するコードがありますか。どなたか解る方よろしくお願いします。 Private Sub 実行_Click() Static cnt As Integer Dim i As Integer If Listbox.ListIndex = -1 Then Exit Sub For i = 0 To Listbox.ListCount - 1 If Listbox.Selected(i) Then cnt = cnt + 1 If cnt > 10 Then cnt = 1 Me.Controls("TextBox" & cnt).Text = Listbox.List(i) End If Next End Sub Private Sub クリア_Click() Dim tbCont As Control With Me.MultiPage1 For Each tbCont In .Pages(.Value).Controls If TypeName(tbCont) = "TextBox" Then tbCont.Value = Null End If Next tbCont End With End Sub

  • Accessのレポートでデータがなくても罫線だけ表示させたい

    Win2000,Access2000を使用しています。 Microsoftのホームページで「[AC97] レコードがない場合も用紙の最後まで罫線を出力する方法」を応用して以下のVBを作成しました。 ですが、9行目までデータを入力すると9行目と10行目の両方の行に9行目のデータが表示されます。 8行目まででしたら、9、10行目は空白で罫線(直線)が表示されます。 どなたか解決法をご存知でしたらお教え下さい。 Option Compare Database  Dim A As Integer '-------今何行目なのかをカウントする為の変数  Dim B As Integer '-------今回印刷する予定のレコード件数を入れて                  おく変数 ---------------------------------------------------- Private Sub レポートヘッダー_Format(Cancel As Integer, FormatCount As Integer)   A = 0   B = DCount("ID", "Q05商品リスト")   Me!改ページ3.Visible = False End Sub ---------------------------------------------------- Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)  A = A + 1  If A Mod 10 = 0 Then    Me!改ページ3.Visible = True  Else    Me!改ページ3.Visible = False    If A < B Then      Me.NextRecord = True      Me!商品名.Visible = True      Me!メーカー名.Visible = True    ElseIf A = B Then      Me.NextRecord = False      Me!商品名.Visible = True      Me!メーカー名.Visible = True    Else      Me.NextRecord = False      Me!商品名.Visible = False      Me!メーカー名.Visible = False    End If   End If End Sub

このQ&Aのポイント
  • 工業グリスの中でも特に優れた性能を持つラスベネグリスは、どのような用途に使用されるのか気になるところです。
  • ラスベネグリスは、機械部品の摩擦を軽減するために用いられるグリスの一種です。
  • その特殊な成分と高い耐久性から、高負荷や高温環境での使用に適しています。
回答を見る

専門家に質問してみよう