プロが教えるわが家の防犯対策術!

エクセル2003です。
インプットBOXに数値を入力してもらいます。
整数で1文字以上~8文字以内にさせたいです。
(1)キャンセル選択
(2)間違った入力
(3)未入力でOKを選択
の場合記述してある再入力を促すMsgBoxを表示させたいです。
また(2)(3)はMsgBox表示の後インプットBox入力に戻したいです。
以下に掲載した構文で行うと

(1)インプットBOXの「キャンセル」選択時
→「終了」MsgBox表示(正常)

(2)数字以外を入力した時
→Type:=1にしてある為「数値が正しくありません」
 と記述してあるMsgBoxではないが警告メッセージが表示(正常)

・9文字以上入力した場合
→「再入力」MsgBox表示(正常)

・1文字~8文字を入力した場合
→次の処理に進む(正常)

(3)何も入力せず空白の状態でインプットBoxの「OK」を選択
→記述してあるMsgBoxではなく
「入力した数式は正しくありません」と書かれたヘルプ付き警告が
表示されてしまいます。 
この時は上記同様に記述内にある
再入力を促すMsgBox
を表示させたいのですがどう記述すればいいのか分かりません。

インプットBoxのType:=1をはずせば
記述してあるMsgBoxが表示するようになりますが
今度は整数以外が入力できてしまいます。
よろしくお願いします。

Do
指示数 = Application.InputBox("指示数を数字で入力してください ", Type:=1)
If 指示数 = "False" Then 'キャンセル選択時
MsgBox "終了します", vbExclamation, "注意"
Call 定位置 
Exit Sub 
End If
'1文字以上8文字以内の時はループを抜けて次の処理へ
If Len(指示数) <= 8 Then
Exit Do 'Loopを抜けて次の処理へ
End If
MsgBox "ケタ数が違います。再入力してください", vbCritical, "エラー!!"
Loop 'インプットBoxに戻る
---次の処理

A 回答 (5件)

No.4です。



お礼と補足欄の内容を見させていただきました。
意図通りの動きになったのでしたら何よりです。
ただ、幾つか気になる点がありましたので、補足させてください。

【StrReverseについて】
上記関数は、「123」を「321」に、「ABC」を「CBA」に、と、文字列の
並び順を逆転させます。
前回の回答では、(こちらでの勝手な解釈で)「1.0」は弾きつつ「1.」は
許可する、という動作をさせるために使用しました。
(「1.」を「.1」とし、InStr関数の第1引数に「2」を指定することで、
 反転後に先頭となる「.」を、InStr関数の判定対象から外した、と)

ですので、位置によらず「.」や「+」等を弾きたい場合は、上記関数は
不要です(汗)
(「InStr(StrReverse(指示数2), "+")」は「InStr(指示数2, "+")」で
 Ok、と)


【InStrについて】
この関数では、第4引数の指定により、全角/半角を同一とみなすか
どうかを指定できます。
(省略した場合は、モジュール先頭の「Option Compare ○○」での
 指定によって変化)

同一扱いにする場合は、
 InStr(1, 指示数, ".", vbTextCompare)
と、「vbTextCompare」(または「1」:クエリではこちらのみ有効)を
指定します。
なお、第4引数指定時は、第一引数(開始位置)も省略できなく
なるのでご注意下さい。


【数字以外を含むかどうかの判定法について】
小数点や正負の記号も含め、「0~9」の数字以外の全てを弾く
のでしたら、「Replace関数でそれらを消した後に文字が残るか
どうか」という判定方法もあるかと思いますので、参考までに・・・。
(以下、追加が必要になると思われる部分のみ記述。実際に
 組み込む場合は、適宜分割して、必要な場所に埋め込んで
 下さい:
 変数宣言は先頭、変換は「ElseIf~」の分岐の中、など)

Dim sRemain As String, i As Integer

'評価用の変数に入力値を記録
sRemain = 指示数2

'「0~9」の数字を全て空文字に変換
For i = 0 To 9
  '変換後の値を、同じ変数に再格納
  sRemain = Replace(sRemain, i, "")
Next

'数字全てを空文字に変換した後に、何らかの文字が残った場合
'(「1,,,,,,6」の場合、MsgBoxには「,,,,,,は入れては~」と表示されます)
If Len(sRemain) Then  '「0」以外は条件成立扱いになります
  MsgBox sRemain & "は入れてはいけません(>_<)" & vbCrLf & _
    "再入力してください", vbCritical, "エラー!!"
