- ベストアンサー
EXCEL VBA初心者のための印刷ループの改善方法
- EXCEL VBA初心者の方が作成した印刷ループのVBAを改善する方法について解説します。
- 問題点として、開始番号と終了番号が空白の場合や開始番号が終了番号より大きい場合の処理が不足しています。
- これらの問題点を改善するためのVBAの修正方法について詳しく説明します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 二つの条件の内、(2)は、修正すればよいと思います。 Sub 連続印刷R() Dim x As Variant Dim y As Variant Dim i As Integer Dim t As Integer Dim msg As String Dim tp As Variant On Error Resume Next tp = ExecuteExcel4Macro("GET.DOCUMENT(50)") On Error GoTo 0 msg = "ページの番号を入力してください" x = Application.InputBox("先頭" & msg, Type:=2) If x = "" Or VarType(x) = vbBoolean Then Exit Sub x = CInt(x) y = Application.InputBox("最終" & msg, Type:=2) If y = "" Or VarType(y) = vbBoolean Then Exit Sub y = CInt(y) If x > y Then t = y: y = x: x = t End If If x > tp Then x = tp '最終ページ修正 If y > tp Then y = tp '最終ページ修正 If MsgBox(x & "ページから" & y & "ページを印刷します。" & vbCr & _ "よろしいですか?(全" & tp & "ページの内)", vbInformation + vbOKCancel) = vbCancel Then Exit Sub End If With Worksheets("1") For i = x To y .Range("B1").Value = i '変数 i を代入 .PrintOut From:=i, To:=i ', Preview:=True Next i End With End Sub なお、InputBox メソッドの入力に0 はありえませんが、入れ忘れがありますから、変数で取ります。ページ数を逆に入れた場合は、入れ替えればよいですし、全ページ数の入れ間違いは、自動で修正すればよいです。また、最終的に、一度、対話形式で印刷ページをチェックすればよいです。まあ、ループは不要というよりも、ページ番号をセルに出すなら、ループはやむをえないです。
その他の回答 (2)
- hige_082
- ベストアンサー率50% (379/747)
ループは必要ないと思います #1さんの回答を踏まえて 修正しました Sub 連続印刷() Dim x As String Dim y As String x = Application.InputBox( _ prompt:="先頭ページの番号を入力してください") y = Application.InputBox( _ prompt:="最終ページの番号を入力してください") line: If x = "" Or y = "" Then Exit Sub If Not (IsNumeric(x) Or IsNumeric(y)) Then Exit Sub If x > y Then Exit Sub Worksheets("1").PrintOut from:=CInt(x), to:=CInt(y) End Sub 変更点 変数の宣言は、InputBoxの戻り値が文字列なので文字列(String)に変更 変数が空白なら処理中止 変数が数値でなければ処理中止 終了より開始が大きければ処理中止 ループ処理を削除し、印刷の設定で開始、終了ページを設定 その際、変数を数値化すると共に小数点以下が合った場合に切り捨てする 以上参考にしてください
- fujillin
- ベストアンサー率61% (1594/2576)
例えばxが数値であるかどうかは If IsNumeric(x) Then ~ で判断できます。 同様に、xが空白かどうかは x = ""、 x、yの大小比較は x < y などを条件として If 文で分岐すれば良いでしょう。 ご質問内容とは関係ないのでうよけいなおせっかいではありますが、現状で正しく値を入れたとして、予定通りの動作になっていますか? 確認してませんけれど、同じシートが何枚もプリントされるみたいだけど…