Excel VBA 質問スレッド No.754 (解決済)

[困っています]ユーザーフォームで、ThisWorkbook.Save後のCancel=Trueについて

投稿者 : Squid     投稿日時 : 2022/05/25(Wed) 16:33:10     OS : Windows 10     EXCEL : Excel 2013
質問よろしくお願いします。

ユーザーフォームにテキストボックスを2つ設置し、vbmodelessでユーザーフォームを呼び出し、
下記コードを実行すると
TextBox1にフォーカスが残っているのですが、文字の入力は出来るのにEnterキーが効いたり効かなかったりする現象が起きました。(tabキーは次のテキストボックスに移行したり、tabスペースが入ったりします)
毎回Enterキーが効く(Tabキーで次のテキストボックスに移動する)ようにしたいのですが、対処法が分かりません。
どなたか解決方法の分かる方いましたら是非ご教授ください。
よろしくお願いします。

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If Me.TextBox1.Value = "" Then
Exit Sub
End If

'------実際はテキストボックス内の文字列を処理しますが、端折ります。------

Me.TextBox1.Value = ""

ThisWorkbook.Save

Cancel = True

End Sub

[返信 1] Re : [困っています]ユーザーフォームで、ThisWorkbook.Save後のCancel=Trueについて
投稿者 : 名無し     投稿日時 : 2022/05/25(Wed) 20:32:50
KeyDownイベントについて調べてみてください。

[返信 2] Re : [困っています]ユーザーフォームで、ThisWorkbook.Save後のCancel=Trueについて
投稿者 : Squid     投稿日時 : 2022/05/26(Thu) 09:34:44
■[返信 1] 名無しさん(2022-05-25 20:32:50)の記事
> KeyDownイベントについて調べてみてください。

ご返答ありがとうございます。
早速下記コードを追加してキーコードを確認してみました。
すると、意図しない動き(Enterが効かない・Tabがスペースになってしまう)の際に、テキストボックス内に文字や数字は入力できていますが、イミディエイトウインドウにキーコードがプリントされていませんでした。(KeyDownイベントが発生していない?)

また、この事象が発生するのが、ブックを開く→シート上のボタンでユーザーフォームを開く→テキストボックス1に文字を入力してEnterを押す→
初回は必ず成功し、2回目のテキストボックス1に文字を入力しEnterを押すところで、成功と失敗が交互に起こることが分かりました。

せっかくご返答いただいたのですが、私の知識が足りず解決の糸口が見えません。
お手数お掛けしますが、もう少し知恵をお貸しください。
何卒よろしくお願い致します。

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Debug.Print KeyCode

End Sub

[返信 3] Re : [困っています]ユーザーフォームで、ThisWorkbook.Save後のCancel=Trueについて
投稿者 : てらてら     投稿日時 : 2022/05/26(Thu) 11:35:26
こんにちは。

イベントが発生していないのではなく、拾えていないのではないでしょうか?

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Debug.Print KeyCode & ":1"
End Sub

Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Debug.Print KeyCode & ":2"
End Sub

[返信 4] Re : [困っています]ユーザーフォームで、ThisWorkbook.Save後のCancel=Trueについて
投稿者 : hatena     投稿日時 : 2022/05/26(Thu) 15:06:16
何をしたいのか不明瞭ですが、
テキストボックスへの入力値をチェックしてなんからの処理をしたいのなら、
BeforeUpdateイベントか AfterUpdateイベントではないでしょうか。

Cancel = True が使いたいなら、BeforeUpdateイベントになります。

[返信 5] Re : [困っています]ユーザーフォームで、ThisWorkbook.Save後のCancel=Trueについて
投稿者 : Squid     投稿日時 : 2022/05/26(Thu) 16:51:56
■[返信 3] てらてらさん(2022-05-26 11:35:26)の記事
> こんにちは。

> イベントが発生していないのではなく、拾えていないのではないでしょうか?


ご返答ありがとうございます。
意図した動きの際はしっかりとdebug.printでイミディエイトウィンドウにすべてのキーコードが出力されているのですが、Enterが効かない&Tabがスペースになってしまう事象の際は何も出力されないといった状態です。

[返信 6] Re : [困っています]ユーザーフォームで、ThisWorkbook.Save後のCancel=Trueについて
投稿者 : Squid     投稿日時 : 2022/05/26(Thu) 17:23:17
■[返信 4] hatenaさん(2022-05-26 15:06:16)の記事
> 何をしたいのか不明瞭ですが、
> テキストボックスへの入力値をチェックしてなんからの処理をしたいのなら、
> BeforeUpdateイベントか AfterUpdateイベントではないでしょうか。

> Cancel = True が使いたいなら、BeforeUpdateイベントになります。

ご返答ありがとうございます。
こちらのコードは、
①ユーザーフォームのテキストボックス1で文字列を入力、Enterを押す
②それを非表示のシートのセルに入力し、(端折った部分の処理です)
③保存(シートが非表示なので入力毎に保存がしたい)することが目的となっています。

保存後、テキストボックス1で連続入力がしたいので、テキストボックス1からフォーカスが移る際にExitをキャンセルしたいのですが、何故か2回目は上記の様に[Enterが効く&Tabも効く]場合と[Enterが効かない&Tabがスペースになる]パターンが交互に起こってしまう状態です。

意図しないパターンの時は、一旦シートをクリックしてユーザーフォームのテキストボックス1をクリックすると直ることも確認できました。

すみません、長くなりましたがCancel = Trueが使いたい、というよりはブックの保存後にテキストボックス1でEnterキーを押すと上記の②と③が毎回実行できるようにしたいです。
下記コードに変えて実行してみたのですがPrivate Sub TextBox1_Exitと同じ結果になります。

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

If Me.TextBox1.Value = "" Then
Exit Sub
End If

