• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBAのテキストボック、Exitイベント)

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

このQ&Aのポイント
  • エクセルVBAを使用して、テキストボックスのExitイベントを設定する方法について教えてください。
  • フォームのテキストボックスに入力した値をエクセルシートに展開するマクロを作成していますが、製品コード未入力時にフォームを閉じることができなくなります。回避方法はありますか?
  • Exitイベントを使用せずに、フォーカスを移動させずにフォームを閉じる方法を教えてください。

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

Unloadステートメントを記述しているCommandButtonの TakeFocusOnClickプロパティをFalseに設定してください。 プロパティウィンドウで設定してもいいし、 UserForm_Initializeイベントで設定してもいいです。 Private Sub UserForm_Initialize()   Me.CommandButton1.TakeFocusOnClick = False End Sub あとはmySeiCD_Exitの冒頭に下記1行を追記すると良いかと。 If Not Me.Visible Then Exit Sub

pao5
質問者

お礼

私がやりたいと思っていた動作が実現できました。 If Not Me.Visible Then Exit Sub の振る舞いがいまひとつ理解できていませんが、勉強したいと思います。 ありがとうございました。

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

その他の回答 (2)

回答No.2

ユーザーフォームのアクティベイトイベントで始めのテキストボックスをセットフォーカス。 2番目のテキストボックスではエンターイベントを使って、1番目のテキストボックスが空だったら1番目にセットフォーカス。そうでなかったら2番目にセットフォーカスと書く。 3番目も2番同様だけれど、いきなり3番目を選択するとエラーを起こすかもなので、3番目は1番目も確認するように書く。 出来ますよ。

pao5
質問者

お礼

ご回答頂きありがとうございました。 今後のプログラミングの参考に致します。

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

VBで同様のことを行いました。 VBAのイベント順序の仕様でExitでは不可能で、Enter側でエラーチェックするしかないと考えます。 汎用的には以下のような処理を作りこむ必要があります。 (1)Exit側  当該コントロールを記録する。  どのようなチェックを行うかの情報を記録する。  チェックする値を記録する。 (2)Enter側  (2)-1 エラーチェックが不要のコントロール(キャンセルボタン等)   記録されている情報チェックせず、当該コントロールの処理を行う。  (2)-2 エラーチェックが必要な場合(普通のテキストボックス等)   記録されているチェック情報に従い値をチェックする。   エラーがあれば記録されているコントロールに制御を移す。   エラーが無ければ当該コントロールの処理をする。 結構面倒です。 私の場合、VB4でソースを編集することが出来たので、プリプロセッサを作って、LostFocus、GotFocusに必要なコードを自動生成させました。開発量が大きかったので選択できた方法です。 質問者殿の開発規模が不明なのでこの方法がよいのか分かりません。 Exit等でダイナミックにチェックする必要がないのであれば、 「確認ボタン」を新たに設け、この確認ボタンをクリックした時、全てをチェックし、エラーのコントロールに制御を移す、 というのが楽なのではないでしょうか。

pao5
質問者

お礼

ご回答頂きありがとうございました。 今後のプログラミングの参考に致します。

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

