• ベストアンサー

VBAでページ番号、ページ最終行を取得する方法

エクセルにデータを表示させて印刷するときに、 一続きのデータがページをまたいでしまうのですが、 またいだ時にページの一番はじめに、データの項目を表示させたいと思っています。 PrintTitleRowsを使用しようと思いましたが、 データの項目→データ、データの項目→データというようにエクセルシートに表示されているため、もし、丁度ページが変わったときにうまくデータの項目が次のページの1列目にくるとデータの項目がダブってしまい、使用することができません。 他の方法を考えてみたのですが、その方法では現在のページ番号を取得する方法か現在のページの最終行(データが最終行に入力されていない場合も含む)を取得する方法を知らなくては実現することができません。 いろいろ調べたのですが、見つからず、このような方法がないのかもしれません。 うまく状況が説明できずすみません。 もしご存知の方がお見えになりましたら教えてください。 また、何か他によい方法をご存知の方がお見えになりましたら教えてください。

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

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

ページの先頭に表題や項目(列)見出しを入れる場合 (1)エクセルのPrintTitleRowsを使う この場合は最初以外は項目見だしをいれないのが普通でしょう。質問のケースはこれを入れていると言うことですか。 そのため邪魔になると言うことでしょうか。 であれば削除するか、非表示にするのが手でしょう。 項目見出しを何かの文言・印でプログラムで割り出せるなら、その行をプログラムで非表示にすることも出来るでしょう。 (2)PageBreakで改ページし、改ページ後に 項目見出しを(手動でということになる)いれる。 と言うか項目見出しの行の前で改ページを入れる。 紙は多少無駄が起こるかもしれない。 (3)VBAでPrintAreaを別途編集し直し 項目見出しを最上部にセットする。 すると普通は毎ページ「一定行数」+見だし行数となろう。その場合も中間の項目見だしは邪魔になる。 (4)(2)の場合PageBreakの位置をVBAで 取得し、その後に項目見だしを印刷し、明細行を打てばよいが、Printoutでは、改ページしてしまうので不可能。行印刷して改ページしないメソッドが判れば可能。 >現在のページの最終行(データが最終行に入力されていない場合も含む)を取得する方法 これはプリンタの動作の最終行と言う情報をシステムに送らせないといけないが、VBAレベルでは多分不可能でしょう。APIでも難しいのでは。プリント動作はプリンタドライバに任せているのだと思う。

000200b
質問者

お礼

様々な方法を教えてくださり、ありがとうございます。 項目の上に表示データごとにことなるもう一つの見出しがつくため項目を非表示にすることは難しいと思いますが、それぞれ教えてくださった方法を試して見たいと思います。 ありがとうございました。

その他の回答 (1)

noname#29107
noname#29107
回答No.1

私なら印刷を以下のようにマクロ化します。 1)2番目以降のデータ項目の行を非表示にする 2)1番目のデータ項目をタイトル行にして印刷する 3)非表示にした行を表示に戻す。 現在のページ番号を直接知るのは、無理かもしれませんが、間接的にRangeオブジェクトのPageBreakプロパティかHPageBreak オブジェクト(VPageBreakも必要かもしれません)の位置の記録と集計を使えば可能じゃないかとは思います。

000200b
質問者

お礼

お答えいただき、ありがとうございます。 やはり現在のページ番号を直接知るのは無理なんですね。 この方法を試して見ます。 ありがとうございました。