'------実際はテキストボックス内の文字列を処理しますが、端折ります。------

Me.TextBox1.Value = ""

ThisWorkbook.Save

Cancel = True

End Sub

[返信 7] Re : [困っています]ユーザーフォームで、ThisWorkbook.Save後のCancel=Trueについて
投稿者 : Squid     投稿日時 : 2022/05/26(Thu) 17:42:25
連投してすみません。
AfterUpdateイベントにて下記コードを実行してみました。
Cancel = Trueの代わりにMe.TextBox1.SetFocusでテキストボックス1にフォーカスを戻そうとしたのですが、今度はMe.TextBox1.SetFocusが効かず、そのままテキストボックス2にフォーカスが残ってしまいました。
下記コードのThisWorkbook.Saveを消すとフォーカスはテキストボックス1に戻ります。
ThisWorkbook.Saveに原因があるのでしょうか?
質問ばかりで申し訳ありませんが何卒よろしくお願いします。

Private Sub TextBox1_AfterUpdate()

If Me.TextBox1.Value = "" Then
Exit Sub
End If

'------実際はテキストボックス内の文字列を処理しますが、端折ります。------

Me.TextBox1.Value = ""

ThisWorkbook.Save

Me.TextBox1.SetFocus

End Sub

[返信 8] Re : [困っています]ユーザーフォームで、ThisWorkbook.Save後のCancel=Trueについて
投稿者 : hatena     投稿日時 : 2022/05/26(Thu) 18:05:39
> ②それを非表示のシートのセルに入力し、(端折った部分の処理です)

シートを更新してますので、そこでイベントが発生して、それが影響しているかもしれません。イベントを抑制するコードを仕込んだらどうなりますか。


Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

If Me.TextBox1.Value = "" Then
Exit Sub
End If

Application.EnableEvents = False

'------実際はテキストボックス内の文字列を処理しますが、端折ります。------

ThisWorkbook.Save

Me.TextBox1.Value = ""

Cancel = True
Application.EnableEvents = True

End Sub



KeyDownを使うなら、下記のようなコードになります。

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

If Me.TextBox1.Value = "" Then Exit Sub

Select Case KeyCode
Case vbKeyReturn, vbKeyTab, vbKeyUp, vbKeyDown

Application.EnableEvents = False

'------実際はテキストボックス内の文字列を処理しますが、端折ります。------

ThisWorkbook.Save

Me.TextBox1.Value = ""

KeyCode = 0 'キー入力をなかったことにする

Application.EnableEvents = True

End Select

End Sub

[返信 9] Re : [困っています]ユーザーフォームで、ThisWorkbook.Save後のCancel=Trueについて
投稿者 : Squid     投稿日時 : 2022/05/27(Fri) 11:57:42
■[返信 8] hatenaさん(2022-05-26 18:05:39)の記事
> > ②それを非表示のシートのセルに入力し、(端折った部分の処理です)

> シートを更新してますので、そこでイベントが発生して、それが影響しているかもしれません。イベントを抑制するコードを仕込んだらどうなりますか。


ご返答とコードまで追記していただきありがとうございます。
早速上記の2コード試してみたのですが、同じ事象が起こってしまいました。

かなり力技な感じがありますが、下記コードで希望する動きは実現できました。
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If Me.TextBox1.Value = "" Then
Exit Sub
End If

'------実際はテキストボックス内の文字列を処理しますが、端折ります。------

Me.TextBox1.Value = ""

ThisWorkbook.Save

Unload Me

UserForm1.Show vbModeless

UserForm1.TextBox1.SetFocus

End Sub

端折っている部分を実際にコードから削除して実行してみても同じ現象が起こるので、やはりThisWorkbook.Saveに何か原因があるのかと思っています。
hatena様や他の皆様の環境でも同じような事象が再現されるのでしょうか?
お手数ばかりお掛けして心苦しいですが、お手すきの際にご確認いただけましたらと存じます。

[返信 10] Re : [困っています]ユーザーフォームで、ThisWorkbook.Save後のCancel=Trueについて
投稿者 : Squid     投稿日時 : 2022/06/08(Wed) 11:02:55
もっとスマートに解決する方法がありましたので、以下備忘録がてらコードを載せておきます。
sendkeys特有の、NumLockが勝手にon/offになるバグを回避しながらsendkeysで先にtabを押しておけば、希望の動きが実現できました。
回答頂いた皆様ありがとうございました。

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

If Me.TextBox1.Value = "" Then Exit Sub

'------実際はテキストボックス内の文字列を処理しますが、端折ります。------

TextBox1.Value = ""

ThisWorkbook.Save

SendKeys ("+{tab}")

End Sub

[返信 11] Re : [困っています]ユーザーフォームで、ThisWorkbook.Save後のCancel=Trueについて
投稿者 : Squid     投稿日時 : 2022/06/08(Wed) 11:05:31
もっとスマートに解決する方法がありましたので、以下備忘録がてらコードを載せておきます。
sendkeys特有の、NumLockが勝手にon/offになるバグを回避しながらsendkeysで先にtabを押しておけば、希望の動きが実現できました。
回答頂いた皆様ありがとうございました。

Public Function SendKeys(InputKeys As String)

CreateObject("WScript.Shell").SendKeys InputKeys

End Function

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

If Me.TextBox1.Value = "" Then Exit Sub

'------実際はテキストボックス内の文字列を処理しますが、端折ります。------

TextBox1.Value = ""

ThisWorkbook.Save

SendKeys ("+{tab}")

End Sub

当掲示板について
返信入力フォーム
お 名 前  :
内  容   :
ステータス  : この質問を解決済みにする

認証コード  :
        キャプチャ画像


( 処理日時 : 2022-07-07 13:55:43 )

Page
Top