出産前後の痔にはご注意!

2000行ぐらいあるデータを、あるカテゴリ毎に分けて印刷したいのですが、
いちいち改ページを設定するのが面倒なので・・・

例えばA列に数行おき(一定間隔ではない)に“○”が入力されて
いたときに、“○”がある行毎に改ページを設定することは可能でしょうか?

当方、あまり複雑なことは出来ませんが、若干ならマクロの理解もできます。
教えていただけると有り難いです。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

こんばんは。



以下の場合は、このようになります。
------------

○ .Cells(i + 1, 1) 1行足されている
------------改ページ

しかし、そうではなく、以下のようになるなら、このようにします。
------------

------------改ページ
○ .Cells(i - 1, 1) 1行減らす


印刷範囲を最初に設定してから、マクロを行ってください。
出来上がったら、改ページプレビューで確認してください。

標準モジュールに設定してください。

'------------------------
Sub PageBreak_enter()
Dim Rng As Range
Dim i As Long
'区切れの文字列
Const CHKSTRING As String = "○"
With ActiveSheet
 If .PageSetup.PrintArea = "" Then
  MsgBox "印刷範囲を設定してください"
  Exit Sub
 End If
  .ResetAllPageBreaks
 ' ↑(何回も行わないなら要りません)
 Application.ScreenUpdating = False
 Set Rng = .Range(.PageSetup.PrintArea)
 For i = 1 To Rng.Rows.Count
 If .Cells(i, 1).Value Like CHKSTRING Then
  'ここで、改ページを調整可
   .Cells(i + 1, 1).PageBreak = xlPageBreakManual
 End If
 Next
 End With
 Application.ScreenUpdating = True
 Set Rng = Nothing
End Sub
    • good
    • 0

改ページは


