横レス失礼します。
「入力値を【数値とみなせる】か」は、IsNumeric関数で判定できますので、
Type引数は省略した上で、全チェックをマクロで行うのがよいかと思います。
Do
指示数 = InputBox("指示数を数字で入力してください")
'キャンセル/空白時
If 指示数 = "" Then
'取消の確認 ◆キャンセルの取消に対応してみました◆
If MsgBox("終了します", vbOKCancel + vbExclamation, "確認") = vbOK Then
Call 定位置
Exit Sub
End If
'数値の場合
ElseIf IsNumeric(指示数) Then
'小数指定時
If InStr(2, StrReverse(指示数), ".") Then
MsgBox "整数を入力してください", vbCritical, "エラー!!"
'桁数オーバー時
ElseIf Len(指示数) > 8 Then
MsgBox "桁数が違います。再入力してください", vbCritical, "エラー!!"
'もし0や負の数も弾きたい場合は、以下の2行の先頭の「'」を外します
'ElseIf 指示数 <= 0 Then
' MsgBox "正の整数を入力してください", vbCritical, "エラー!!"
Else
Exit Do
End If
'数値以外
Else '【数値以外】
MsgBox "数値を入力してください", vbCritical, "エラー!!"
End If
Loop
【注意と説明】
・If文では、関数の戻り値が「0以外の整数」や「False」以外は、Trueと
みなされるため、「IsNumeric」等に対する「=True」は省略しています。
・上では「Application.InputBox」ではなく、VBA関数のInputBoxを使用して
います。キャンセル選択時の戻り値が異なるので注意してください。
(今回は取消と空白の区別が不要のようでしたので、上記の通りとしました)
・小数かどうかは、「.」の有無で判定しています。
但し、「1.」は「1」とみなすよう、末尾の「.」(→StrReverse関数で文字列を
逆順に並べ替えると先頭)は、対象から外しました。
なお、「1.0」も「1」とみなして許容する場合は、小数の判定部分を以下の
ように変更すれば対応できます:
'小数指定時
If 指示数 <> CLng(指示数) Then
※強制的に整数化したものと元の値が同じなら整数、違えば小数、と。
(InputBoxで「1.00」と指定しても、CLngの戻り値との比較時には
数値とみなされて判定されるようです)
お礼
ご丁寧にありがとうございます。 【StrReverseについて】 ヘルプで見て内容は理解していました。 IsNumericが数値ではないのに Trueを返してしまう文字の中に 123- が有ります。 並び順をかえると-123 この時にためにStrReverseを使ったのかな? と思っていました。 今よく見たら 123- と入力した場合は If InStr(2, StrReverse(指示数2), ".") Then ではなく ElseIf 指示数2 <= 0 Then で判定されていました。(^_^.) またIsNumericが数値ではないのにTrueを返してしまう 文字対策の方のずらずらと並べた方は StrReverseをそのまま適用しましたが 第一引数を2ではなく省略しました。 ヘルプでは 省略→先頭から検索される とあったので省略すれば 上から読んでも下から読んでも山本山 ではなく、どこに「+」「,」「D」「E」が有っても 検索可能だから逆でも大丈夫だと思いそのままにしました。 今試したら教えていただいたとうり 1.が通過してしまいます。(滝汗) これはやばいです。 1.が通過すると後の方の処理で VBEのエラー画面が出てしまい 使用者がパニくってしまいます。 (おかしいなあ。予想される入力は全部やってみたのですが。 1.も試した(はじいた)記憶が....キット思い過ごしです。(^_^.) 【InStrについて】 ここでかなり悩んでしまいました。 数字で有るなら、全角でも半角でも通過させたかったからです。 全角で1.5だとはじいてくれなくて ヘルプも見たのですが..... 今見直すと 「vbTextCompare 1 テキスト モードの比較を行います。」 とありますね。 テキスト→全角、半角の区別をしない とは行き着きませんでした。 (-_-;)駄目ですね。 私はPC操作もエクセル使用も向いてないんです。 それなのにマクロをなんて、無理なんですよね。 絶対ここで質問しないと決めたのですが 本件は質問してしまったし.....。 今別件で悩んでます。(T_T) 構文の記述ではなく どう処理するかが決めれなくて。 あっ。すいません。本件には関係ありませんね。 とりあえずリリースしてしまったので 「InStr(StrReverse(指示数2), "+")」 ↓ 「InStr(指示数2, "+")」 に修正してきます。 いろいろとありがとうございました。