[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『InputBoxについて』(jr4ojb)
下記のようなマクロを組んでいます。InputBoxに入力する数値の桁数を6桁にするとデバッグになります。
5桁までなら動くのですが・・・?解決方法はありませんでしょうか?
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Sub 印刷101B4Ver3()
Dim buf1 As Integer, buf2 As Integer buf1 = InputBox("印刷を開始する生徒の出席番号を入力してください") buf2 = InputBox("印刷を終了する生徒の出席番号を入力してください")
If MsgBox("出席番号" & buf1 & "番から" & buf2 & "番までを印刷します。よろしいですか?", vbYesNo) = vbYes Then For i = buf1 To buf2 Range("n3").Select ActiveCell.FormulaR1C1 = buf1 ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _ IgnorePrintAreas:=False buf1 = buf1 + 1 If buf1 = buf2 + 1 Then Exit For Next i Else MsgBox "処理を中断しました" End If End Sub −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
< 使用 Excel:Excel2013、使用 OS:Windows8 >
buf1 As Long
数字以外が入力されるとエラーですが大丈夫ですか。
キャンセルでもエラーですが大丈夫ですか。
(マナ) 2019/05/20(月) 18:59
ぶつかり。
「デバッグになります。」ではなくちゃんとエラー内容を書くこと。 と、言うかエラーに書かれたことの意味を理解しようとしてください。
VBA オーバーフロー で検索すればすぐ出てきますよ。 http://officetanaka.net/excel/vba/error/execution_error/error_6.htm (BJ) 2019/05/20(月) 19:01
参考まで。
https://kosapi.com/post-1135/
(OK) 2019/05/20(月) 19:07
以上よろしくお願いします。
(jr4ojb) 2019/05/21(火) 07:53
>ぶつかり さん
(BJ)さんですよ
>エラー表示から,何か新しいヒントがあればお願いします。
ヒントどころか、答えがでてますよ。
(マナさんが【2019/05/20(月) 18:59 】に投稿しています)
また、余計なお世話でしょうけど・・・
>デバッグになります。
そもそも、「デバッグ」の認識が違うと思います。
一度、「デバッグとは」というキーワードで検索してみてください。
検索いただくとわかると思いますが、デバッグになっているのではなく、【実行時エラー】が発生したので、"デバッグ"(=プログラム修正作業)をするか、とりあえずプログラムをそのまま終わらせる(中止する)かエクセル君から聞かれている状態です。
用語なんてどうでもいいかもしれませんが、調べ物をするときに知っているのと知らないとでは差が出ると思いますので、覚えておかれるとよいとおもいます。
◆以下蛇足です。◆
実行時エラーが発生しているということは、プログラムに何らかの問題があり、想定してなかった動作になっているということですから、これを”修正”しなければなりません。
この修正作業を行うのに必要なのが、
・【なぜ】エラーが発生したのか
・【どこで】エラーが発生したのか
という情報になります。
このうち、【なぜ】の部分は、エラーコードとエラーメッセージで表示されます。
はじめはわかりづらいとおもいますので、エラーメッセージをそのままネット検査されるとどのようなエラーであるのか丁寧に解説してるサイトがたくさんヒットするかとおもいます。
また、【どこで】の部分は、エクセル君が「デバッグ作業をする」or「プログラムの実行を中断する」を聞いているときに「デバッグ作業をする」のほうを選択すると、どの部分でエラーが発生したか(どの部分が実行できなかったのか)黄色くハイライトしてその個所を教えてくれます。
今回、エラーが出るのは↓の箇所ですよね?
buf1 = InputBox("印刷を開始する生徒の出席番号を入力してください")
すでに答えは出てますが、提示されたコードでは変数「buf1」をInteger型として宣言しています。
そして、Integer型に格納できる値は「-32,768〜32,767の整数」というように決まっています。
なので、結果としてオーバフローというエラーが発生しています。
なので、「-2,147,483,648〜2,147,483,647の整数」が扱えるLong型にするようアドバイスを受けています。
(当然ですが、buf1だけ直した場合、同じ原因でbuf2のほうがエラーになります)
主な型については↓をご覧ください。
http://officetanaka.net/excel/vba/variable/03.htm
ちなみに、好みによりますが、なんでも型であるVariant型で受け取って、それが数値としてみなせるか判定するという方法もアリだとおもいます。
Sub さんぷる() Dim tmp As Variant
tmp = InputBox("適当に入力してください")
If IsNumeric(tmp) Then MsgBox "数値です" Else MsgBox "数値ではありません" End If
End Sub
(もこな2) 2019/05/21(火) 13:00
丁寧な解説ありがとうございます。
大変助かりました。
時間がとれたので先ほど以下のように訂正してみました。
すると正常に動作しました。
ありがとうございました。
buf1 As Integer
↓
buf1 As Long
サンプルも示していただいたので試してみたいと思います。
皆さん,誠にありがとうございました。
(jr4ojb) 2019/05/21(火) 16:46
桁数で見てみると
Integer型は5桁からなる整数です。
Long型は10桁からなる整数です。
よってInteger型の許容範囲を超えたためエラーメッセージが表示さたのです。
() 2019/05/21(火) 21:48
また、↓の処理も不自然な感じに思います。(動きはするでしょうけど・・・)
buf1 = buf1 + 1 If buf1 = buf2 + 1 Then Exit For
踏まえてこんな感じのことがされたいのでは?
Sub 印刷101B4Ver3_改() Dim i As Long Dim buf1 As Variant, buf2 As Variant buf1 = InputBox("印刷を開始する生徒の出席番号を入力してください") buf2 = InputBox("印刷を終了する生徒の出席番号を入力してください")
'▼数値が入力されたか判定 If Not IsNumeric(buf1) And Not IsNumeric(buf2) Then MsgBox "入力値のいずれかが数値ではありません" & vbcrlf & "処理を中断します" Exit Sub End If
'▼主処理 If MsgBox("出席番号" & buf1 & "番から" & buf2 & "番までを印刷します。よろしいですか?", vbYesNo) = vbYes Then For i = buf1 To buf2 ActiveSheet.Range("N3").Value = i ActiveSheet.PrintOut Next i End If
MsgBox "正常終了しました"
End Sub
なお、このサイトでは投稿した人の名前は下に出ます。
↓このへん
(もこな2) 2019/05/21(火) 23:39
jr4ojbさん 戻り値のデータ型を制限したいのなら Application.InputBoxメソッドの方がいいと思いますよ? https://docs.microsoft.com/ja-jp/office/vba/api/excel.application.inputbox
IsNumeric 関数はバグがありますので、このケースは止めた方が無難です。 (seiya) 2019/05/22(水) 09:10
IsNumeric関数の仕様として数値と判断できるものは True となるので、
マイナス値("-1234")や指数表記("123e4", "123d4")、16進数表記(&h1234)
などもTrueになので、今回の場合は、避けたほうがいいというのは同意です。
出席番号が5桁または6桁の数字ということなら、下記のような条件判断にするのが確実かな。
If Not((buf1 Like "#####" Or buf1 Like "######") And (buf2 Like "#####" Or buf2 Like "######")) MsgBox "出席番号が間違ってます。" & vbcrlf & "処理を中断します" Exit Sub End If
(hatena) 2019/05/22(水) 12:20
hatenaさん
その他に 1,,,,とか 1d5 でもTrueが返ります。 ユーザーは色々な間違いをしますからね... (seiya) 2019/05/22(水) 12:39
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.