入力画面には3つのTextBoxあり、すべてを入力したら「記入」ボタンをクリックします。
その時、TextBox2とTextBox3の合計がTextBox1の値と一致するか判定します。
一致した場合は、その値を選択したセルに表示し、一致しなかった場合は、メッセージを表示させ、メッセージの「OK」ボタンをクリックすると「記入」ボタンがクリックされる前の状態(UserForm1の入力項目にデータが入力されている状態)に戻したいのですが、どのようにしたらよいのでしょうか。
現在は、下記のようなかんじになっています。
Private Sub CommandButton1_Click()
Sum = 0
For N = 1 To 2
If Controls("TextBox" & N).Text = "" Then
RepMsg = MsgBox("値を入力して下さい。", vbOKOnly + vbExclamation, "入力確認")
『? 「記入」ボタンがクリックされる前の画面(UserForm1)に戻る』
Else
Sum = Val(Controls("TextBox" & N).Text) + Sum
End If
Next N
If Val(TextBox1.Text) <> Sum Then
RepMsg = MsgBox("合計が一致しません。", vbOKOnly + vbExclamation, "合計確認")
If RepMsg = vbOK Then
『? 「記入」ボタンがクリックされる前の画面(UserForm1)に戻る』
End If
End If
( 表示 )
End Sub
No.4ベストアンサー
- 回答日時:
こんにちは。
KenKen_SP です。オリジナルを生かし、数値の入力チェックまで行えば次のような感じ。
数値チェックに IsNumeric を使う場合は注意して下さい。詳しくは
ソースのコメントを読んで下さい。
Private Sub CommandButton1_Click()
' 変数 Sum について
' ・宣言するなら少数が扱われる場合 Double または Variant 型
' ・ワークシート関数 Sum と同一名なので他の名前の方が良い
For N = 1 To 3
If IsNum(Controls("TextBox" & N).Text) = False Then
RepMsg = MsgBox("数値を入力して下さい。", _
vbOKOnly + vbExclamation, "入力確認")
With Controls("TextBox" & N)
.SetFocus
.SelStart = 0
.SelLength = Len(.Text)
End With
Exit Sub
End If
Next
Sum = 0
For N = 1 To 2
Sum = Val(Controls("TextBox" & N).Text) + Sum
Next N
If Val(TextBox3.Text) <> Sum Then
RepMsg = MsgBox("合計が一致しません。", _
vbOKOnly + vbExclamation, "合計確認")
If RepMsg = vbOK Then
Exit Sub
End If
End If
'( 表示 )
MsgBox "OK"
End Sub
' 数値なら True を返す IsNumeric 強化関数
Private Function IsNum(strVal As String) As Boolean
' IsNumeric は IsNumeric("3D2") とか IsNumeric("1,,2,,3") で
' True を返す。数値以外の入力を不可にしていない場合は、厳密
' にやるなら数値チェック関数としてそのまま使ってはいけない
Dim i As Long
If Len(strVal) > 0 Then
For i = 1 To Len(strVal)
If Not Mid$(strVal, i, 1) Like "[0-9.]" Then Exit Function
Next i
If IsNumeric(strVal) Then IsNum = True
End If
End Function
少し冗長ですね。Textbox が空あるいは文字列なら Cdbl 関数でエラーが発生
するので、それを On Error ~でトラップする方法もあります。
数値チェック関数を書くのが面倒ならこれでも良いかもしてません。
Private Sub CommandButton2_Click()
Dim blnResult As Boolean
On Error Resume Next
blnResult = ((CDbl(TextBox1.Text) + CDbl(TextBox2.Text)) = CDbl(TextBox3.Text))
If Err Then
MsgBox "数値が入力されてない/数値ではない", vbExclamation
Exit Sub
ElseIf Not blnResult Then
MsgBox "合計が一致しない", vbCritical
Exit Sub
End If
On Error GoTo 0
MsgBox "OK"
End Sub
こんな感じになります。SetFocus とかはしてませんが。
とても詳しく回答していただき、ありがとうございます。
とても勉強になりました。
是非、参考にさせていただきたいと思います。
ありがとうございました。
No.2
- 回答日時:
直接の回答ではありません。
気になる点がありましたので、同様のコードを書いてみました。
・一つは、全体構造のスパゲッティーな感じを整理してみました。
・二つは、MsgBox の使い方です。次に示す Message() でなく Verify() に近い使い方は疑問です。
なお、入力チェックは、Len() の利用で統一しています。
Private Sub 記入ボタン_Click()
Dim isCompleted As Boolean
Dim lngSum As Long
isCompleted = Len(TextBox2.Text & "") And Len(TextBox3.Text & "")
If Not isCompleted Then
Message "テキストボックスの入力が完了していません。"
If Not Len(TextBox2.Text & "") Then
TextBox2.SetFocus
Else
TextBox3.SetFocus
End If
Else
lngSum = TextBox2.Value + TextBox3.Value
If lngSum <> TextBox1.Value Then
Message "合計が一致しません。"
TextBox2.SetFocus
Else
'
End If
End If
End Sub
**********************************************************************************************
Answer = Verify("テキストボックスを訂正しますか?")
If Answer = vbYes Then
・・・・・
End If
Message "テキストボックスの入力が完了していません。"
Verify() に近い使い方をしていますが、 Message() の使い方で事足りると思います。
Public Function Verify(ByVal Msg As String, _
Optional ByVal DefaultButton As Integer = vbDefaultButton1) As Integer
Verify = MsgBox(Msg, vbYesNo + vbQuestion + DefaultButton, " 確認")
End Function
Public Sub Message(ByVal Msg As String)
MsgBox Msg, vbInformation, " お知らせ"
End Sub
とても詳しく回答していただき、ありがとうございます。
とても勉強になりました。
是非、参考にさせていただきたいと思います。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストボックスの番号を使っ...
-
エクセルVBA テキストボックス...
-
数字以外の入力をエラーにする...
-
初歩的な事だと思います。 Sub...
-
Excel-VBAでInputBox+Pulldown...
-
エディットボックスの入力制限...
-
accessで該当するレコードがな...
-
入力フォームの値をQRコードで...
-
textareaについて
-
VBAの質問になります メッセー...
-
c#でTextBoxの入力制限
-
TextBoxから数字が文字...
-
複数行の入力を受け取る方法
-
VBAでInputBoxの再入力をさせる...
-
POST時に履歴を残さない方法
-
VBAの質問です、複数のテキスト...
-
Windowsのアプリ開発ってなんの...
-
教えて!全角文字「μ」の半角
-
ExcelVBA No.を自動連番で設定...
-
クロスサイト・スクリプティン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA テキストボックス...
-
テキストボックスの番号を使っ...
-
初歩的な事だと思います。 Sub...
-
数字以外の入力をエラーにする...
-
EXCEL VBA で指定した範囲に入...
-
Excel-VBAでInputBox+Pulldown...
-
入力フォームの値をQRコードで...
-
VBAの質問になります メッセー...
-
c#でTextBoxの入力制限
-
VBAで質問があります
-
教えて!全角文字「μ」の半角
-
VBAでInputBoxの再入力をさせる...
-
excel vba でユーザーフォーム...
-
TextBoxから数字が文字...
-
エディットボックスの入力制限...
-
accessで該当するレコードがな...
-
DataGridViewの桁数制限に関して
-
VBA R1C1形式で変数の入力について
-
「イ分」・・・フンという文字...
-
Windowsのアプリ開発ってなんの...
おすすめ情報