EXCEL VBA初心者のための印刷ループの改善方法

このQ&Aのポイント
  • EXCEL VBA初心者の方が作成した印刷ループのVBAを改善する方法について解説します。
  • 問題点として、開始番号と終了番号が空白の場合や開始番号が終了番号より大きい場合の処理が不足しています。
  • これらの問題点を改善するためのVBAの修正方法について詳しく説明します。
回答を見る
  • ベストアンサー

EXCEL VBA(初心者)印刷ループについて

こんばんは。 EXCEL VBA初心者です。 以下のような印刷ループのVBAを作りました。 (シート1にデータを入力しシート2で印刷) Sub 連続印刷() Dim x As Integer x = Application.InputBox( _ prompt:="先頭ページの番号を入力してください") Y = Application.InputBox( _ prompt:="最終ページの番号を入力してください") line: Worksheets("1").Select Range("B1").Select For i = x To Y 'ループ開始番号と終了番号を追加 ActiveCell.FormulaR1C1 = i '変数 i を代入するように修正 ' Range("B1").Select ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Next i '次へループ End Sub というものです。 以下の問題点を改善したいのです。 (1)開始番号と終了番号のいずれかが ”空白”の場合は  VBAを中止し何も印刷しない(何もメッセージを表示しない) (2)開始番号が終了番号より数字が大きい場合も(1)と同様の処理にしたい というものです。 初心者のためご教授ください。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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)
回答No.2

ループは必要ないと思います #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)
回答No.1

例えばxが数値であるかどうかは  If IsNumeric(x) Then ~  で判断できます。 同様に、xが空白かどうかは x = ""、 x、yの大小比較は x < y などを条件として If 文で分岐すれば良いでしょう。 ご質問内容とは関係ないのでうよけいなおせっかいではありますが、現状で正しく値を入れたとして、予定通りの動作になっていますか? 確認してませんけれど、同じシートが何枚もプリントされるみたいだけど…