End If


※これとは別に、「正規表現」を使用する方法もあります。
  ただ、こちらはややとっつきにくいところがあるのと(→自分もまだ
  習得未了(汗))、「実際にどの文字が問題なのか」を表示する
  にはやや不適と思われますので、紹介のみに留めておきます(汗)
http://codezine.jp/article/detail/1655
http://officetanaka.net/excel/vba/tips/tips38.htm
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございます。
【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, "+")」
に修正してきます。

いろいろとありがとうございました。

お礼日時:2011/04/25 17:49

No.2です。



> インプットBOXに空白でOKを選択時は
> 入力忘れと仮定して
> 記述した「再入力を促すMsgBox」を表示させたいのです。

でしたら、VBAのInputBox関数からApplication.InputBoxに戻す必要がありますね(汗)

前回の回答に対して、以下のように改修すれば、ご希望の動作になるかと思います。

【現状(改修部分のみ抜粋・コメントは省略)】

  指示数 = InputBox("指示数を数字で入力してください")

  If 指示数 = "" Then

【改修後(抜粋部分を置き換え)】

  指示数 = Application.InputBox("指示数を数字で入力してください")

  If 指示数 = "" Then
    MsgBox "空白は指定できません"
  ElseIf 指示数 = "False" Then



・・・以上です。
取り急ぎ、参考まで。

この回答への補足

Do '指示数を変更する為に入力
指示数 = Application.InputBox(Prompt:="指示書に表示したい" _
& vbCrLf & "【指示数】" & vbCrLf & "を数字で入力してください")
If 指示数 = "" Then '(3)入力値確認分岐開始、空白でOKを押時
MsgBox "空白は指定できません(>_<)", vbCritical, "エラー!!"
ElseIf 指示数 = "False" Then '(3)分岐2種類目、キャンセル選択時
If MsgBox("終了します", vbOKCancel + vbExclamation, "確認") = _
vbOK Then
Call 定位置 'OK押時
Exit Sub
End If 'キャンセル押時
ElseIf IsNumeric(指示数) Then '(3)分岐3種類目、数値の場合
指示数2 = StrConv(指示数, vbNarrow) '全角→半角
'IsNumericがTrueを返した時の確認
If InStr(2, StrReverse(指示数2), ".") Then '小数指定時と123.56対応
MsgBox "小数点は駄目です。(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf Len(指示数2) > 8 Then '桁数オーバー時
MsgBox "桁数が違います。(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf 指示数2 <= 0 Then '負の数字と-123対応
MsgBox "負(マイナス)の数は駄目です(>_<)" & vbCr _
& "再入力してください", vbCritical, "エラー!!"
'IsNumericが数値ではないのにTrueを返してしまう文字の対策
ElseIf InStr(StrReverse(指示数2), "+") Then '+123と123+対応
MsgBox "+は入れてはいけません(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf InStr(StrReverse(指示数2), "-") Then '123-対応
MsgBox "-は入れてはいけません(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf InStr(StrReverse(指示数2), ",") Then '1,,,,,,6対応
MsgBox ",はいれては行けません(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf InStr(StrReverse(指示数2), "E") Then '3E2対応
MsgBox "Eは入れてはいけません(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
ElseIf InStr(StrReverse(指示数2), "D") Then '3D2対応
MsgBox "Dは入れてはいけません(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
Else 'IsNumericがTrueを返した時の確認を全て通過した時
Exit Do 'Doを抜ける
End If
Else '(3)分岐4種目、数値以外
MsgBox "数値以外は駄目です(>_<)" & vbCr & _
"再入力してください", vbCritical, "エラー!!"
End If '(3)分岐終了
Loop

補足日時:2011/04/21 16:59
    • good
    • 0
この回答へのお礼

お礼が遅れて申し訳まりません。

>ご希望の動作になるかと思います。

はい。なりました。
インプットBOXには
全角、半角問わず(まじっても可)で
1~99999の整数以外の入力ははじきたいのですが
自分のやり方では
負の数字や0、小数点がはじかれないので
教えていただいた物を使う事にしました。

ただ
If InStr(2, StrReverse(指示数2), ".") Then
が全角では判定しないので
IsNumericが数値と判定した時点で全角を半角に
するようにしました。

ElseIf IsNumeric(指示数) Then '(3)分岐3種類目、数値の場合
指示数2 = StrConv(指示数, vbNarrow) '全角→半角

