• ベストアンサー

エクセルマクロで印刷範囲の設定

エクセルのsheet1に表があります。 この表を印刷ボタンを押すだけで印刷できるようにしようと思います。データの最後の行までのページを印刷できるようにするマクロを教えてください。 ちなみに、今ある最後のデータより下の行もずっと罫線が引いてあります。 また、印刷だけだったら普通に 印刷>ページの指定 でできるよと思われるかもしれませんが、その他の機能もマクロでつくっている最後の段階なのでマクロでお願いいたします。 分かりにくい文章ですがよろしくお願いします。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

>データの最後の行までのページを印刷できるようにする データの最終行を、泥臭く、一行一行空白かと聞いて探すことにします。 >最後のデータより下の行もずっと罫線が引いてあります。 印刷したデータ最終行の下辺は罫線がないと、締りがなくて、いやですから罫線を引きます。 >最後のデータより下の行もずっと罫線が引いてあります 難しいのは、その罫線表に一杯にデータが入った時、1ページで印刷できるものかどうかです。 次ページに跨る場合は見だし部分などを次ページ(以下)にも印刷せねばならないでしょうから。 改ページなしに印刷するメソッドを知らないので、別シートに編集して、そのページが別シートに完成後、別シート を印刷します。 Sub test01() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("sheet1") Set sh2 = Worksheets("sheet2") '--一たんすべてコピー sh1.Range("a1:e50").Copy sh2.Activate sh2.Range("a1").Select ActiveSheet.Paste Application.CutCopyMode = False '------データ行について j = 3 p01: For i = 3 To 2 + 40 If sh1.Cells(j, "A") = "" Then Exit For sh2.Cells(i, "A") = sh1.Cells(j, "A") sh2.Cells(i, "B") = sh1.Cells(j, "B") sh2.Cells(i, "C") = sh1.Cells(j, "C") sh2.Cells(i, "D") = sh1.Cells(j, "D") sh2.Cells(i, "E") = sh1.Cells(j, "E") j = j + 1 Next i sh2.Range(Cells(i - 1, "A"), Cells(i - 1, "E")).Borders(xlEdgeBottom).LineStyle = xlContinuous sh2.Range(Cells(i, "A"), Cells(50, "E")).Clear ' sh2.Range(Cells(1, "A"), Cells(50, "E")).PrintOut '----42行を越えると繰り返し If i > 2 + 40 Then sh2.Range("A3:E42").ClearContents GoTo p01 End If End Sub この質問ぐらいの内容になると、マクロの記録の技量だけでは難しい気がします。上記も類似(と思っている)例で出来る例がありますというヒント程度を示すものであり、VBAの経験者があちこちチューニングして、初めて質問の目的のようになるのであって、そのままで一発で動くとか思い通りであることは期待できません。実際の問題を目の前においてプログラムを組まないと、ちょっとした違いでも動かないとか結果がおかしいことがありますので、甘く期待しないで下さい。 もちろん少数例ではテスト済みですが。 テストはSheet2を全セル指定、編集-クリア-すべて、でクリアして繰り返してやって下さい。

ijnnenhhh
質問者

お礼

いつもお世話になります。 今回は、なんとか出来ましたので今後参考にさせていただきます。 お礼が大変おそくなりご迷惑をおかけしました。ありがとうございました。

その他の回答 (3)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

#2さんの回答とほとんど同じですが、書式設定してあると xlLastCell はデータの最終を返さないと思います。 A列のデータ最終を最終行として A1:Cxx行を範囲とする例です。 Sub Test() With ActiveSheet  .PageSetup.PrintArea = _  .Range("A1:C" & .Range("A65536").End(xlUp).Row).Address End With End Sub

ijnnenhhh
質問者

お礼

回答ありがとうございました。 今回は、なんとか出来ましたので今後参考にさせていただきます。 お礼が大変おそくなりご迷惑をおかけしました。

  • chupark
  • ベストアンサー率41% (90/218)
回答No.2

 "データの最後の行"というのをどのように認識されてますか?  sheet1の使われている最後のセル、いわゆるSpecialCells(xlLastCell)まででしょうか?    また、改ページはどうされるのでしょうか?  など、少しわからない点があるので詳しいソースはかけませんでした。  しかし、印刷範囲の指定は、たとえばA1セルからG50セルまでを印刷範囲とする場合、    WorkSheets("sheet1").PageSetup.PrintArea = "A1:G50"  のように指定できたと思います。  データの最後の行を取得してきてこの範囲にあてはめればどうでしょうか。 

ijnnenhhh
質問者

お礼

回答ありがとうございます。 一応、試行錯誤した結果できるようになりました。 -------------------------------------------------- Range("B2:J2").Select Range(Selection, Selection.End(xlDown)).Select ActiveSheet.PageSetup.PrintArea =Selection.Address ActiveWindow.SelectedSheets.PrintOut Copies:=1, -------------------------------------------------- Range("B2:J2")は、タイトル行です。 >データの最後の行を取得してきてこの範囲にあてはめればどうでしょうか。 この方法ではエラーになってしまいました。 基本がないので、なかなか皆さんの回答を読んでも理解するのに時間がかかり御礼が遅くなりました。 またよろしくお願いします。ありがとうございました。

  • nemaro
  • ベストアンサー率28% (40/139)
回答No.1

シートの「印刷範囲の指定」ではいけませんか? 1.印刷したい範囲をドラッグして選択します(たとえばC3からG20のように) 2.ツールバー「ファイル」=>「印刷範囲」=>「印刷範囲の設定」 3.必要に応じて「印刷プレビュー」で調整してください。

ijnnenhhh
質問者

お礼

回答ありがとうございます。 >「印刷範囲の指定」ではいけませんか? 今回は、誰でも(エクセルの使えない人でも)ボタン1つできれいに印刷まで出来るように作りたかったのでこの方法は使えませんでした。説明不足ですみません。 ありがとうございました。

関連するQ&A