- ベストアンサー
Excel2003の指示数入力時の条件と処理
- Excel2003において、指示数を入力する際の条件と処理について解説します。
- インプットBoxのType:=1で数値を入力させる際は、整数で1文字以上〜8文字以内に制限します。
- キャンセル選択時は「終了」メッセージを表示し、指示数の入力を続行しません。
- みんなの回答 (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
その他の回答 (4)
- DexMachina
- ベストアンサー率73% (1287/1744)
No.2です。 > インプットBOXに空白でOKを選択時は > 入力忘れと仮定して > 記述した「再入力を促すMsgBox」を表示させたいのです。 でしたら、VBAのInputBox関数からApplication.InputBoxに戻す必要がありますね(汗) 前回の回答に対して、以下のように改修すれば、ご希望の動作になるかと思います。 【現状(改修部分のみ抜粋・コメントは省略)】 指示数 = InputBox("指示数を数字で入力してください") If 指示数 = "" Then 【改修後(抜粋部分を置き換え)】 指示数 = Application.InputBox("指示数を数字で入力してください") If 指示数 = "" Then MsgBox "空白は指定できません" ElseIf 指示数 = "False" Then ・・・以上です。 取り急ぎ、参考まで。
お礼
お礼が遅れて申し訳まりません。 >ご希望の動作になるかと思います。 はい。なりました。 インプット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を複数作成しました。 できあがった構文は 追記に入れました。 どうもありがとうございました。
補足
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
- mu2011
- ベストアンサー率38% (1910/4994)
NO1です。 >全角でも半角でも受け付けるようにしています。 ⇒この処理を前倒しにする方法がベターだと思います。 余裕があれば、面倒ですがユーザフォームを作成して入力する方法は如何でしょうか。 テキストボックスのプロパティからIMEモードや入力長制限を設定できますのでご検討 下さい。(参考サイトのURL添付します)
お礼
ありがとうございます。 今回教えていただいた内容ですが 現在の私の技量では ちょっと難しくて対応が難しいです。 申し訳ありません。
- DexMachina
- ベストアンサー率73% (1287/1744)
横レス失礼します。 「入力値を【数値とみなせる】か」は、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」を表示させたいのです。 ちょっとわがままな仕様かもしれません。 どうもありがとうございました。
- mu2011
- ベストアンサー率38% (1910/4994)
InputメソッドのTypeを外し、次のコードを変更で如何でしょうか。 If Len(指示数) <= 8 Then ⇒ If Len(指示数) <= 8 And Val(指示数) Then
お礼
ありがとうございます。 空白でOKを選択すると 記述したMsgBoxが表示されました。 また数値以外が入っていても 記述したMsgBoxが表示されました。 ただ 4と半角なら通過しますが 4と全角だとはねられて 記述したMsgBoxが表示されてしまいます。 次の処理で 指示数2 = StrConv(指示数, vbNarrow) '全角→半角 があり インプットBOXへの入力は 数字1文字以上8文字以内なら 全角でも半角でも受け付けるようにしています。 (入力者がPC苦手でひらがなのまま数字入力する場合が あり入力者は正しいと思っている。) よって全角ではねられると作業者から呼ばれるので それが困りました。
補足
申し訳ありません。 Val関数は 文字列に数字以外があった場合読込を止める とヘルプにありました。 12345ABCと入力すると 12345だけが返り8文字以内なので 次の処理へ移りますが 12345678のつもりで 12345ABCと入力したと仮定しなければ なりませんのでエラーでないとまずいのです。 同じく 123456の所 123X56と誤って入力した場合 123だけが返ってしまい次の処理に移ってしまいます。 インプットBoxへの入力は ・1文字~8文字以内でそれ以外はエラー ・整数である事 ・入力内に数字以外があったらエラー ・整数なら全角でも半角でもOK ・空白でOKを選択してもエラー ・エラーは記述したMsgBoxを表示 としたいのですが、やはりType:=1を入れるべきでしょうか? これなら空白でOKを選択した時意外は 思ったとおりの動きなんですが....
お礼
ご丁寧にありがとうございます。 【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, "+")」 に修正してきます。 いろいろとありがとうございました。