• 締切済み

Accessの更新後処理で特定の条件を満たしている場合、フォーカスを移動させない方法

テキストボックスの更新後処理で下記のような記述をし、 テキストボックスに1が入力された場合、エラーメッセージを表示した上で、 フォーカスを一度ボタンに移動した後、テキストボックスに移動しております。 SetFocusを二回記述している理由ですが、 フォーカス移動を抑止する為に、Me.テキストボックス.SetFocus のみを記述した所、次の場所にフォーカスが移動してしまい、 下記のように書くと元の場所にフォーカスが戻ってくる為です。 フォーカス喪失時(Exit)の場合、Cancelを使用すればフォーカスの移動を抑止できたのですが、 更新後処理(AfterUpdate)でSetFocusを2回書く以外に フォーカスを移動させない方法をご存知の方がいらっしゃいましたら アドバイスいただければと思います。 ★クラスモジュール Private Sub テキストボックス_AfterUpdate() Call CHECK_TEXT(Me, Me.テキストボックス.Value) End Sub ★標準モジュール Function CHECK_TEXT(MeForm As Form, text As String) If text = 1 Then MsgBox "エラー" MeForm.ボタン.SetFocus MeForm.テキストボックス.SetFocus End If End Function 以上、よろしくお願いします。

みんなの回答

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.3

テキストボックスが連結コントロールという条件つきですが。 Private Sub テキストボックス_BeforeUpdate(Cancel As Integer)   Cancel = CHECK_TEXT(Me.テキストボックス) End Sub Function CHECK_TEXT(ctl As Control) As Boolean   If ctl = 1 Then     MsgBox "エラー"     ctl.Undo     CHECK_TEXT = True   End If End Function 好みの問題もありますが、 自分は、各コントロールではチェックせず 最後にまとめてチェックするようにしています。 ユーザーさんが、テキストボックスで 身動き出来なくなる自体が起こることを避けるためです。

iroha_168
質問者

お礼

ありがとうございます。 今回作っているものは非連結の為そのまま使うことは出来なさそうですが、今後の参考にさせていただきます。 また最後にまとめてチェックするという組み方についても今後検討させていただこうと思います。 今回はとりあえず現状どおりSetFocus2回で回避する事にいたします。 どうもありがとうございました。

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.2

「更新後処理」で と限定されると他に方法は無いと思いますが、 通常、このようなチェック処理は、「更新前処理」で行います。 Private Sub テキストボックス_BeforeUpdate(Cancel As Integer)   Cancel = CHECK_TEXT(Me.テキストボックス.Text) End Sub Function CHECK_TEXT(txt As String) As Boolean   If txt = 1 Then     MsgBox "エラー"     CHECK_TEXT = True   End If End Function

iroha_168
質問者

お礼

ありがとうございます。 更新後処理で記述している理由ですが、エラーの場合入力値を初期化したいと思っているためです。 更新前で記述するとなると下記のような感じになると思いますが、 「"BeforeUpdate/更新前処理"プロパティまたは このフィールドの"ValidationRule/入力規則"プロパティに設定したマクロまたは関数のために、 このフィールドのデータを保存できません。」 といわれてしまいました。 Private Sub テキストボックス_BeforeUpdate(Cancel As Integer) Cancel = CHECK_TEXT(Me.テキストボックス.text) If Cancel = True Then Me.テキストボックス = "" End If End Sub Function CHECK_TEXT(txt As String) As Boolean If txt = 1 Then MsgBox "エラー" CHECK_TEXT = True End If End Function なお更新後であれば、エラーの場合入力値を初期化できました。 Private Sub テキストボックス_AfterUpdate() Call CHECK_TEXT(Me, Me.テキストボックス.Value) End Sub Function CHECK_TEXT(MeForm As Form, text As String) If text = 1 Then MsgBox "エラー" MeForm.ボタン.SetFocus MeForm.テキストボックス.SetFocus MeForm.テキストボックス = "" End If End Function ただSetFocusを2回書くのはやっぱり変かなという気がするので、 更新前でチェックをしつつ、入力欄を初期化できれば良いのですが。 以上、よろしくお願いします。

noname#79209
noname#79209
回答No.1

そのテキストボックスの「タブストップ」を「いいえ」に設定してもダメですか? フォーカスの移動は、当然VBAで行うことになりますが....

iroha_168
質問者

お礼