関連するQ&A

  • VBAで最終行を取得する方法

    最終行を取得する方法について教えていただきたいです。 例えば以下のようなデータがあった場合 (A列~D列、3行までデータがある状態) -------------------------------- 田中 24歳 生命保険 営業 山口 47歳 銀行   営業 大野 36歳 IT    SE -------------------------------- ここで最終行を取得する際に、 Range("A1").End(xlDown).Rowをすれば取得できました。 しかしデータが以下のような場合 (A列が空白) -------------------------------- 田中 24歳 生命保険 営業    47歳 銀行   営業    36歳 IT    SE -------------------------------- この場合に上記と同じ取得方法をすると、オーバーフローになります。 そこで他の取得方法を調べたのですが、 ActiveSheet.UsedRange.Rowを試したところ、最終行として取得できたのは「1」でした。 A列が空白の状態でも、今回の場合だと「3」という最終行を取得するにはどうすれば良いでしょうか。

  • VBA最終行取得

    Sub 最終セル取得() Dim gyou As Integer gyou = 1 Do Until Cells(gyou, 1).Value = "" gyou = gyou + 1 Loop Range("C1").Value = gyou End Sub 上記のプログラムのどこを変えれば 文字が入力されている最終行の取得ができますでしょうか。 A列に入っている文字の最終行(セル)がC1に表示される というようにしたいのですが…; このまま実行すると1つ多いセル行が表示されてしまいます 同じような質問をしてしまって申し訳ありません; どなたかわかる方回答お願い致します Excelは2000です;

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

    EXCELで作成した表を印刷したいのですが、表が縦長で複数ページにわたります。 そこで各ページの下端にそれぞれ罫線を挿入するマクロを書きたいのですが、 改ページ位置の取得方法がわかりません。各ページの上端行でも下端行でも良いので 行番号を取得する方法はないものでしょうか? どなたかご教授願います。 マクロ全体としては下記を考えています。 1.データの下端行の取得 2.印刷範囲の設定(横1ページ×縦複数ページ) 3.最初の改ページ位置の取得 4.ページ下端セル行の下に罫線を入れる 5.次の改ページ位置の取得 6.以下、データ最下端行まで繰り返し (各行のセルの高さは一定ではないです。)

  • エクセルVBAでデータ最終行取得方法

    エクセルVBAでデータ最終行取得方法で良い方法を教えてください。 データの行数、列数は不定。 最多のデータ行の列も不定。 この条件で、データ最終行を取得するにはどうすればよいでしょうか? lastrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row では、A列の最終行に限定されます。 lastrow = ActiveSheet.Cells(1, "A").SpecialCells(xlLastCell).Row では、列の限定はありませんが、一旦データ入力後、削除した部分まで入ってしまいます。 lastrow = ActiveSheet.UsedRange.Rows.Count では、データ入力後、削除した部分まで入ってしまい、かつ、1行目など上部が空白の場合、不正確になります。

  • エクセルVBAで最終行取得ができない

    エクセルVBAでたとえばC列にどこまでデータが入力されているかを調べるとき、通常は r = Cells(Rows.Count, "C").End(xlUp).Row などでできます。 しかし添付画像のような入力フォームが出来上がっており、かつC列に最初から何らか(画像では〒マーク)の入力がされているので、そこに回答者が途中まで入力された場合、これでは最終行は取得できません。 逆に上からEnd(xlDown)でやろうとしても、途中に空白セルがあってお手上げです。 余分な〒マークを元データから削除してしまいたいのですがそれでは入力されているところのマークまで消えてしまいます。 このようなファイルが何百もあり、それを1枚のシートにまとめようとしているのですが、この最終行取得でつまずいてしまいました。 どのような方法があるでしょうか? 画像はエクセル2013ですが、実際にマクロを動かすのは2010です。

  • VBA Excel 背景色の最終行取得~

    Excelのシート上に背景色が変更になった箇所のH3から 背景色の最終行を取得し その最終行のB列の値を取得したいのですが宜しくお願いします。 取得した値をMsgBoxで表示できる様に作成したいのですが、 背景色の最終行って、どの様に作成したら良いのでしょうか? UserForm上で操作ができたら良いのですが。 画像の様な事をしたいです。 お手数おかけしますが教えて頂けますでしょうか?

  • エクセルVBAで最終ページの確認は出来ますか?

    WIN98SEでエクセル2000を使用しています。 既に作成されたシートの最終ページ又は総枚数をVBAで取得し、そのデータを活用したいと考えています。 VBAでの取得は出来るでしょうか? 宜しくお願いします。

  • VBScript エクセル 最終行と最終列取得

    今、たくさんのシートがある、エクセルのファイルがあり、「C6」以降が縦の項目行、「D5」以降が横の項目列です。 項目行と項目列には、間に空白のセルは存在しません。 この状態で、項目行、項目列の最終の場所を取得しなければなりません。 そこで、「r = Range("C6").End(-4121).Row」(「-4121」は「xlDown」)、「c = Range("D5").End(-4161).Column」(「-4161」は「xlToRight」)で次々に求めていったのですが、「C6」に縦の項目が1つだけ、「D5」に横の項目が1つだけ、というシートがありました。 すると、そのシートでは、「r」と「c」の値は、エクセルそのものの最大の行数と最大の列数が返ってきてしまいました。 そこで、「D6」にのみ、文字があるサンプルファイルを作り、そのサンプルファイルに対して、「r = Range("D5").End(-4121).Row」と「c = Range("C6").End(-4161).Column)」で求めると、ちゃんと、「r = 6」、「c = 4」という値が返ってきたので、「r」の場合は、1つ上から、「c」については、1つ左から「Range」を設定すればいい、と思って、実際のデータで試すと、他のシートでは、全然うまくゆきません。 結果的に、問題は、「If」文で、ムリヤリ解決させたのですが、「If」文の場合ですと、前もって全シートを確認して、調べておかなければなりません。 何とか、汎用的に項目が1つしかない場合も、その項目のある「行」と「列」が最終行、最終列として取得できる方法はないでしょうか? ただし、項目が「0個」ということはありませんので、そこまで考えて頂く必要はありません。 「VBA」でも結構ですので、よろしくお願いいたします。

  • エクセルVBAで最終行取得方法

    エクセルVBAで最終行を取得する良い方法を教えて下さい。 VBA初心者でいきづまっていまして、、、 内容はボタンを押した時にF列に対して最終行を取得して、 その最終行の下のセルにボタンの内容が繁栄させるようにしたくて Private Sub CommandButton202_Click() Dim lastRow As Long lastRow = Cells(Rows.Count, 6).End(xlUp).Row + 1 Cells(lastRow, 6).Value = CommandButton202.Caption End Sub と作ってみたのですが、F17より下に文字がはいっているため、 検索範囲を「F列」ではなく、「F2:F16」のように範囲を指定したいのですがどうしたらよいでしょうか、、、。 結構色々調べてはみたのですができなくて、、、

  • EXCEL-VBAでワークシートのデータがはいっている最終の行番号の取得

    ExcelVBAは不得意のものです。 ワークシートのA列にデータが入っているのですが、10行目までの時もあれば20行目までデータが入っている場合もあります。データが入っている最終行の行番号を取得したいのですがどうしたら良いのでしょう。 何をするかというと、その番号を取得してループ処理をしたいのです。For i=1 To 最終行の行番号みたいに 多分EOFなんて指定じゃないですよね

専門家に質問してみよう