[[20100823172154]] 『データの入っていないページを印刷しない方法』(みく) >>BOT

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

 

『データの入っていないページを印刷しない方法』(みく)
 すいません、質問したのが無くなってしまってるので再度お願いします。

 読取り専用のブックがありまして、
 そのシートのA1:X500にデータが入るようになっています。
 データは見易いように罫線で囲っています。
 そして、毎日データを入力し、新たに名前を付けて登録しています。
 そこで、印刷をしようとすると、データが入っていない箇所も印刷してしまうので
 困っています。
 毎日することでもあり、どこかで設定しておく事ができれば楽になっていいのですが
 よろしくお願いします。

 A1〜X列の範囲でデータが入力されている範囲を印刷するわけ?
 一番安易な方法ですが、、(ウッシさんから怒られそー ^^;)

 標準モジュールに張り付けて、実行です。。
 Sub test()

    ActiveSheet.PageSetup.PrintArea = "A1:X" & Selection.SpecialCells(xlCellTypeLastCell).Row
    ActiveWindow.SelectedSheets.PrintPreview
 End Sub
 (kei)

 私なら
1.その都度印刷範囲を手動で設定して印刷する。
2.印刷したくない範囲は非表示にしてから印刷する。
3.オートフィルタで印刷したい範囲のみ表示させて印刷する。
4.名前定義のPrint_Areaの参照範囲に印刷範囲を自動で規定する関数式を仕込む。
5.マクロで印刷範囲を自動で規定するようにする。
などを検討してみます。
どの方法が適しているのかはシートの作り方によります。
 
もしかして、↓の続きなんでしょうか。
[[20100413102223]] 『データ表を印刷する時にページ数を印字させるには』(みく)
 
エクセルはデータのあるなしだけではなくて、「印刷できるものがあるセル」を
自動的に印刷範囲にします。
だから、なにか「ぽちっ」と押しておけば自動的に印刷してほしいところだけを
印刷してくれるような「設定」はないと思いますよ。
個人的には「印刷したくない部分は削除、または非表示」だと思っています。
 
例えば、同じ罫線でも、条件付書式で描画されているものは「印刷できるものがあるセル」
とは認識されないという性質があります。
罫線の種類で物足りない部分はありますが、罫線を条件付書式のみで描画しておくことで
セルに入力のある部分だけ印刷する、ということは可能かもしれません。
 
/////////////////////////////////////////
↑の例
新規シートのA1に適当な文字列を入力、
C列全体を条件付書式で必ず罫線が引かれる設定に。
(「数式が」「=ROW(C1)=ROW()」など)
そのまま印刷プレビューすると、A1しか印刷範囲とならない。
C列の適当なセルに何か入力すると、そのセルまでが印刷範囲となるが、
その行以降に見えている罫線は印刷されない。
/////////////////////////////////////////
 
ただし、この場合でも、関数・数式で空白文字列("")がセルに返っている場合は
入力されているセルとみなされます。
 
また、単純な表であれば、書式設定の罫線を利用せずに、
ページ設定>シートタブ>枠線 にチェック、という手もありますね。
 
(みやほりん)(-_∂)b

 どうもありがとうございます。
 家に帰ってきたので、簡単に作ってkeiさんの方法で試して見たのですが
 データが入っていない箇所も罫線が印刷されてしまいます。

 みやほりんさんどうもありがとうございます。
 [[20100413102223]] 『データ表を印刷する時にページ数を印字させるには』(みく)
 の続きではありますが、この時はページ数を印刷させるのとデータが入っていない箇所は
 印刷されないようにできないかと相談しまして解決はできました。
 ところが、ページ数を印刷しないほうがよくなってしまい ページ数を印刷しない方法は
 なんとか分かったのですが、なぜかデータが入っていない箇所が印刷してしまうようになってしまい
 良く分からなくなってしまったので、あらたに質問をさせてもらいました。
 データが入っていない箇所を印刷しない方法はあるようです。
 毎日のことなので、手動で設定するのは面倒なので何とかしたいのです。
 よろしくお願いします。

(みく)


こんばんは

 A1:X500 にデータが入っているという状態は、1行ずつデータが入力されるという事ですか?
 1件データが入力されると A1から X1 までデータで埋まるのですか?
 そこらへんがはっきりしないとデータの入っている最終行まで印刷するのか、
 最終列まで印刷するのか、データの入っているセルまで印刷するのか分かりません。

 取り敢えず、セルA1 からセルの入っているセルまで印刷するとすると、

 Sub test()
    Dim r As Range
    With Range("A1:X500")
        On Error Resume Next
        Set r = Intersect(Range("A1:X500"), .Range(.Range("A1"), .SpecialCells(xlCellTypeConstants)))
        If Not r Is Nothing Then
            .Parent.PageSetup.PrintArea = r.Address(0, 0)
            ActiveWindow.SelectedSheets.PrintPreview
        Else
            MsgBox "印刷データ無し"
        End If
        On Error GoTo 0
    End With
End Sub

(ウッシ)


 みなさん、こんばんわ。。
 再挑戦しました。おかしー箇所は指摘してください。。

 Sub test2()
    Dim i As Byte, j As Long, k As Long

    For i = 1 To 24
        j = Cells(Rows.Count, i).End(xlUp).Row
        If k < j Then k = j
    Next i
    ActiveSheet.PageSetup.PrintArea = "A1:X" & k
    ActiveWindow.SelectedSheets.PrintPreview
 End Sub
 (kei)


 説明するのが下手でご迷惑おかけしてすいません。
 データはA1からX1まで入ります。そして順番にA2からX2というように入っていきまして
 例えば、A1の行に項目が入ってまして、A2の行以下は商品の売り上げデータが入っています。
 A列は日付が入りましてB列は時刻・・・・。
 上の行から順番にデータが入力され、3個の売り上げデータしかなかったとすると
 A4からX4の行でデータは終わりの状態なのです。
 ですから、印刷はA1:X4まででいいのです。
 夜分にすいません。 (みく) 

 ウッシさんとkeiさんの一度試して見たのですが上手くいきませんでした。
 マクロが読めないもので、どこが悪いのかいいのかさっぱりでごめんなさい。

 ひょとすると、A列の日付は連番みたいにずーっと下まであるのでしょうか?
 また、列によっては関数などが埋め込まれていて、見た目は空白っぽいけど、""の状態が下まであったり?
 手入力で確実に入力される列はどこかあるの?(データに空白のない列)
 (kei)

 A列はデータが入らなければ、完全に空白でその行も全て空白になります。
 ただ罫線だけはあります。
 (みく)

 おはよーございます。
 >また、列によっては関数などが埋め込まれていて、見た目は空白っぽいけど、""の状態が下まであったり?
 つまり、関数などが事前に下の行まで入力されている列はないの?
 A列〜X列までのデータは、すべて手で入力されているのでしょうか?
 それと、ウッシさんとわたしのマクロは「罫線」はまったく関係なく、罫線があっても問題ありません。。
 最後に、「この列だけは、データを手入力で入れていて、データ入力には必須の列」はA列〜X列のどれですか?
 (kei)

 おはようございます。
 朝早くからありがとうございますね。
 列には""がありますが、一度A1:X500の部分を「コピー」して、「形式を選択して貼り付け」で「値」
 としているので、""の部分は完全に空白にはなっています。

 説明が悪くてほんとすいません。
 入力するシートがありまして、そこで入力したデータを コピーして 
 今問題にしていますシート(データ一覧表)に貼り付けて
 そして、時刻順に並び替えするようにマクロで処理するようにしています。
 それから、1日分の入力が完了すれば、計算式等で表われてる数値を値としたいので
 コピーして形式を選択して貼り付けをしています。

 (みく)


こんにちは

値が入っている行までなら、

 Sub test()
    Dim r As Range
    With Range("A1:X500")
        On Error Resume Next
'        Set r = Intersect(Range("A1:X500"), .Range(.Range("A1"), .SpecialCells(xlCellTypeConstants)))
        Set r = Intersect(Range("A1:X500"), _
            .Range(.Range("A1"), .SpecialCells(xlCellTypeConstants)).EntireRow)
        If Not r Is Nothing Then
            .Parent.PageSetup.PrintArea = r.Address(0, 0)
            ActiveWindow.SelectedSheets.PrintPreview
        Else
            MsgBox "印刷データ無し"
        End If
        On Error GoTo 0
    End With
End Su

ではどうでしょうか?

(ウッシ)


 ""があったのですね ^^;

 momoさんが以前書かれたコードを範囲を変えて、アップします。。
 Sub momo()
  Dim LastRow As Long

  With ActiveSheet
    LastRow = .Columns("A:X").Find(What:="*", After:=.Range("A1"), LookIn:=xlValues, _
                LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, _
                MatchCase:=False, MatchByte:=False, SearchFormat:=False).Row
    .PageSetup.PrintArea = "A1:X" & LastRow
  End With
    ActiveWindow.SelectedSheets.PrintPreview
 End Sub
 (kei)

 みなさん ほんとうにいろいろ教えていただきましてありがとうございました。
 おかげさまで、できました。
 感謝しております。 (みく)

みくさんと同じ事をやりたいのですが、マクロが読めません。
もしよろしければマクロの解説をしていただけないでしょうか。。
よろしくお願い致します。
(すぎ) 2014/12/17(水) 19:30

 AからX列( .Columns("A:X"))で
 「*(1文字以上の何でもよい文字列)」(What:="*")を
 A1から(After:=.Range("A1"))
 逆方向(SearchDirection:=xlPrevious)に検索すると

 そのページの一番最後の文字が該当するので
 該当するセルの行番号(.Row)を取得して、
 「A1:X最後の文字列セル行」( .PageSetup.PrintArea = "A1:X" & LastRow)ページの範囲を再設定している

 が一番簡単な説明ですけど
 細かいメソッドやプロパティなんかは、ヘルプを参照してみてください。
(稲葉) 2014/12/18(木) 08:32

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.