こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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)と同様の処理にしたい

というものです。
初心者のためご教授ください。
よろしくお願いいたします。

投稿日時 - 2009-03-11 21:19:52

QNo.4788601

困ってます

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

こんにちは。

二つの条件の内、(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 はありえませんが、入れ忘れがありますから、変数で取ります。ページ数を逆に入れた場合は、入れ替えればよいですし、全ページ数の入れ間違いは、自動で修正すればよいです。また、最終的に、一度、対話形式で印刷ページをチェックすればよいです。まあ、ループは不要というよりも、ページ番号をセルに出すなら、ループはやむをえないです。

投稿日時 - 2009-03-12 11:01:46

ANo.3

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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)に変更
変数が空白なら処理中止
変数が数値でなければ処理中止
終了より開始が大きければ処理中止
ループ処理を削除し、印刷の設定で開始、終了ページを設定
その際、変数を数値化すると共に小数点以下が合った場合に切り捨てする
以上参考にしてください

投稿日時 - 2009-03-12 01:29:22

ANo.1

例えばxが数値であるかどうかは
 If IsNumeric(x) Then ~  で判断できます。
同様に、xが空白かどうかは x = ""、 x、yの大小比較は x < y などを条件として If 文で分岐すれば良いでしょう。

ご質問内容とは関係ないのでうよけいなおせっかいではありますが、現状で正しく値を入れたとして、予定通りの動作になっていますか?
確認してませんけれど、同じシートが何枚もプリントされるみたいだけど…

投稿日時 - 2009-03-11 21:45:11

あなたにオススメの質問