[[20150508131221]] 『ヘッダーを可変値(列を指定したい)にする方法はあ』(mia) ページの最後に飛ぶ

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

 

『ヘッダーを可変値(列を指定したい)にする方法はありますか?』(mia)

お世話になります。

シートを印刷する際のヘッダーとして、A列を指定する方法はありますでしょうか?
(特定のセルの値を表示するのではなく、列ごと指定したいのです)

下記のような表があるとして、印刷する際にはB列〜C列を印刷範囲とし、
A列はヘッダーとして出力したいのです。

※A列の値が変わるごとに改ページが挿入されるようvbaで設定しています

   A    B    C
1 野菜 キャベツ 群馬
2 野菜 ピーマン 高知
3 果物 りんご  青森

完成イメージは下記のように出力されてほしい。

−−−−−−−−−−−−−−
野菜

キャベツ 群馬
ピーマン 高知
−−−−−−−−−−−−−−
果物

りんご 青森
−−−−−−−−−−−−−−

最終的には全ての列をA4縦1ページに収めて出力したいのですが、
L列まであるので非常に小さくなってしまいます。

そもそもA列の値が変わる毎に改ページを挿入する構造のため、
識別要素であるA列は頭にひとつ出てくれれば印刷範囲に含めなくて済むという観点です。

このような荒業をvbaで行うことは可能でしょうか?
ご教示よろしくお願いいたします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 あちらで、意向を確認後、コード案を提案しようと思っていたんですが
 お気に触りましたか?

(β) 2015/05/08(金) 13:43


 あちらでアップ予定していたコードです。

 元シート(以下コードでは"Sheet1")はさわらず、印刷用シート(以下コードでは"Sheet2")に整形したものをおいて
 そこで印刷をかけます。(コードでは PrintOut を PrintPreview にしてあります)

 Sub Test()
    Dim shP As Worksheet
    Dim shM As Worksheet
    Dim wkR As Range
    Dim c As Range
    Dim f As Long
    Dim t As Long

    Application.ScreenUpdating = False

    Set shM = Sheets("Sheet1")   '元シート
    Set shP = Sheets("Sheet2")  '印刷用シート

    '以下の設定コードは、あらかじめ手動で設定してあれば不要
    With shP.PageSetup
        .PrintTitleRows = "$1:$2"
        .PrintTitleColumns = ""
        .FitToPagesWide = 1
        .FitToPagesTall = False
    End With

    With shM.Range("A1").CurrentRegion
        Set wkR = .Offset(, 2).Columns(.Columns.Count).Cells(1)
        .Columns("A").Copy wkR
        wkR.CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlNo
        For Each c In wkR.CurrentRegion
            f = .Columns("A").Find(What:=c.Value, LookAt:=xlWhole, SearchDirection:=xlNext, After:=.Columns("A").Cells(.Rows.Count)).Row
            t = .Columns("A").Find(What:=c.Value, LookAt:=xlWhole, SearchDirection:=xlPrevious, After:=.Cells(1)).Row
            shP.UsedRange.ClearContents
            shP.Range("A1").Value = c.Value
            .Rows(f & ":" & t).Offset(, 1).Copy shP.Range("A3")

            shP.PrintPreview

        Next

    End With

    wkR.CurrentRegion.Clear

 End Sub

(β) 2015/05/08(金) 15:00


 ↑ すでにページ替えが挿入済みでしたね。であれば、それを利用することでアップしたコードでやっている重複の削除とFind検索は不要になりますね。
 、また、アップしたコードはSheet2に印刷イメージを作成していますが、元シートのみで(内容を変更しないで)処理することもできます。
 ただし、いずれにしても、タイトル項目ごとに(裏側で)印刷をわけることにはかわりないですが。