またIsNumericが数値ではないのにTrueを返してしまう

123.56
123,56
1,,,,,,6
.56
+123
-123
123+
123-
3E2
3D2
の対策で
LikeとかFindとかいろいろ試しましたが駄目でしたので
InStrを複数作成しました。
できあがった構文は
追記に入れました。
どうもありがとうございました。

お礼日時:2011/04/21 16:54

NO1です。


>全角でも半角でも受け付けるようにしています。
 ⇒この処理を前倒しにする方法がベターだと思います。
  余裕があれば、面倒ですがユーザフォームを作成して入力する方法は如何でしょうか。
  テキストボックスのプロパティからIMEモードや入力長制限を設定できますのでご検討
  下さい。(参考サイトのURL添付します)

参考URL:http://www.eurus.dti.ne.jp/~yoneyama/
    • good
    • 0
この回答へのお礼

ありがとうございます。
今回教えていただいた内容ですが
現在の私の技量では
ちょっと難しくて対応が難しいです。
申し訳ありません。

お礼日時:2011/04/12 10:32

横レス失礼します。



「入力値を【数値とみなせる】か」は、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の戻り値との比較時には
   数値とみなされて判定されるようです)
    • good
    • 0
この回答へのお礼

ありがとうございます。
ご回答いただく前に
http://okwave.jp/qa/q2872556.html
にあった方法で

Typeを外して
If Len(指示数) <= 8 Then

If Len(収容数) <= 8 And IsNumeric(収容数) Then
にするだけで対応ができました。
4→半角でも
4→全角でも
Exit Doで次の処理にいけます。
また入力内容に数字以外があれば
記述した再入力を促すMsgBoxが表示されました。

ただし値が以下の場合、エラーにならないです。
以下の場合は
記述した再入力を促すMsgBoxが表示したいのですが
Exit Doでループを抜けて次の処理に行ってしまいます。

123.56
123,56
1,,,,,,6
.56
+123
-123
123+
123-
3E2
3D2

教えていただいた記述をそのまま使わせていただきました。
インプットBOXに空白でOKを選択した場合
「入力した数式は正しくありません」は表示しなくなりましたが
キャンセル選択時同様最終的には
Exit Subになってしまいました。
インプットBOXに空白でOKを選択時は
入力忘れと仮定して
記述した「再入力を促すMsgBox」を表示させたいのです。
ちょっとわがままな仕様かもしれません。
どうもありがとうございました。

お礼日時:2011/04/12 10:30

InputメソッドのTypeを外し、次のコードを変更で如何でしょうか。


If Len(指示数) <= 8 Then ⇒ If Len(指示数) <= 8 And Val(指示数) Then 

この回答への補足

申し訳ありません。

Val関数は
文字列に数字以外があった場合読込を止める
とヘルプにありました。

12345ABCと入力すると
12345だけが返り8文字以内なので
次の処理へ移りますが
12345678のつもりで
12345ABCと入力したと仮定しなければ
なりませんのでエラーでないとまずいのです。
同じく
123456の所
123X56と誤って入力した場合
123だけが返ってしまい次の処理に移ってしまいます。

インプットBoxへの入力は
・1文字~8文字以内でそれ以外はエラー
・整数である事
・入力内に数字以外があったらエラー
・整数なら全角でも半角でもOK
・空白でOKを選択してもエラー
・エラーは記述したMsgBoxを表示

としたいのですが、やはりType:=1を入れるべきでしょうか?
これなら空白でOKを選択した時意外は
思ったとおりの動きなんですが....

補足日時:2011/04/08 11:09
    • good
    • 0
この回答へのお礼

ありがとうございます。

空白でOKを選択すると
記述したMsgBoxが表示されました。
また数値以外が入っていても
記述したMsgBoxが表示されました。
ただ
4と半角なら通過しますが
4と全角だとはねられて
記述したMsgBoxが表示されてしまいます。

次の処理で
指示数2 = StrConv(指示数, vbNarrow) '全角→半角
があり
インプットBOXへの入力は
数字1文字以上8文字以内なら
全角でも半角でも受け付けるようにしています。
(入力者がPC苦手でひらがなのまま数字入力する場合が
 あり入力者は正しいと思っている。)
よって全角ではねられると作業者から呼ばれるので
それが困りました。

お礼日時:2011/04/08 10:21

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A