エクセル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に戻る
---次の処理
No.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
ご丁寧にありがとうございます。
【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, "+")」
に修正してきます。
いろいろとありがとうございました。
No.4
- 回答日時:
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
お礼が遅れて申し訳まりません。
>ご希望の動作になるかと思います。
はい。なりました。
インプット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を複数作成しました。
できあがった構文は
追記に入れました。
どうもありがとうございました。
No.3
- 回答日時:
NO1です。
>全角でも半角でも受け付けるようにしています。
⇒この処理を前倒しにする方法がベターだと思います。
余裕があれば、面倒ですがユーザフォームを作成して入力する方法は如何でしょうか。
テキストボックスのプロパティからIMEモードや入力長制限を設定できますのでご検討
下さい。(参考サイトのURL添付します)
参考URL:http://www.eurus.dti.ne.jp/~yoneyama/
ありがとうございます。
今回教えていただいた内容ですが
現在の私の技量では
ちょっと難しくて対応が難しいです。
申し訳ありません。
No.2
- 回答日時:
横レス失礼します。
「入力値を【数値とみなせる】か」は、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の戻り値との比較時には
数値とみなされて判定されるようです)
ありがとうございます。
ご回答いただく前に
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」を表示させたいのです。
ちょっとわがままな仕様かもしれません。
どうもありがとうございました。
No.1
- 回答日時:
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を選択した時意外は
思ったとおりの動きなんですが....
ありがとうございます。
空白でOKを選択すると
記述したMsgBoxが表示されました。
また数値以外が入っていても
記述したMsgBoxが表示されました。
ただ
4と半角なら通過しますが
4と全角だとはねられて
記述したMsgBoxが表示されてしまいます。
次の処理で
指示数2 = StrConv(指示数, vbNarrow) '全角→半角
があり
インプットBOXへの入力は
数字1文字以上8文字以内なら
全角でも半角でも受け付けるようにしています。
(入力者がPC苦手でひらがなのまま数字入力する場合が
あり入力者は正しいと思っている。)
よって全角ではねられると作業者から呼ばれるので
それが困りました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA Boxが空白の場合のメッセージボックス 2 2023/06/14 11:06
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Excel(エクセル) Excelにの以下の設定方法について教えてください! C列にデータ入力の設定をしています。(出、入を 3 2022/06/22 01:33
- Excel(エクセル) 製品番号での整列と、検索に関して 3 2023/06/28 19:20
- Excel(エクセル) VBAで “:” を含むセルの特定 2 2023/05/11 16:30
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
Excel VBAで、Application.InputBoxのキャンセルと入力値ゼロを区別したい。
Visual Basic(VBA)
-
VBAでInputBoxの再入力をさせるには?
Visual Basic(VBA)
-
InputBoxの入力値を半角数字のみと限定する方法
Excel(エクセル)
-
-
4
EXCEL VBA でインプットボックスを開いたときの入力モードの設定について
Excel(エクセル)
-
5
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
6
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
7
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
8
エクセル イベントマクロ Changeイベントを複数作りたい
Access(アクセス)
-
9
InputBox キャンセルボタンが押された時の処理
Excel(エクセル)
-
10
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
11
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
-
12
ACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ
Access(アクセス)
-
13
全ての変数を一気にリセットする方法はありますか?
PowerPoint(パワーポイント)
-
14
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
-
15
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
16
エクセルVBAで、MsgBox やInputBox は、画面の中央以外に表示させたい。
Excel(エクセル)
-
17
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
-
18
Excel VBA 空白セルがあったらメッセージボックスで知らせたい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
中が黄の広をexcelに打ち込む方...
-
エクセル true false どういう...
-
英語におけるローマ数字の読み...
-
「 ' 」(上カンマ)が表示し...
-
インプットBox Type:=1で空白で...
-
タイピング分速450文字以上の人...
-
漢字が入力したい
-
漢字の入力方法
-
キーボード入力
-
Google Mail での宛先の入れ方
-
エクセルでセルに何らかの文字...
-
郵便番号から
-
Word のグリット線の設定でこう...
-
つに点々を入力したい・・・
-
€(ユーロ) 、¢ (セント...
-
FF11内で文字入力が正常に行え...
-
【漢字】上丸の出し方を教えて...
-
【Excel】郵便番号を入力し、隣...
-
写真に日付を入れるのがそんな...
-
サンダーバードでシングルクリ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
中が黄の広をexcelに打ち込む方...
-
「 ' 」(上カンマ)が表示し...
-
エクセル true false どういう...
-
キーボード入力
-
英語におけるローマ数字の読み...
-
漢字の入力方法
-
エクセルでセルに何らかの文字...
-
km²(平方キロメートル)を入力...
-
Google Mail での宛先の入れ方
-
漢字が入力したい
-
二の字点のPCでの打ち方
-
Excelでメールアドレスを入力す...
-
€(ユーロ) 、¢ (セント...
-
インプットBox Type:=1で空白で...
-
入力したいと思うのですが□のマ...
-
つに点々を入力したい・・・
-
ローマ字入力のままで「づ」を...
-
タイピング分速450文字以上の人...
-
「う」の濁音
-
これ、何でしょう???
おすすめ情報