(β) 2015/05/08(金) 15:56


 すでにA列の値がかわるところにページブレークが挿入されているという前提で、作業シートを使わず、元シートのみで処理します。
 なお、シート横1ページで印刷というページ設定は、事前に行われているという前提です。

 Sub Test2()
    Dim shM As Worksheet
    Dim hpb As HPageBreak
    Dim f As Long
    Dim t As Long

    Application.ScreenUpdating = False

    Set shM = Sheets("Sheet1")   '元シート

    f = 1

    '念のため最終行の下にページブレークを挿入。
    shM.HPageBreaks.Add Before:=shM.Range("A" & Rows.Count).End(xlUp).Offset(1)

    For Each hpb In shM.HPageBreaks
        If hpb.Type = xlPageBreakManual Then
            If Not IsEmpty(shM.Cells(f, "A")) Then
                t = hpb.Location.Offset(-1).Row
                '印刷領域の設定
                shM.PageSetup.PrintArea = "$B$" & f & ":$L$" & t
                'ヘッダー設定
                shM.PageSetup.LeftHeader = shM.Cells(f, "A").Value & Chr(10) & "  "
                '印刷実行
                shM.PrintPreview
            End If
            f = hpb.Location.Row
        End If
    Next

    shM.PageSetup.PrintArea = ""
    shM.PageSetup.LeftHeader = ""

 End Sub
(β) 2015/05/08(金) 17:48

お世話になります。

返信遅れまして失礼しました。
ご回答頂きましてありがとうございます。

最初に頂いたものを実行してみましたところ、(完全に記載し忘れた自分のミスなのですが)
先頭にタイトル行行があるため、それが消えてしまいました。

印刷設定で全てのページにタイトル行を印刷するように設定しており、
(vba制御ではなく、もともとExcelにある機能です)
頂いたコードを実行すると、この設定が飛んでしまうようです。

↓正確には下記のような表でした↓

  A    B    C    D   ・・・以降L列まで続く
1 番号  名前  値1  値2 
2 000  ●●●  000  000
3 000  ▲▲▲  001  001
4 001  ■■■  002  002

とはいえヒントを頂きましたので、こちらを参考にさせて頂きます。


※蛇足

べつに気に障るとか腹が立つという類のものではないのですが、
もともとvba板なので質問の内容は自ずとvbaに限られるわけで、
わざわざ「vbaでどうやるのか教えてください」と書く必要はないのでは…
と思い割愛しました。

そもそもvba板を利用するような人間なら、ある程度はExcelに精通してるでしょうし、
私が質問しているヘッダの設定云々もそこまで難解な機能ではないので、
簡単に内容を書けば伝わるかな、と思っておりました。

なんというか…正直、自分では思いもつかない伝わり方をしていたことに、
やや驚いた感すらありました。
顔の見えない相手との意思疎通は難しいな…と改めて痛感しました。。
(mia) 2015/05/11(月) 10:13


 >もともとvba板なので質問の内容は自ずとvbaに限られるわけで

 そうなんですが、あそこの板(に限りませんが)で、最近、板間違いで、関数や一般機能の質問を
 される人が少なくなかったので、確認させていただいたものです。

(β) 2015/05/11(月) 15:03


こんにちは。

>そもそもvba板を利用するような人間なら、ある程度はExcelに精通してるでしょうし、
>私が質問しているヘッダの設定云々もそこまで難解な機能ではないので、
>簡単に内容を書けば伝わるかな、と思っておりました。

ああ、、、でも、質問されるかたのなかにはそういう知識のないかたもいらっしゃるんですよ。
本当にいらっしゃるんです。なので、「これくらい知ってて当然」というつもりで回答すると、
そういうかたは辛くなっちゃうんです。

また、知ってるけどこのファイルではヘッダーは使わないという例もあります。
1行目から印刷するがヘッダーは3〜5行目、という例を見たこともあります。
一概には言えないのです。
伝える必要のあることは「これでもか」ってくらい説明してくださいな。

( 佳 ) 2015/05/11(月) 21:20


ども^^

>値が変わるごとに改ページを挿入する機能なんてありませんから、
なくはないですね。
集計機能(今はなんていうんだっけ?)で、改ページを挿入できます。(並べ替えの必要あり)
あと、ピボットテーブルでも、希望に近い出力が可能です。
(ただし出力の切り替えは個々なので、手動で行うか、マクロで行うかの必要あり)

VBAに精通していても、エクセルに詳しいとも限らないですね。
VBAに精通していたら、エクセルの機能に代わるものを自由自在に作れてしまうのですから。
(まっつわん) 2015/05/13(水) 14:39


コメント返信:

[ 一覧(最新更新順) ]


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