ありがとうございます。 私が試してみた限りでは、駄目でした。 エラーメッセージが表示された後、次のテキストボックスに移動してしまいます。 ソースは下記となります。 ・テキスト0でTABを押下すると、更新後処理で入力チェックを行うテキストボックスに移動するようにソースで記述しています。 ・エラーメッセージ表示時はそのまま現在の位置にとどまってほしいのですが、 下記のソースでは質問時のソースから二つのSetFocusを削除している為、 次のテキストボックスに移動してしまいます。 ★クラスモジュール Private Sub テキスト0_Exit(Cancel As Integer) Me.テキストボックス.SetFocus End Sub Private Sub テキストボックス_AfterUpdate() Call CHECK_TEXT(Me.テキストボックス.Value) End Sub ★標準モジュール Function CHECK_TEXT(text As String) If text = 1 Then MsgBox "エラー" End If End Function 以上、よろしくお願いします。

関連するQ&A

  • テキストボックス入力後、警告メッセージを表示し、フォーカスを移動させない方法について

    テキストボックスの入力チェックを行うために下記のようなソースを記述しました。 下記を実行するとテキストボックスにどんな文字を入力してもメッセージボックスを表示し、 フォーカスが移動しない形となっております (厳密にはボタンにフォーカスが移動した後、テキストボックスにフォーカスを移動しています)。 これは Me.テキストボックス.SetFocus のみを記述した所、次の場所にフォーカスが移動してしまい、 下記のように書くとフォーカスが移動していないように見えるため、このようにしました。 ただこの記述はいささか強引な感じなので、これを改良したいと思っております。 2回フォーカスを移動させるのではなく、フォーカス移動を抑止する方法がベストと思いますが、 方法が分からなかったので、何かしらアドバイスをいただけれる方がいらっしゃいましたらよろしくお願いします。 【ソース】 Private Sub テキストボックス_AfterUpdate() MsgBox "エラー" Me.ボタン.SetFocus Me.テキストボックス.SetFocus End Sub 以上、よろしくお願いします。

  • ACCESSで重複チェック後にフォーカスを移動したい

    Private Sub 会社名_AfterUpdate() ACCESS2003です。 フォーム上で入力後(更新後処理)に重複チェックをしています。 重複したときにエラーメッセージを出してフォーカスさせたいのです。 エラーメッセージまでは上手くいくのですが、フォーカスが移動してくれません。 どこが悪いのでしょうか? Private Sub 会社名_AfterUpdate() Dim i As Integer i = DCount("*", "tbl取引先", "会社名 ='" & Me.会社名 & "'") If i = 1 Then MsgBox [会社名] & " は登録済みです。" Me![会社名].SetFocus Cancel = True End If End Sub よろしくお願いします

  • テキストボックスの桁数をカウントして、フォーカス移動

    Win2000、VB6.0です。 テキストボックスとADOコントロールを使用して、レコードを編集・更新するフォームを作っています。 ただ、簡単に書く為に下の説明文ではDBについては書きません。 Form1に、Text1とText2があるとします。 Tab移動だけではなく、Text1に4桁目まで入力された時点で、Text2へフォーカスが移動するようにしたいと考えています。 Text1のChangeイベントで、 ------------------------------------ Private Sub Text1_Change()   If Len(Text1.Text) >= 4 Then     Text2.SetFocus   End If End Sub ------------------------------------ 以上のように記述しています。 ただ、Form1のロード時に、 ------------------------------------ Private Sub Form_Load()   Text1.Text = "1111" End Sub ------------------------------------ 以上のように記述すると、 「実行時エラー"5";」 「プロシージャの呼び出し、または引数が不正です。」 とエラーが発生してしまいます。 ロード時にテキストボックスに表示しつつ、入力された現在の桁数をカウントして、フォーカス移動する方法は無いのでしょうか? よろしくお願いします。

  • Access2010 SetFocusが当たらない

    Access2010です。 VBAにて、あるフォームの、デザイン上、「詳細」の中に存在しているテキストボックスにSetFocusでフォーカスを当てようと思ってます。 1 フォームロード時、フォームの「詳細」は非表示(当然、テキストボックスも非表示) 2 ボタンクリック時、フォームの「詳細」を表示し、テキストボックスにフォーカスを当てる という動作をしているのですが、2でテキストボックスにフォーカスがフォーカスが当たりません。どうしたらフォーカスが当たるのでしょうか? 以下、コードです。 Private Sub Form_Open(Cancel As Integer) Me.詳細.Visible = False End Sub Private Sub cmdボタン_Click() Me.詳細.Visible = True 'テキストボックスにフォーカスを当てる Me.txtテキスト.SetFocus End Sub よろしくお願いいたします。

  • どこにもフォーカスを当てたくない

    フォームを開いたとき、どこにもフォーカスを当てたくないです。 アクセス2003です。 フォームにテキストボックスを1つ設置して、そのフォームを開くと フォーカスがテキストボックス上で、点滅しますが どこにもフォーカスを当てない方法あるのでしょうか? Private Sub Form_Open(Cancel As Integer) Me.詳細.SetFocus End Sub とするとコンパイルエラーになってしまいます。 不可能でしょうか?よろしくお願い致します。

  • アクセスのコントロールの移動について教えてください

    Win2000、アクセス2000を使用しています。 日付を入力するテキストボックスの更新後処理に以下のVBを組みました。 Private Sub 発送日_AfterUpdate() If Me![発送日] < Me![受注日] Then MsgBox "受注日より前の日付を入力しています。" & vbNewLine & "訂正してください。", _ vbOKOnly + vbExclamation, "発送日" End If Me!発送日.SetFocus End Sub ところが、[発送日]のテキストボックスではなく、次のテキストボックスにカーソルが行ってしまいます。 ちなみに[発送日][受注日]ともプロパティで「g ee\.mm\.dd」という書式を設定しています。 書式の設定とは関係ないと思いますが… よろしくお願いします。

  • フォーカス移動抑止について

    お世話になっております。 ブラウザの画面項目(テキストボックス等)間でフォーカスを移動する場合、移動元でonblur、移動先でonfocusが発生しますが、移動元のonblurで、特定の条件の場合だけフォーカス移動を抑止し、移動先onfocusを発生させないようにしたいのですが、何か方法はないでしょうか? 【環境】 ・IE6 【現在うまくいっていない方法】 現在、フォーカス移動を抑止するため、移動元のonblur内の処理で、「event.srcElement.focus()」を実行してますが、移動先のonfocus()も走ってしまう。(2回フォーカス移動することで元の画面項目にフォーカスが戻る) 【補足】 ・問題になっているのは、画面項目のonblur、onfocusで入力値のチェックや他画面項目との連動、色変更、エラーメッセージ表示等を行っておりonblurやonfocusが何度も走ってしまうと想定外の動きをしてしまいます。(場合によってはフォーカス移動の無限ループ) ・グローバル変数を屈指すれば想定外の動きをしないようにすることはできるかと思いますが、それ以外の方法で制御したい。 【現在うまくいっていない方法の動作確認用のとりあえず作ったサンプルプログラム】 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>フォーカス遷移抑止検証</title> <script type="text/javascript"> var iEventCount = 0; function onElemBlur() { if (++iEventCount > 10) return true;// 無限ループ抑止用 debug("blur : " + event.srcElement.value); event.srcElement.focus(); } function onElemFocus() { if (++iEventCount > 10) return true;// 無限ループ抑止用 debug("focus : " + event.srcElement.value); } function debug(msg) { var obElem = document.getElementById("debugmsg"); obElem.innerHTML += msg + "<br/>"; } </script> </head> <body> <input type="text" value="hoge1" onblur="onElemBlur()" onfocus="onElemFocus()" /> <br/> <input type="text" value="hoge2" onblur="onElemBlur()" onfocus="onElemFocus()" /> <br/> <br/> <br/> <span id="debugmsg" rows="10" cols="50" ></span> <br/> </body> </html> 長々と申し訳ありません。 よろしくお願いいたします。

  • TabIndexを使わないで、フォーカスの移動

    ご多忙中大変申し訳ありません。 VBの初心者です。 TabIndexを使わないで、コントロールの名前の番号でフォーカスの移動をしたいのですが、私のレベルでは全くできません。 TextBox1、TextBox2、TextBox3、TextBox3、~TextBox15 のようにTextBoxの後ろに付いている、数字を利用してフォーカスの移動をしたいと思っております。 実装前に下記のようなコードを書いてテストしていますが、どこを調べても、また試行錯誤を繰り返してもできません。 Public Class Form1 'テスト Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Me.KeyPreview = True '1列目TextBoxの生成 Dim i As Integer For i = 0 To 4 Dim txtbx As New TextBox txtbx.Size = New Size(105, 30) txtbx.Location = New Point(50, 50 + i * 40) txtbx.Font = New Font("MSゴシック", 12, FontStyle.Regular) txtbx.TabIndex = i * 3 txtbx.Text = "TabIndexは" & CStr(i * 3) txtbx.Name = "TextBox" & CStr(i + 1) Me.Controls.Add(txtbx) Next '2列目TextBoxの生成 For i = 0 To 4 Dim txtbx As New TextBox txtbx.Size = New Size(105, 30) txtbx.Location = New Point(160, 50 + i * 40) txtbx.Font = New Font("MSゴシック", 12, FontStyle.Regular) txtbx.TabIndex = i * 3 + 1 txtbx.Text = "TabIndexは" & CStr(i * 3 + 1) txtbx.Name = "TextBox" & CStr(i + 6) Me.Controls.Add(txtbx) Next '3列目TextBoxの生成 For i = 0 To 4 Dim txtbx As New TextBox txtbx.Size = New Size(105, 30) txtbx.Location = New Point(270, 50 + i * 40) txtbx.Font = New Font("MSゴシック", 12, FontStyle.Regular) txtbx.TabIndex = i * 3 + 2 txtbx.Text = "TabIndexは" & CStr(i * 3 + 2) txtbx.Name = "TextBox" & CStr(i + 11) Me.Controls.Add(txtbx) Next End Sub Private Sub Form1_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown If e.KeyCode = Keys.Right Then '→キーによるフォーカスの移動 Me.SelectNextControl(ActiveControl, True, True, True, False) e.Handled = True ElseIf e.KeyCode = Keys.Left Then '←キーによるフォーカスの移動 Me.SelectNextControl(ActiveControl, False, True, True, False) e.Handled = True End If '↓(Down)キーによるフォーカスの移動  ここができません。 If e.KeyCode = Keys.Down Then Dim txtboxname As String txtboxname = Me.ActiveControl.Name 'TextBoxの名前の名前の取得 Dim txtbxnum As String txtbxnum = txtboxname.Remove(0, 7) 'TextBox~の名前から、~(数字)だけにする。 Dim controlName As String controlName = "TextBox" & CStr((CInt(txtbxnum) + 1)) 'TextBox~の名前の~に1を足す。 Me.Controls(controlName).Select() 'TextBox~+1のTextBoxをフォーカス 'Select() Focus()も結果は同じです。 End If '↑(Down)キーによるフォーカスの移動 'この部分は、↓(Down)キーによるフォーカスの移動が出来るようになりましたら、追加します End Sub ' Enterキーによるフォーカスの移動 Private Sub Form1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress If e.KeyChar = Chr(Keys.Enter) Then Me.SelectNextControl(ActiveControl, True, True, True, True) e.Handled = True End If End Sub End Class 最終的な目的の動作は、EnterキーではTabIndexの順番にフォーカスの移動。 ←キーでは、左にフォーカスの移動。 →キーでは、右にフォーカスの移動。 ↑キーでは、上にフォーカスの移動。 ↓キーでは、下にフォーカスの移動。 コントロールの名前の番号でフォーカスの移動をしたい理由は、 Enterキーと←、→キーによるフォーカスの移動でTabIndexの順番を使い、上下方向、↑キー、↓キー移動には、TabIndexの順番が画像のように少々複雑になってしまい、TabIndexを使用してのフォーカスの移動は断念しました。 もし、TabIndexでフォーカスの移動が出来るようなら、そちらのほうでもかまいません。 使用バージョンは、VB2010 Express Edition です。 ご迷惑を、おかけしますが、どうかご助力をお願いいたします。

  • Excel VBAでフォーカスを移動しない方法

    Excel VBA リストのソースを設定してあるコンボボックスから次のコンボボックスに移動する際、入力にエラーあれば フォーカスを移動しないようにするコードはどのようにすればいいのですか? 現在は Private Sub [コンボボックス名1]_Exit(ByVal Cancel As MSForms.ReturnBoolean) If [コンボボックス名2] = "" Then MsgBox "値が不正です。", vbInformation, "フォーム名" End If End Sub としています。

  • ASP.NET 動的コントロールのフォーカス移動

    ASP.NET(VB)で開発しています。 Page_init時に生成されるテキストボックス1、2(動的コントロール)を表示します。 テキストボックス1のテキストチェンジイベント時に テキストボックス2にフォーカスが移動するようにしたいです。 テキストチェンジでPostBackが発生し、サーバ側でテキストボックス2.Focus() と記述しているのですが、動作は、テキストボックス2に フォーカスが移らず、画面上のどこにもフォーカスがあたっていない状態になってしまいます。 動的コントロールへ、PostBack時にフォーカス移動させるにはどうしたら良いか お願いいたします。

専門家に質問してみよう