関連するQ&A

  • 別シートのリストを参照して印刷作業をVBA登録

    別シートのリストをVLOOKUPで参照して印刷する作業をVBA登録したいと考えています。 そこで下記のようなVBAを作成しました。 Sub 印刷() z = Application.InputBox("印刷開始番号") x = Application.InputBox("印刷終了番号") For o = z To x Range("G6").Value = o ActiveSheet.PrintOut Next End Sub セルG6をVLOOKUPで参照して、開始ページと終了ページをINPUTBOXで入力できるよに しています。 しかしエラーがでてしまいます。 どこが、問題ありますでしょうか? 宜しくお願いします。

  • Inputboxに開始番号と終了番号を入力し印刷

    InputboxにInputboxに印刷する番号の開始番号と終了番号を入力して、 自動で印刷できるようにしたいと考えています。 シートにはセルG6に数字を入力すれば、VLOOKUPで印刷内容を 変更できるように設定しています。 以下のようなVBAを作成しました。 しかし、Loopが止まらないです。 どうすればよいでしょうか? また他に間違いは有りますでしょうか? Sub 印刷() Do a = InputBox("開始番号を入力") z = InputBox("終了番号を入力") Range("G6") = a a = a + 1 ActiveWindow.SelectedSheets.PrintOut Copies:=1 Loop Until a = z End Sub

  • ナンバリング印刷について

     はじめまして VBA初心者です。下記のようなマクロを見つけました。下記のマクロを実行すると開始番号、終了番号を入力すると印刷までいってしまいます。    開始番号、終了番号を入力した後、開始番号と終了番号の確認画面が出で、確認後に印刷か中止かを選択できるようにしたいと思っています。    よろしくお願いします。 Sub NumberPrint() Dim idx As Integer Dim frmPage, toPage frmPage = Application.InputBox("連番を挿入して印刷します" & Chr(13) _ & "開始番号を入力してください", Type:=1) toPage = Application.InputBox("終了番号を入力してください", Type:=1)  If frmPage > 0 And toPage >= frmPage Then For idx = frmPage To toPage Range("e1").Value = idx ActiveSheet.PrintOut Next idx Else MsgBox "開始番号、終了番号が不適切です。印刷は行いません" End If

  • VBAで指定範囲の整理NOを付けたい

    下記VBAで 整理NOを例えば  最初と最後を0010~0050と指定したいのですが 命令文を指導願います Sub ページ番号付印刷() Dim mypage As Integer mypage = InputBox(Prompt:="最終となるページ番号を入力してください。") For i = 1 To mypage Range("D47") = i ActiveSheet.PrintOut Next End Sub

  • VBAに範囲を指定して印刷

    特定のセルに数字を入力することでVLOOKUPで印刷ページを 検索して指定できるシートを作成しています。 下記のようなVBAを作成しました。 印刷開始ページと印刷終了ページを指定する場合、 セルの指定はどのようにすれば、よいのでしょうか? 開始ページと終了ページが同じセルの為、 開始ページ=Rnage("セル") 終了ページ=Rnage("セル") としてしまいますと、エラーが出てしまいます。 Sub 印刷() Dim S As Long Dim B As Long S = Application.InputBox("印刷開始ページを入力", Type:=1) If 開始ページ = 0 Then Exit Sub B = Application.InputBox("印刷終了ページを入力", Type:=1) If 終了ページ = 0 Then Exit Sub ActiveSheet.PageSetup.Order = xlOverThenDown ActiveWindow.SelectedSheets.PrintOut _ From:=S, To:=B, Collate:=True End Sub 宜しくお願い致します。

  • エクセルの表に複数枚印刷したときに連番をつけたい

    Sub NumberPrint() Dim idx As Integer Dim frmPage, toPage frmPage = Application.InputBox("連番を挿入して印刷します" & Chr(13) _ & "開始番号を入力してください", Type:=1) toPage = Application.InputBox("終了番号を入力してください", Type:=1) If frmPage > 0 And toPage >= frmPage Then For idx = frmPage To toPage Range("AW3").Value = idx ActiveSheet.PrintOut Next idx Else MsgBox "開始番号、終了番号が不適切です。印刷は行いません" End If End Sub過去の質問をみて上記マクロを使用して印刷できましたがスタートの番号は3000001番からスタートさせたいのですがエラーが出てしまいます。どのようなコードにしたらいいのか分からないため教えて下さい。素人で今まで使用したことがないのですいません

  • 作成したVBAの改善点をお願いします(初心者)。

    こんばんは。VBAを勉強中ですが、参考書等を見ながら簡単なプログラムを作ってみましたが、もっと簡単な記述やベテランの方から見た改善点等があれば教えていただければと思います。(EXCEL2000を使用しています)。 ★内容 ・inputboxを使用し印刷枚数を入力し、印刷するものです(印刷枚数は1枚以上31枚以下)。 ・(K23)のセルには通し番号が入っており、印刷した枚数分だけ通し番号に1ずつ足していく。 Sub 印刷() Dim aaa As Integer aaa = InputBox("印刷枚数を入力してください", "印刷枚数", "") If 1 <= aaa And aaa <= 31 Then MsgBox "印刷を開始します" ElseIf aaa = "" Then MsgBox "キャンセルされました" ElseIf IsNumeric(aaa) = False Then MsgBox "入力内容が違います" ElseIf aaa <= 31 Then MsgBox "31日までの範囲で入力してください" Else For i = 0 To aaa Worksheets(1).PrintOut Worksheets(1).Range("k23").Value = Range("k23") + 1 Next i End If End Sub 一応、動きますが、勉強中なのでご教授をお願いいたします。

  • エクセル マクロについて

    Sub Macro1() Set in1 = Application.InputBox(prompt:="入力範囲", Type:=8) i = in1.Offset(1, 0).Value Cells(1, 1).Value = i End Sub とするとエラーがでないのですが、 Sub Macro1() Set in1 = Application.InputBox(prompt:="入力範囲", Type:=8) i = in1.Offset(1, 0).Value Cells(1, 1).Value = i + 1 End Sub とするとエラーがでます。 i+1を表示するには、どう修正すればよいでしょうか。

  • エクセルで連続印刷した範囲を印刷済とわかるように

    エクセルで以下のようなプログラムで変数s、eに入力の範囲でシートの連続印刷しております。印刷し終わった後ですが、変数s~eの範囲を赤くして印刷済かどうかをひと目でわかるようにしたいと思います。可能でしょうか。 Sub 範囲を指定して印刷() Dim s As Long Dim e As Long Dim i As Long On Error Resume Next s = InputBox("開始No.を入力して下さい。") If s = 0 Then Exit Sub e = InputBox("終了No.を入力して下さい。") If e = 0 Then Exit Sub For i = s To e Worksheets("A").Range("C1") = i Application.Wait Now + TimeSerial(0, 0, 10) Worksheets("B").PrintOut Next i End Sub

  • Excel VBA の作り方について【初心者】

    Excel VBA の作り方について質問させてください。 A1セルに「営業部【山本】」と入力されています。 B1セルに「01:35:24」(タイム)と入力されています。 (1)D1セルに「山本」を抜き出して表示 (2)E1セルに「95」(分数)で表示 (3)A2以降で同じ作業の繰り返し(最終入力列まで) というVBAを作成しております。 Sub macro1() '行数確認 nr = Range("A1048576").End(xlUp).Row For i = 1 To nr '名前抜き出し x = Range("A1").Offset(i - 1) j1 = InStr(x, "【") j2 = InStr(x, "】") Range("D1").Offset(i - 1) = Mid(x, j1 + 1, j2 - j1 - 1) '分表示 x = Range("B1").Offset(i - 1) Range("E1").Offset(i - 1) = Int(x * 24 * 60) Next i End Sub ここまではプログラムが完成しています。 この後、 (4)C列セルに入力されている数値をF列セルにそのまま入力 したい場合には、どの部分にどのようなプログラムを追加すればよいでしょうか? よろしくお願いします。

専門家に質問してみよう