アプリ版:「スタンプのみでお礼する」機能のリリースについて

<質問>Loopなどを強制終了させてユーザーフォームを閉じるコードはないでしょうか?

<背景>
ユーザーフォーム内にあるテキストボックスに数字が入力されない場合、入力されるまでユーザーフォームを表示するというマクロを作りました。
Do While TextBox2.Value = ""
Unload UserForm1
MsgBox "数字を入力してください"
UserForm1.Show
Loop
しかし、これではテキストボックスに何も入力していない状態だとloopが実行され、マクロを閉じることができません。
何かしらテキストボックスに入力して終了させる方法以外になにか改善方法はあるでしょうか?
因みに、「終了」のコマンドボタンには
Private Sub CommandButton2_Click()
Unload UserForm1
End Sub
のマクロを組んであります。
分かる方がいましたら、教えていただきたいです。

A 回答 (9件)

#5です


>回答いただいたIfですと、TextBoxが空欄の場合、そのままコードはすすんでしまうので、エラーとなり、マクロが止まってしまいます。

Exit Subではだめなの?

Private Sub CommandButton1_Click()
If TextBox2.Value = "" Then MsgBox "数字を入力してください"
TextBox2.SetFocus
Exit Sub
'計算処理
End Sub

よく使うのは、複数の入力チェックを行って不備がある場合、
内容を案内して処理をやめるかたちかと。。

実行の際に入力チェックをしたいと言う事ではないのかな?

他の方法として
#7さんが回答しているように入力制限を設定したり
もしくは、下記のような感じで入力時、入力チェックをすることも

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox2.Value = "" Or IsNumeric(TextBox2.Value) = False Then
MsgBox "数字を入力してください"
TextBox2.Value = ""
End If
End Sub
    • good
    • 0
この回答へのお礼

ExitSubを使用することで希望通りの操作になりました!ありがとうございます。
追記も確認しましたが、入力制限の方はなぜかうまくいきませんでした。
それに伴い、新しく問題が発生してしまったので、また質問した際はよろしくお願いいたします。

お礼日時:2021/01/20 15:25

度々、、申し訳ないです。


コピー書き足し確認せず、、すみません。
If TextBox2.Value = "" Then
MsgBox "数字を入力してください"
TextBox2.SetFocus
Exit Sub
End If
です。
    • good
    • 0

このような仕様の場合、


Private Sub TextBox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

Private Sub TextBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger,ByVal Shift As Integer)
を使用して「入力されるまで表示」より、「(数字等適切な値が)入力されれば終了」とするのが良いと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
KeyPress、KeyDownを知らなかったので検索したのですが、全く理解ができませんでした、、、(コードの書き方も何一つ理解できませんでした。)

Private Sub TextBox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyCode=TextBox2.Value = "" Then
MsgBox "数字を入力してください"
End If
End Sub

などでいいのでしょうか、、、?

お礼日時:2021/01/20 13:04

#5です


or ・・・
and ・・・ ですね。。
    • good
    • 0

こんにちは


>何かしらテキストボックスに入力して終了させる方法以外になにか改善方法はあるでしょうか?

Loopさせる意味合いが良くわからないのですが、
Unloadして.Show、、他の内容も消えてしまう気がしますが、、
単純にIFではだめなのでしょうか?
疑問が残りますが、こんな感じにしては、仕様に合いませんか?

Sub start()
UserForm1.Show vbModeless
End Sub

Private Sub CommandButton1_Click()
If TextBox2.Value = "" Then MsgBox "数字を入力してください"
End Sub

Private Sub CommandButton2_Click()
Unload UserForm1
End Sub

ちなみにvbModelessなので、RefEditを使用している場合、
RefEditダメ(バグ)だったと記憶しています。

Loopを使用する場合であれば、ループする条件を増やし、
TextBox2.Value = "" or ・・・
・・・部分を考えてみてはいかがでしょう。。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
このコードのすぐ後にTextBoxの値が必要なコードが組んであるので、loopして数字をその場で入力させる必要があるのです。
回答いただいたIfですと、TextBoxが空欄の場合、そのままコードはすすんでしまうので、エラーとなり、マクロが止まってしまいます。

お礼日時:2021/01/20 12:45

Dim stopflag As Boolean


最初(subの外側)に書く必要があります。
中に書いてはいけません。

subのなか、ループに入る前に
stopflag = false

として、あとは、ループの中に

doevents
if stopflag then exit do
を加え、

Private Sub CommandButton3_Click()
stopflag = True
End Sub

とすればよいです。


(ただ、フォームを閉じたいなら、loopの中にDoEvents加えるだけでも、commandbutton2押したら、抜けられそうな気もしますが。)
    • good
    • 0
この回答へのお礼

何度もすみません。
外側(ユーザーフォームのコードの一番上)に配置していますが、やはりループしてしまいます。

loopの中にdoeventsを加えるというのは、
Do While TextBox2.Value = ""
Unload UserForm1
MsgBox "1パターンのデータ数を入力してください"
UserForm1.Show
DoEvents
If stopflag Then Exit Do
Loop
ということでしょうか?(これでもやはりループしてしまいます。)

お礼日時:2021/01/19 13:55

stopflagはフォームレベルでの変数となっていますか?

    • good
    • 0
この回答へのお礼

初心者質問で申し訳ないのですが、フォームレベルの変数というのはどういうことでしょうか?
現状では、教えていただいたコードはそのまま貼り付けています...

お礼日時:2021/01/19 13:01

Dim stopflag As Boolean



private sub hoge
stopflag = false
do
doevents
if stopflag then exit do
loop
end sub


Private Sub Command1_Click()
stopflag = True
End Sub

などとすればコマンドボタン1を押すことによって、ループから抜けることができます。
doeventsを入れるのがみそですが、いろいろありますので、興味あったらじっくり調べてみてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
コードとコマンドボタン3を追加したのですが、コマンドボタン3を押した後に「終了」ボタンを押すとやはりループされてしまいます、、、

お礼日時:2021/01/19 12:53
    • good
    • 0
この回答へのお礼

こうしてみたけどダメだった。

Private Sub CommandButton2_QueryClose(Cancel As Integer, CloseMode As Integer)
Debug.Print "CommandButton2_QueryClose"
If MsgBox("フォームを閉じますか?", _
vbOKCancel + vbQuestion) = vbCancel Then Cancel = True
End Sub

お礼日時:2021/01/19 13:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!