InputBoxで代入した変数を比較演算子で処理
InputBoxに入力し
その値を判定後次処理に進むよう作成中で
つまづいてます。
InputBoxにtype1を記述すると
空白で「OK」を選択時に
「入力した数式は正しくありません」
というヘルプ付のエクセル標準の警告
が表示される為、type1をやめ、
IsNumericが数値ではないのにTrueを返す文字の対策、
正の整数半角以外の時は再入力させるように
(0、負、数字以外、大文字、キャンセル、キャンセルのキャンセル、
空白でOKを押すなど)
してみましたが肝心の
ElseIf 開始行2 > 最終行 Then
と
ElseIf 終了行2 <= 開始行2 Then
が思ったように処理されません。
ウォッチ式でも
ElseIf 開始行2 > 最終行 Then
↓
3 > 25
12 > 25 →双方Falseのはず→True→【NG】
ElseIf 終了行2 <= 開始行2 Then
↓
3 <= 4 →Trueのはず→True→【OK】
7 <= 4 →Falseのはず→False→【OK】
12 <= 4 →Falseのはず→True→【NG】
4 <= 11 →Trueのはず→False→【NG】
という具合です。
変数の型の未定義が原因かと
数値系で定義すると"False" Thenの所で「型が一致しません」で
ERRです。
変数の開始行、終了行の型をAs Longにして
ElseIf 開始行 = "False" Then
ElseIf 終了行 = "False" Then
↓
ElseIf 開始行 = False Then
ElseIf 終了行 = False Then
にすればERRは出ませんが本題は改善されません。
片方の変数を数値で固定すれば思ったように動きました。
例:ElseIf 終了行2 <= 4 Then
変数同士を比較演算子で判定はできないのでしょうか?
正しく判定できない原因を教えていただきたくお願いします。
Dim 最終行
Dim 開始行
Dim 開始行2
Dim 終了行
Dim 終了行2
Dim 質問
最終行 = Cells(Rows.Count, 3).End(xlUp).Row
Do
開始行 = Application.InputBox("開始行を" & vbCrLf & _
"数字で入力してください")
If 開始行 = "" Then '(分岐1-1)空白でOKを押時
MsgBox "【空白】は指定できません(>_<)", vbCritical, "エラー!!"
ElseIf 開始行 = "False" Then '(分岐1-2)キャンセル選択時
'(分岐1-2-1)
If MsgBox("終了します", vbOKCancel + vbExclamation, "確認") = vbOK Then
Exit Sub 'OK押下時→終了
End If '1-2-1終了
ElseIf IsNumeric(開始行) Then '(分岐1-3-1)数値か確認
開始行2 = StrConv(開始行, vbNarrow) '数値なら全角→半角
'IsNumericがTrueを返した時の確認
If InStr(開始行2, ".") Then '(1-3-2)小数指定時と123.56対応
MsgBox "【小数点】は駄目です。(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf 開始行2 <= 0 Then '(1-3-3)負の数字と-123対応
MsgBox "負(マイナス)の数は駄目です(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
'IsNumericが数値ではないのにTrueを返してしまう文字の対策
ElseIf InStr(開始行2, "+") Then '(1-3-4)+123と123+対応
MsgBox "【+】は入れてはいけません(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf InStr(開始行2, "-") Then '(1-3-5)123-対応
MsgBox "【-】は入れてはいけません(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf InStr(開始行2, ",") Then '(1-3-6)1,,,,,,6対応
MsgBox "【,】はいれては行けません(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf InStr(開始行2, "E") Then '(1-3-7)3E2対応
MsgBox "【E】は入れてはいけません(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf InStr(開始行2, "D") Then '(1-3-8)3D2対応
MsgBox "【D】は入れてはいけません(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
'判定開始
ElseIf 開始行2 = 1 Then '(1-3-9)1は駄目
MsgBox "【1】は指定できません。(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf 開始行2 > 最終行 Then '(1-3-10)●入力値が最終行を超える
MsgBox "【" & 開始行2 & "】" & "行以降はデータがありません。(>_<)" _
& vbCr & "再入力してください", vbCritical, "エラー!!"
Else '(1-3-11)1~10以外の場合
Exit Do 'Doを抜ける
End If '1-3 11項目終了
Else '(分岐1-4)数値以外の場合
MsgBox "数値以外は駄目です(>_<)" & vbCr & "再入力してください", _
vbCritical, "エラー!!"
End If '1~4終了
Loop
質問 = MsgBox("最終行まで処理しますか?", vbYesNo + vbQuestion)
Select Case 質問
Case vbNo
Do
終了行 = Application.InputBox("終了行を" & vbCrLf & _
"数字で入力してください")
If 終了行 = "" Then
MsgBox "【空白】は指定できません(>_<)", vbCritical, "エラー!!"
ElseIf 終了行 = "False" Then
If MsgBox("終了します", vbOKCancel + vbExclamation, "確認") = vbOK Then
Exit Sub
End If
ElseIf IsNumeric(終了行) Then
終了行2 = StrConv(終了行, vbNarrow)
If InStr(終了行2, ".") Then
MsgBox "【小数点】は駄目です。(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf 終了行2 <= 0 Then
MsgBox "負(マイナス)の数は駄目です(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf InStr(終了行2, "+") Then
MsgBox "【+】は入れてはいけません(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf InStr(終了行2, "-") Then
MsgBox "【-】は入れてはいけません(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf InStr(終了行2, ",") Then
MsgBox "【,】はいれては行けません(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf InStr(終了行2, "E") Then
MsgBox "【E】は入れてはいけません(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf InStr(終了行2, "D") Then
MsgBox "【D】は入れてはいけません(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf 終了行2 <= 開始行2 Then'●判定
MsgBox "入力した値は" & vbCr & "開始行以前です。(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
Else
Exit Do
End If
Else
MsgBox "数値以外は駄目です(>_<)" & vbCr & "再入力してください", _
vbCritical, "エラー!!"
End If
Loop
最終行 = 終了行2 '最終行の値を終了行2に変更
Case vbYes 'Yesの場合
End Select '最終行の値は変更せず次の処理へ