[[20190520184038]] 『InputBoxについて』(jr4ojb) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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 Integer
  ↓
 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


お世話になります。
すみませんでした。
エラー表示は以下のように表示されます。

実効値エラー '6':
オーバーフローしました。

ぶつかり さんが教えてくださったページを参考にチャレンジしてみようと思います。
エラー表示から,何か新しいヒントがあればお願いします。

以上よろしくお願いします。

(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


(BJ)さん

丁寧な解説ありがとうございます。
大変助かりました。
時間がとれたので先ほど以下のように訂正してみました。
すると正常に動作しました。
ありがとうございました。

buf1 As Integer
  ↓
buf1 As Long

サンプルも示していただいたので試してみたいと思います。
皆さん,誠にありがとうございました。

(jr4ojb) 2019/05/21(火) 16:46


>InputBoxに入力する数値の桁数を6桁にするとデバッグになります。
5桁までなら動くのですが・・・?

桁数で見てみると

Integer型は5桁からなる整数です。
Long型は10桁からなる整数です。

よってInteger型の許容範囲を超えたためエラーメッセージが表示さたのです。
() 2019/05/21(火) 21:48


おまけで。
ActiveWindow.SelectedSheets.PrintOut とされてますけど、本当に作業グループにしたうえでまとめて印刷したいのですか?
普通にアクティブシートだけ対象にすればよかったりしませんか?

また、↓の処理も不自然な感じに思います。(動きはするでしょうけど・・・)

 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

seiyaさん、
IsNumeric関数にバグがあるとは知りませんでした。
どのようなものでしょうか。

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.