関連するQ&A

  • VBAのExitイベントについて

    VBA(Excel)についてご質問します。 フォームにて、IDというオブジェクト名のテキストボックス、 Private Sub ID_Exit(ByVal Cancel As MSForms.ReturnBoolean) という関数(Exitイベント)を用意しました。 IDにフォーカスがある状態で、フォーカスを移動しようとすると、この関数が必ず実行されるかと思います。 そのとき、特定のボタン(例えばキャンセルボタン)がクリックされたためにフォーカスが移動したときは、この関数の処理を実行したくない。もしくはこの関数内で特定のボタンがクリックされたこと(そのためにフォーカスが移動したこと)を検出して、処理をスキップしたいです。 どうすれば実現できますでしょうか? よろしくお願いします。

  • エクセルVBA フレーム内のイベント

    フレーム内に、テキストボックスを配置し、 そのテキストボックスをExitした場合にFormatを変更したいのですが、 フレーム内にテキストボックスがあるためかイベントが発生しません。   1) Frame1 の中に Textbox1 を配置   2) Textbox1には数値を入力   3) 入力後、次のコントロールに移動した場合、    Textbox1.textをformat(Textbox1.text,"#,##0")にする   Private Sub Textbox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)     msgbox "Exit"   End Sub   としましたが、ユーザフォームを終了した時に、msgが出力されます。 フレーム内のイベントはどのようにすればよいか、教えていただきたいです。 よろしくお願いいたします。

  • エクセルVBA テキストボックスへのセットフォーカスについて

    エクセルVBAでユーザーフォーム内に配置されたテキストボックス への数値の入力時に、指定範囲内になければメッセージボックスで 規格外であることを警告し、その規格外が入力されたテキストボックス を強制的に空欄にし、次のテキストボックスにフォーカスを移動させずに、入力間違いのテキストボックスにフォーカスを戻したいのですが どうすればよいのでしょうか? 自分で考えた構文です。 Private Sub TextBox1_AfterUpdate() Dim A As Single A = TextBox1.Text If A < 1.99 Or A > 3.00 Then MsgBox "規格外!!"     TextBox1.Text = "" TextBox1.SetFoucus End If Exit Sub End Sub これですと、次のテキストボックスにフォーカスが移動してしまいます。 次のテキストボックスにフォーカスを移動させずに、規格内の値が 入力されるまでフォーカスを移動させない方法を教えて下さい。 お願い致します。

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

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

  • EXCEL VBAで・・・。

    テキストボックス34に入力した値を、ExcelのA列の値より検索し その隣の値をテキストボックス4に表示させる、と言う処理をしています。 検索時に検索データが見当たらない場合、メッセージボックスを表示し、 更に、テキストボックス34のデータを消去→テキストボックス34にフォーカス移動 させたいのです。 下記のコードですと、メッセージボックス表示と テキストボックス34のデータ消去までは出来るのですが フォーカス移動してくれません。 イベントをexitにしている理由は特にないのですが、changeを使うと、 テキストボックス34に1文字入力された時点でメッセージボックスが表示されたり、 1文字でも一致するデータが順に表示されてしまいます。 (テキストボックス34に入力するデータの文字数は3文字固定です。) 何か良いお知恵がありましたら、お教え下さい。 ----------------------------------------------------------- Private Sub Textbox34_exit(ByVal Cancel As MSForms.ReturnBoolean) Dim Result As Variant Set Result = Range("A:A").Find(what:=TextBox34.Text, MatchCase:=True, matchbyte:=True) If Result Is Nothing Then MsgBox ("入力されたコードは登録されていません。") TextBox34.Text = "" TextBox34.SetFocus Else Range("A:A").Find(what:=TextBox34.Text, MatchCase:=True, matchbyte:=True).Activate ActiveCell.Offset(0, 1).Select TextBox4.Text = ActiveCell.Value End If End Sub

  • エクセルVBAについて質問です。

    エクセルVBAについて質問です。 ユーザーフォームのテキストボックスに数字以外を入力するとエラーメッセージが出るように関数を作ったのですが、 Private Function AA(objtextbox As MSForms.TextBox) As Boolean Dim A As String AA = False A = Trim(objtextbox.Text) If objtextbox.Text <> "" Then If IsNumeric(A) = False Then MsgBox "数値 Error", vbCritical With objtextbox .SetFocus .SelStart = 0 .SelLength = Len(.Value) End With AA = True End If End If End Function Private Sub textbox1_exit(ByVal cancel As MSForms.ReturnBoolean) cancel = AA(TextBox1) End Sub テキストボックス200近くある場合、1つ1つに Private Sub textbox1_exit(ByVal cancel As MSForms.ReturnBoolean) cancel = AA(TextBox1) End Sub と作っていかなくてはいけないのでしょうか? プロシージャ名に変数使おうとしたら上手くできませんでした。 どなたか助けてください。

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

    質問番号:5013953でフォーカスを移動しない方法を質問し、解決しました続きの質問です。 Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If ComboBox1.Value = "" Then MsgBox "値が不正です。", vbInformation, "フォーム名" Cancel = True End If End Sub この場合、コンボボックスをExitで移動しなくしたまでは良かったのですが、 これによって他の部分で不具合が生じたので再度質問させてください。。 フォームにデータを入力中に中断する必要が出た場合、コマンドボタンで[終了]をつくったのです。 Private Sub 終了cmd_Click() End End Sub このコードでは先のコードの影響で終了することができないのです。 これを解決する方法を教えてください。

  • ExcelのExitイベントについて

    こんにちは。 Excel VBA初心者です。 Formを作成し、Form上に、テキストをいくつか配置しています。 日付を入力するテキストが2つあり、それぞれ、以下の名前にしています。 オブジェクト名:txt開始日、txt入力日  3つVBAで設定をしたのですが、(2)がうまく動きません。 (1)年を入力しなくても、自動的に年(4ケタ表示)を表示する。→これは、どこかのサイトで、紹介されていた物を使用させて頂いています。 (2)txt開始日に日付を入力し、txt入力日に入力した日付より大きかったら、 MsgBOXを表示し、txt入力日の値を空白にし、再度入力するようにする (3)txt開始日が空白で、txt入力日に入力は可。 (2)が、私の作成したコードだと、うまく動かず、 ちゃんとtxt開始日<txt入力日で入力していても、 MsgBOXのメッセージが出てしまったり、 MsgBOXが表示され、再度、txt入力日に、 txt開始日<txt入力日になる値を入力しても、 同じMsgBOXが出てしまいます。 どなたか解決策を教えて頂けますでしょうか。 よろしくお願いします。 ------------------------------------------------- ------------------------------------------------- Private Sub txt予定日_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim dteDate As Date If txt予定日.Value = "" Then txt予定日.Value = "" Exit Sub End If If IsNumeric(Left$(txt予定日, 4)) <> True Then txt予定日 = Year(Date) & "/" & txt予定日 End If If IsDate(txt予定日) = True Then dteDate = CDate(txt予定日) ' 実数はTagに格納 txt予定日.Tag = CLng(dteDate) Else MsgBox "予定日入力ミスです。再度入力してください。" End If If txt確認日.Value <> "" And txt予定日.Value <> "" And txt確認日.Value > txt予定日.Value Then MsgBox "予定日と確認日の日付に間違いがあります~。再入力お願いします。" txt予定日.Value = "" Cancel = True Exit Sub End If End Sub

  • エクセルVBA 時刻の計算 テキストボックス

    お知恵をお貸しください。 入力を簡単にするためのユーザーフォームを作っています。 開始時間(txt開始)に「14:00」 終了時間(txt終了)に「19:00」と入力すると 時間(txt時間)は「5:00」(19:00-14:00=5:00) 通常(8:00~18..00)に「4」(4:00*24) 時間外(6:00~8:00、18:00~22:00)に「1」(1:00*24) 深夜(22:00~6:00) と表示させたく思います。 通常、時間外、深夜のテキストボックスに表示することができません。 よろしくお願いします。 Private Sub txt時間_Exit(ByVal Cancel As MSForms.ReturnBoolean) If txt開始 > TimeValue("8:00") And txt開始 < TimeValue("18:00") Then txt通常.Text = TimeValue(txt時間.Value) * 24 End If End Sub Private Sub txt終了_Exit(ByVal Cancel As MSForms.ReturnBoolean) txt時間.Value = Format((TimeValue(txt終了.Text) - TimeValue(txt開始.Text)), "h:mm") End Sub

  • エクセルVBA テキストボックス処理?

    エクセル2000 VBAにて入力フォームの テキストボックス1に下記を書き込んだのですが カーソルがテキストボックス1にあるとき 他の処理(コマンドボタン、マウスにて他のテキストボックスに カーソルを移すなど)が出来ません。 フォームを閉じるときもメッセージボックスのコメントがでます。 どの処理を行ってもテキストボックス1の処理が終わってからしか 行わないようなのですが??? Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim i As Integer '品番確認用 For i = 3 To 100 If Sheets("品番マスタ").Cells(i, 1) = TextBox1.Text Then Label1 = Sheets("品番マスタ").Cells(i, 2).Value 'メーカー Label2 = Sheets("品番マスタ").Cells(i, 3).Value 'タイプ Label3 = Sheets("品番マスタ").Cells(i, 4).Value '品名 Label4 = Sheets("品番マスタ").Cells(i, 5).Value '内容量 Label6 = Sheets("品番マスタ").Cells(i, 8).Value '背番号 Exit Sub End If Next i MsgBox "品番がありません" TextBox1 = "" Cancel = True End Sub どのように変更すればいいでしょうか?

電源トラブルで困っている方へ
このQ&Aのポイント
  • 電源トラブルでお困りの方へ。電源が入らない、または入ったり入らなかったりする問題を解消する方法についてご紹介します。
  • 電源トラブルでお悩みの方におすすめの解決策をご紹介します。電源が入らない、または入ったり入らなかったりする際の対処方法をまとめました。
  • 電源トラブルでお悩みの方へ。電源がうまく入らない、または不安定な状態で動作してしまう場合の対処法をご紹介します。
回答を見る

専門家に質問してみよう