A(1)手動
(2)位置を知らせる仕組み(#3回答?)
 (3)ボタン化(VBA)
B(1)決まった行数で改ページ
 (2)ある列のデータが変化したらその直前で改ページ(#2回答
(3)決まった語句や数が出てきたら改ページ
(4)改ページを入れないでプログラムでRange(○).PrintOutの○を調節
などが考えられる。
この質問ではB(3)かなと思う。
ーーー
A列   B列
得意先A1
2
3
4
5
得意先B2
3
4
ff
のようなデータの場合
標準モジュールに
Sub test01()
d = Range("B65536").End(xlUp).Row
For i = 2 To d
If InStr(Cells(i, "A"), "得意先") > 0 Then
Cells(i, 1).PageBreak = xlPageBreakManual
End If
Next i
Cells.PrintOut
End Sub
で良いようです。
ーー
A(3)は
シートにボタンを貼り付け、そのClickイベントに
Private Sub CommandButton1_Click()
ActiveCell.PageBreak = xlPageBreakManual
End Sub
    • good
    • 0

わたしからは手動で行う場合にちょっと楽になる方法を。



A列にオートフィルタをかけて、○を抽出します。
一番最初の○のある行を行ごと選択して、
[挿入]-[改ページ]
を行います。
以下、
下矢印=>[F4]=>下矢印=>[F4]...
と繰り返しキー入力をすればOK。


#[F4]キーは[前の動作を繰り返す]操作なので、これは改ページ挿入=>下移動の繰り返しになります。
    • good
    • 1

以下のマクロはB列の値が変わる行で改頁を挿入するマクロです。


もしカテゴリが大分類、小分類などに分かれているならもう少し判断を加える必要があるので補足するか、ご自身で改造してみてください。
(1行目がタイトル、2行目以降がデータの想定です)

ご存じと思いますが、以下のマクロをALT+F11でVBE画面を開き、「VBAProjectエクスプローラのシート名右クリック」→「挿入」→「標準モジュール」で表示される画面にペーストして下さい。実行はシート画面に戻って、ALT+F8を押してマクロ一覧からマクロ名を選択して実行します。MacroBKが改行挿入、macroBKDELが改行削除です

Sub MacroBK()
Dim PB As HPageBreak
Dim idx As Long
Const tCol As String = "B" '改頁判断する列
 With ActiveSheet
  For idx = 3 To .Cells(65536, tCol).End(xlUp).Row
   If .Cells(idx, tCol) <> .Cells(idx - 1, tCol) Then
    ActiveSheet.HPageBreaks.Add Before:=.Cells(idx, tCol)
   End If
  Next idx
 End With
End Sub

Sub MacroBKDEL()
Dim idx, PB As Integer
 PB = ActiveSheet.HPageBreaks.Count
 For idx = 1 To PB
   ActiveSheet.HPageBreaks(1).Delete
 Next
End Sub
    • good
    • 2

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXCEL 改ページ自動挿入方法を教えてください。

EXCELで「改ページ」をデータが変る都度 自動的に挿入する方法はありますか?
ハンドでいちいち設定するのが非常に手間です。
ご存知の方、是非教えてください。
例 <データ>
111
111 ←この行で改ページ自動挿入
222
222 ←この行で改ページ自動挿入
333 ←この行で改ページ自動挿入
444 ←この行で改ページ自動挿入

Aベストアンサー

関数式では、セルの挿入、削除、改行の挿入、削除などは出来ないようです。
VBAになれば、オフラインバッチ処理の定番である、「キー
(例えば所属部)が変われば、改ページする」のは,しょっちゅう行われることです。サンプルを載せます。
Sub test01()
ma = Mid(Cells(1, 1), 1, 1)
For i = 1 To 10
  n = Cells(i, 1).Value
  a = Mid(n, 1, 1)
 If a <> ma Then
  Worksheets("sheet1").Rows(i).PageBreak = True
 End If
p01:
ma = a
Next i
End Sub
マクロの記録はやや、ややこしいですが骨子は上記の通り。

Q特定文字のセル(エクセルデータ)の所で改ページ印刷する仕組みは可能?

「タイトル+本文」という形でのエクセルデータ(他DBから変換したもの)があります。1タイトルが終わり、続けてそれぞれの「タイトル+本文」が50組ぐらいあり、そのまま印刷する場合は、各々長さがバラバラなので各用紙にまたがって印刷されてしまいます。改ページを手動で設定して印刷する方法もあるのですが、量が多いのと今後も別のデータを取り込んだとき再び設定する必要があるので、何とか特定文字をキーに改ページ印刷を自動化できないかと色々方法を探しています。エクセル2000を使用しています。同じような経験をお持ちの方が居られましたらお聞きしたいです。

Aベストアンサー

(1)セルの値全体で比較すれば良い時
#2のやり方
(2)先頭から何文字目かの定位置
If Cells(i, "B") = "xx" Then ----->
If Mid(Cells(i,"B"),3,2)="XX" then
3文字目から2文字がXXなら
(3)セルの文字列の中のどこかに含まれているか探す時
p=InStr(Cells(i,"B"),"xx")
If p=0 then
(含まれない時)
Else
(含まれる時)
End If

QVBAでデータが変わった切れ目で改ページしたい

例えばA列に担当者コードが1から100まであって昇順に並んでいます。この表を印刷するときにデータが変わったところで改ページの挿入がしたいのですが、どうやればいいのかわかりません。
手作業でするとすごく時間がかかってしまいます。しかも毎週出すデータなので。
お願いします


あと、データのある範囲を選択してその部分を印刷範囲に設定したいのですがVBAでどのようになるでしょうか。

Aベストアンサー

概ねこんな感じかと・
(あくまでサンプルなので実データに合わせて変更して下さい)
'データの変わり目で改ページ挿入
'解除するときは、右クリックから「全ての改ページの解除」
Do While Worksheets(SheetName).Cells(rindex, cIndex) <> "" '空白セルでない間
If Worksheets(SheetName).Cells(rindex - 1, cIndex) <> Worksheets(SheetName).Cells(rindex, cIndex) Then '1つ前の行とデータが違ったら
If rindex <> 6 Then '最初の行は除く
Worksheets(SheetName).Range("B" + Trim$(Str$(rindex))).Activate
ActiveWindow.SelectedSheets.HPageBreaks.Add ActiveCell '改ページ挿入
' ActiveWindow.SelectedSheets.VPageBreaks.Add ActiveCell
End If
End If
rindex = rindex + 1
Loop

>データのある範囲を選択してその部分を印刷範囲に設定したいのですがVBAでどのようになるでしょうか。
ActiveSheet.PageSetup.PrintArea = Selection.Address
Selection は、現在選択されている範囲
Selection でなくても、適当なRange オブジェクトでよい。

概ねこんな感じかと・
(あくまでサンプルなので実データに合わせて変更して下さい)
'データの変わり目で改ページ挿入
'解除するときは、右クリックから「全ての改ページの解除」
Do While Worksheets(SheetName).Cells(rindex, cIndex) <> "" '空白セルでない間
If Worksheets(SheetName).Cells(rindex - 1, cIndex) <> Worksheets(SheetName).Cells(rindex, cIndex) Then '1つ前の行とデータが違ったら
If rindex <> 6 Then '最初の行は除く
Worksheets(SheetName).Range("B" ...続きを読む

QEXCEL、マクロ-改ページ行番号の取得方法を教えてください

EXCELで作成した表を印刷したいのですが、表が縦長で複数ページにわたります。
そこで各ページの下端にそれぞれ罫線を挿入するマクロを書きたいのですが、
改ページ位置の取得方法がわかりません。各ページの上端行でも下端行でも良いので
行番号を取得する方法はないものでしょうか?

どなたかご教授願います。

マクロ全体としては下記を考えています。

1.データの下端行の取得
2.印刷範囲の設定(横1ページ×縦複数ページ)
3.最初の改ページ位置の取得
4.ページ下端セル行の下に罫線を入れる
5.次の改ページ位置の取得
6.以下、データ最下端行まで繰り返し

(各行のセルの高さは一定ではないです。)

Aベストアンサー

難しく考えず、フッターを使ったらいかがでしょう。
フッターの1行目をスペースで連打し、フォントの設定で下線を選びます。
これで下線が表示され、丁度データと境になるのではないですか?

どうしても改ページ位置取得なら、HPageBreakオブジェクトのLocationプロパティを使ってみたらどうでしょう。
HPageBreaks (HPageBreakオブジェクトのコレクション)
ActiveSheet.HPageBreaks.Count (改ページ総数)
ActiveSheet.HPageBreaks(1).Location.Row (一番目の改ページの行)
Location.Rowで改ページの行が分ります。

Qエクセルの改ページを行ごとに自動挿入するには?

1000行以上ある表に対して50行ごとに改ページ
したいのですが、行の幅が微妙にまちまちなので
46~53行の間で微妙にずれてしまいます。

任意の固定された行数で改ページを一気に自動挿入
する方法があれば教えてください。今は改ページプレ
ビューを見て微調整をして微妙なズレを直しています。

Aベストアンサー

#1 のmisatoannaさんの内容にかぶってしまいますが、

>行の幅が微妙にまちまちなので46~53行の間で微妙にずれてしまいます。

50行以上に「自動改ページ」がつけられる場合はよいのですが、それ以下の場合は、「手動改ページ」を入れると、2行なり3行だけのページが出来てしまいますが、それでも良いのですか?2つのマクロがあります。

1つは、手動改ページを入れるマクロで、もう1つは、それが正しく入っているか調べるマクロです。

'--------------------------------------
Sub PageBreak_enter()
'手動改ページを入れるマクロ
Dim Rng As Range, i As Long
With ActiveSheet
'マクロを実行する前に、なるべく、印刷範囲はユーザーで設定してください。
 If .PageSetup.PrintArea = "" Then
   .PageSetup.PrintArea = .UsedRange.Address
End If
  .ResetAllPageBreaks
Set Rng = Range(.PageSetup.PrintArea)
For i = 50 To Rng.Rows.Count Step 50
   .Cells(i + 1, "A").PageBreak = xlPageBreakManual
Next i
End With
 Set Rng = Nothing
End Sub

'--------------------------------------
Sub CheckMPageBreak()
'正しく、50行目に改ページが入っているか調べるマクロ
Dim TotalPage As Integer
Dim p As Long
Dim i As Integer
 TotalPage = Application.ExecuteExcel4Macro("COLUMNS(GET.DOCUMENT(64))")
For i = 1 To TotalPage - 1
 p = Application.ExecuteExcel4Macro("INDEX(GET.DOCUMENT(64),1, " & i & ")")
 If p Mod 50 <> 1 Then
   MsgBox p & " ページ目が、違います。", 64
 End If
Next i
End Sub
'--------------------------------------

#1 のmisatoannaさんの内容にかぶってしまいますが、

>行の幅が微妙にまちまちなので46~53行の間で微妙にずれてしまいます。

50行以上に「自動改ページ」がつけられる場合はよいのですが、それ以下の場合は、「手動改ページ」を入れると、2行なり3行だけのページが出来てしまいますが、それでも良いのですか?2つのマクロがあります。

1つは、手動改ページを入れるマクロで、もう1つは、それが正しく入っているか調べるマクロです。

'--------------------------------------
Sub PageBreak_e...続きを読む

Qエクセル VBA 印刷改ページ 行数設定

環境:Excel2002です

印刷する行数は毎回異なります

改ページの条件は
(1)行1から10は表題などが設定されているが6から10行を行タイトルに設定する
(2)データ30行毎に改ページする
  
   例:データ数100、行1から10に表題があるので 最終行は110
     ページ設定 1ページ:行1から40
                   行1から10の表題 プラス データ数30(行11~40)
             2ページ:行6から10の行タイトル プラス データ数30(行41~70)
             3ページ:行6から10の行タイトル プラス データ数30(行71~100)
             4ページ:行6から10の行タイトル プラス データ数10(行101~110)

印刷範囲の設定はネット上に多数紹介されていますが
私の設定したい方法は見つけることができませんでした

思考錯誤してみましたが、私のスキルでは無理でした
よろしくご教示願います

Aベストアンサー

ご相談に書かれていることを手順を追って行うと
1.印刷する行数(最終行)を調べる
2.タイトル行を設定する
3.所定の行に改ページを打つ
4.印刷範囲を設定する
5.印刷する
というだけの作業です。


実際には
事前準備:タイトル行を設定する
事前準備:所定の30行ごとに、データの有無に関係なしに改ページを埋めておく
   →挿入メニューの改ページ
マクロの仕事:最終行を調べ、印刷範囲を設定して印刷する

だけで十分です。

作成例:
sub macro1()
 dim LastRow as long
’仮にA列で最終行を調べられるとして
 lastrow = range("A65536").end(xlup).row
’仮にA:G列を印刷するとして
 activesheet.pagesetup.printarea = "$A$1:$G$" & lastrow
 activesheet.printout
end sub



もしも手抜きで何も手を動かして準備とかしたくないというなら

sub macro2()
 dim LastRow as long
 dim r as long
 lastrow = range("A65536").end(xlup).row
 activesheet.resetallpagebreaks
 for r = 41 to lastrow + 1 step 30
  activesheet.hpagebreaks.add before:=cells(r, "A")
 next r
 activesheet.pagesetup.printtitlerows = "$6:$10"
 activesheet.pagesetup.printarea = "$A$1:$G$" & lastrow
 activesheet.printout
end sub

といった具合に、丁寧に書いていけば出来ます。

ご相談に書かれていることを手順を追って行うと
1.印刷する行数(最終行)を調べる
2.タイトル行を設定する
3.所定の行に改ページを打つ
4.印刷範囲を設定する
5.印刷する
というだけの作業です。


実際には
事前準備:タイトル行を設定する
事前準備:所定の30行ごとに、データの有無に関係なしに改ページを埋めておく
   →挿入メニューの改ページ
マクロの仕事:最終行を調べ、印刷範囲を設定して印刷する

だけで十分です。

作成例:
sub macro1()
 dim LastRow as long
’仮にA列で最終行を...続きを読む

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

Qエクセルでページ数をあるセルに表示させたい

どこかのセルに、そのシートで印刷される
ページ数を表示するような計算式orマクロはありますでしょうか。
質問が分かりにくかったらすみません。

Aベストアンサー

次の方法は如何でしょうか。
(1)挿入→名前→定義で名前欄に任意名(仮にaaa)、参照範囲欄に =GET.DOCUMENT(50) →OK
(2)表示セルを選択→F3キー押下→aaaを選択→OK→enter

Q改ページ条件を簡単に設定する方法

大変困っております。
データベースのある列を指定して、入っている値が変われば改ページという設定をしたいのですが、調べてもなかなか出てきません。いくつか答は見つかったのですが、VBAを書いて実現する方法ばかりで、初心者の私にはチンプンカンプンです。
なんとか、上記のしくみをマクロなどで簡単に実現する方法はないでしょうか?お願いします!!

Aベストアンサー

こんにちは

 メニュー[データ]-[集計]には、[グループごとに改ページを挿入する]というのがあります。

参考URL:http://www2.odn.ne.jp/excel/

Qエクセルで条件に一致したセルの隣のセルを取得したい

下のような「得点」という名前のシートがあります。
(「田中」のセルがA1です。)

 [ 田中 ][ 10 ][ 200 ]
 [ 山田 ][ 21 ][ 150 ]
 [ 佐藤 ][ 76 ][ 250 ]
 [ 鈴木 ][ 53 ][ 350 ]

別のシートのA1セルに、「佐藤」と入力すると、

 [ 佐藤 ]

「得点」シートから「佐藤」の列を見つけて、B1、C1に

 [ 佐藤 ][ 76 ][ 250 ]

のように表示させたいのですが、B1、C1にはどのような式を書けば良いのでしょうか。
「得点」シートでは氏名が重複する事はありません。
IF文を使うと思うのですが、いまいち良く分かりませんでした。

よろしくおねがい致します。

Aベストアンサー

こんにちは!
VLOOKUP関数で対応できます。
IF関数と併用すればエラー処理が可能です。

Excel2007以降のバージョンであれば
B1セルに
=IFERROR(VLOOKUP($A1,得点!$A:$C,COLUMN(B1),0),"")
としてC1セルまでオートフィルでコピー!
そのまま下へコピーすると行が2行目以降でも対応できます。

Excel2003までの場合は
=IF($A1="","",VLOOKUP($A1,得点!$A:$C,COLUMN(B1),0))

としてみてください、m(_ _)m


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング