VBAでヘッダーにページ設定

このQ&Aのポイント
  • VBAを使用して、シートA・B・C以外のページ数をヘッダーに表示するマクロを作成します。
  • シートを追加しても、このマクロを使用してページ設定を再設定することができます。
  • 複数のシートを選択して印刷する場合、正しいページ数が表示されない問題があります。どのような設定が必要でしょうか?
回答を見る
  • ベストアンサー

VBAでヘッダーにページ設定

ブック内のシートA・B・Cを除いて、ページ数をヘッダーに表示するというマクロです。 後からシートを挿入しても、このマクロでページを再設定できます。 印刷時にシートを1枚ずつ選択して印刷すると正しくページ数が表示されますが 複数のシートを選択して印刷をすると、ページ数がおかしくなります。 複数シート選択時に正しいページ数で印刷できるようにするには どのような設定が必要でしょうか。 ご教授よろしくお願い致します。 Dim ページ数 As Integer Dim 総ページ数 As Integer Dim sht As Worksheet 総ページ = 0 For Each sht In Worksheets sht.Select 総ページ = 総ページ + Application.ExecuteExcel4Macro("get.document(50)") Next ページ数 = 0 '各シートの印刷ページ数 For Each sht In Worksheets If sht.Name <> "A" And sht.Name <> "B" And sht.Name <> "C" Then sht.Select sht.PageSetup.RightHeader = "&""MS Pゴシック""&8&P+" + CStr(ページ数) + "/" + CStr(総ページ) ページ数 = ページ数 + Application.ExecuteExcel4Macro("get.document(50)") End If Next

noname#165268
noname#165268

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

なんとなく理解できました。 これでどうでしょう。 各シートに先頭ページ番号を指定して、ページ数自体は「&P」で出しています。 Sub Sample()      総ページ = 0   For Each sht In Worksheets     sht.Select     総ページ = 総ページ + Application.ExecuteExcel4Macro("get.document(50)")   Next   ページ数 = 0      For Each sht In Worksheets     If sht.Name <> "A" And sht.Name <> "B" And sht.Name <> "C" Then       sht.Select       sht.PageSetup.FirstPageNumber = ページ数 + 1       sht.PageSetup.RightHeader = "&""MS Pゴシック""&8&P/" + CStr(総ページ)       ページ数 = ページ数 + Application.ExecuteExcel4Macro("get.document(50)")     End If   Next End Sub

noname#165268
質問者

お礼

回答いただきありがとうございます。 思い通りの動作を確認できました。 分かりにくい説明にもかかわらず、丁寧に解説いただき本当に助かりました。 ありがとうございました。

その他の回答 (3)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

>複数のシートを選択して印刷をすると、ページ数がおかしくなります。 印刷もマクロで行えば For Each sh In ActiveWindow.SelectedSheets   sh.PrintOut Preview:=True Next

  • nao-y
  • ベストアンサー率58% (111/190)
回答No.2

#1さんのコードでは意図していることができない、ということでしょうか? その、「意図されていること」がわからないのですが、、、 > ブックにシートが10枚あるとし、そのうちのシートA・B・Cを除いて、 > 残りのシートにページをシート順に表示させようと思います。 > ここでは1/7・2/7。。。というようにシートを1枚選択した場合でも、 > 総ページとページ数を表示させたいのです。 > シートが挿入されても総ページ数を取得して再設定できるようにしたのですが、 > 印刷時に質問のような問題が出てしまいました。 「質問のような問題」とは、以下のことですよね? > 印刷時にシートを1枚ずつ選択して印刷すると正しくページ数が表示されますが > 複数のシートを選択して印刷をすると、ページ数がおかしくなります。 > 複数シート選択時に正しいページ数で印刷できるようにするには この、「ページ数がおかしくなります」とは、具体的にどういうことですか? 「ページをシート順に表示させようと」ということと合わせると、 もしかして、次のような問題でしょうか? 左から、シートA・B・Cを除いて以下の順番でシートが並んでいる。 シート1、シート2、シート3、シート4 それぞれのシートは印刷するとページが2P、1P、3P、1Pの合計7Pになる。 本当は、 シート1の1ページ目:1/7、シート1の2ページ目:2/7 シート2の1ページ目:3/7 シート3の1ページ目:4/7、シート3の2ページ目:5/7、シート3の3ページ目:6/7 シート4の1ページ目:7/7 と表示させたいのに、例えば、 シート1の1ページ目:5/7、シート1の2ページ目:6/7 シート2の1ページ目:7/7 シート3の1ページ目:1/7、シート3の2ページ目:2/7、シート3の3ページ目:3/7 シート4の1ページ目:4/7 と表示されてしまう、ということでしょうか? だとすれば、For Eachの部分を For i=1 to Worksheets.Count (iはLong型で宣言)と書けば解決すると思いますが。。。 いずれにせよ、何が問題なのか説明不足だと思います。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

単純にこういう事ではないのかな? Sub Sample()   For Each sht In Worksheets     If sht.Name <> "A" And sht.Name <> "B" And sht.Name <> "C" Then       sht.PageSetup.RightHeader = "&P/&N"     End If   Next End Sub

noname#165268
質問者

補足

ありがとうございます。説明不足で申し訳ございません。 全てのシートを印刷する際に、通常でしたら複数選択したシートに順にページ番号が付きますが、1シートだけ選択した場合はページが1/1のようになってしまいます。 ブックにシートが10枚あるとし、そのうちのシートA・B・Cを除いて、残りのシートにページをシート順に表示させようと思います。ここでは1/7・2/7。。。というようにシートを1枚選択した場合でも、総ページとページ数を表示させたいのです。 シートが挿入されても総ページ数を取得して再設定できるようにしたのですが、印刷時に質問のような問題が出てしまいました。 ご教授の程、よろしくお願い致します。

関連するQ&A

  • Excel VBA でExecuteExcel4Macro("GET.OBJECT(48,

    エクセル2000です。 以前、ワークシートに配置したフォームツールのラベルの参照元を取得するマクロをご教示いただき、以下のTest01は問題なく作動しています。 Sub test01() Dim obj As Object Dim i As Integer Dim obj_n As String 'オブジェクトの名前 With ActiveSheet For Each obj In .Labels i = i + 1 .Cells(i, 2) = obj.Name: obj_n = obj.Name .Cells(i, 3) = obj.TopLeftCell.Address 'GET.OBJECT で、リンクがないものを取ると、False になる .Cells(i, 5) = ExecuteExcel4Macro("GET.OBJECT(48,""" & obj_n & """)") .Cells(i, 6) = obj.OnAction Next End With End Sub 今回、同一シートではなく別シートに表示させようと以下のTest02を書いたのですが、やってみると .Cells(i, 5) はすべて#VALUE!エラーになってしまいました。 ExecuteExcel4Macro("GET.OBJECT(48~がどのようなものかわからずやっているので応用がききません。(そもそも48って?) どのようになおしたらよいのかご教示いただければ幸いです。 Sub test02() Dim obj As Object Dim i As Integer Dim obj_n As String Dim ws As Worksheet, ns As Worksheet Set ws = ActiveSheet Set ns = Worksheets.Add With ns For Each obj In ws.Labels i = i + 1 .Cells(i, 2) = obj.Name: obj_n = obj.Name .Cells(i, 3) = obj.TopLeftCell.Address .Cells(i, 5) = ExecuteExcel4Macro("GET.OBJECT(48,""" & obj_n & """)") .Cells(i, 6) = obj.OnAction Next End With End Sub

  • エクセルvbaに関する質問です

    ExecuteExcel4Macroを使った際について質問があります。 別ブックのセルを参照したいために、ExecuteExcel4Macroを使いました。 1つ目のmsgboxではパスを変数で、二つ目のmsgboxではパスを直書きしています。 下記のサンプルプログラムで2つとも同じものを表示させたいのですが、別の結果が表示されます。 =====サンプルプログラム===== Sub Sample1() Dim name As String Dim path As String Dim sheet As String path = "C:\Users\USER\Desktop\シフト表\新しいフォルダ\" name = "book1.xls" sheet = "Sheet1" Application.DisplayAlerts = False MsgBox ExecuteExcel4Macro("'" & path & "[" & name & "]" & sheet & "'!R1C1") MsgBox ExecuteExcel4Macro("'C:\Users\USER\Desktop\シフト表\新しいフォルダー\[book1.xls]Sheet1'!R1C1") Application.DisplayAlerts = True End Sub ===ここまで===== 実際のbook1.xlsのA1セルには「1」が入っているのですが、変数で書いた場合のみ「aaaaaa」が表示されます。 どうかご教授いただけたら幸いです。

  • 【VBA】別々のシートに列ごとコピーしていきたい

    エクセルVBA初心者です 以下のような表を、地区別にわけられたシートで、種別を選んで貼り付けていきたいのですが 地区 種別 1 大阪 金 2 東京 銀 3 名古屋 銀 4 大阪 金 5 大阪 銅 6 名古屋 銅 7 東京 金 8 名古屋 金 9 大阪 銅 金と銀のみ、地区に分けられたシートに貼り付け シート【大阪】 1 大阪 金 4 大阪 金 シート【東京】 2 東京 銀 7 東京 金 シート【名古屋】 3 名古屋 銀 8 名古屋 金 以下のVBAを加工してみましたが組んでみましたがうまくいきません どうかご教示のほどよろしくお願いします ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Public Sub cptest() Dim sht1 As Worksheet Dim sht2 As Worksheet Dim rng As Range Dim cel As Range Dim stcrng As New Collection Dim lastRow As Integer Dim cnt As Integer Set sht1 = ThisWorkbook.Worksheets("Sheet1") Set sht2 = ThisWorkbook.Worksheets("Sheet2") lastRow = Range("G65535").End(xlUp).Row Set rng = sht1.Range("G1:G" & lastRow) For Each cel In rng If cel.Value = "あり" Then Set cel = sht1.Range(cel.Offset(0, -4), cel.Offset(0, -1)) stcrng.Add cel End If Next sht2.Cells.Clear cnt = 0 Set rng = sht2.Range("A1") For Each cel In stcrng cel.Copy rng.Offset(cnt, 0).PasteSpecial rng.Offset(cnt, 4).Value = "_" cnt = cnt + 1 Next Application.CutCopyMode = False End Sub

  • VBA なんですが

    VBA なんですが すべてのワークシートを順番に選択して 指定した範囲をコピーし『まとめ』と言う別のシートに貼り付けたいのですが どうしたらいいのかわかりません。 それらしいのは考えたのですが Set sh = Worksheets(sh.Name)でエラーになります。 頭がいいかた教えてください。   Dim sh3 As Worksheet Dim sh As Worksheet Dim en As Long Set sh3 = Worksheets("まとめ") For Each sh In ActiveWorkbook.Worksheets If sh.Name <> "まとめ" Then en = sh.UsedRange.Rows.Count Set sh = Worksheets(sh.Name) sh.Range(Cells(2, 1), Cells(en, 10)).Copy

  • EXCELでのグラフ印刷時にヘッダーにページ数を入れたい

    毎度お世話になっております。 WindowsXPPro、EXCEL2003を使用しております。 グラフを1枚だけ選択して印刷した場合と同じように (グラフ1枚が自動で用紙いっぱいになるように) シート上にある20枚程度のグラフを印刷したいと考えており、 その際、ヘッダーにページ数を入れたいのです。 Dim SheetName As String Dim objChart As ChartObject For Each objChart In ActiveSheet.ChartObjects objChart.Select ActiveChart.PrintOut Next 上記で印刷はできました。 グラフ1枚を選択しページ設定をすれば、そのグラフについては ヘッダーを設定できましたが、複数枚のグラフを選択するとシートの ページ設定になってしまうようでした。 ヘッダーにページ数を入れる方法について ご教授お願いいたします。

  • ExcelのVBAについて質問です。Excelは2003です。

    ExcelのVBAについて質問です。Excelは2003です。 コマンドボタン1で下記のプログラムを実行するようにしています。 Sub Macro1() ' ' Macro1 Macro ' ' Dim iRows As Integer Dim sRows As String Dim i As Integer For i = 1 To 100 Application.Wait Now + TimeValue("00:00:05") ' 最終行の調査: iRows = Worksheets("Sheet1").UsedRange.Rows.Count ' 最終行をシート3にコピー Worksheets("Sheet1").Rows(iRows).Copy Destination:=Worksheets("Sheet4").Range("1:1") ' CH1 の最新データをシート3にコピー Worksheets("Sheet3").Range("B9").Value = Worksheets("Sheet1").Cells(iRows, 3).Value ' CH2 の最新データをシート3にコピー Worksheets("Sheet3").Range("C9").Value = Worksheets("Sheet1").Cells(iRows, 4).Value Next i End Sub これをコマンドボタン2で途中でも強制的に終了するようにしたいのですがコマンドボタン2にはどのようなプログラムを入れればいいでしょうか?

  • 複数のシートの1ページ目と2ページ目を連続印刷したい

    Vista Excel2007でマクロ作成中の初心者です。 複数のシートが12個あります。(増減あり) それぞれのシートには、必ず2ページの改ページが設定してあります。 この複数シートの1ページ目だけを連続印刷したいです。 また、2ページ目だけを連続印刷したいです。以下のようにしたのですが うまく印刷できません。よろしくお願いします。 Sub シートの1ページ目の印刷() Dim i As Integer For i = 1 To 12 With Worksheets(i) .Range("A1:Q44").PrintOut End With Next i End If End Sub ------------------------------------- Sub シートの2ページ目の印刷() Dim i As Integer For i = 1 To 12 With Worksheets(i) .Range("Q46:Q89").PrintOut End With Next i End If End Sub

  • ExcelのVBAについての質問です。

    ExcelのVBAについての質問です。 計測機器をつないでsheet1に数値が書き込まれていってる状況です。下記のプログラムを特定の時間内に複数回ループされるように設定したいのですが、そのようなプログラムを加えればいいのでしょうか? Sub Macro1() ' ' Macro1 Macro ' ' Dim iRows As Integer Dim sRows As String ' 最終行の調査: iRows = Worksheets("Sheet1").UsedRange.Rows.Count ' 最終行をシート3にコピー Worksheets("Sheet1").Rows(iRows).Copy Destination:=Worksheets("Sheet3").Range("1:1") ' CH1 の最新データをシート3にコピー Worksheets("Sheet3").Range("B4").Value = Worksheets("Sheet1").Cells(iRows, 3).Value ' CH2 の最新データをシート3にコピー Worksheets("Sheet3").Range("B5").Value = Worksheets("Sheet1").Cells(iRows, 4).Value End Sub

  • VBAで教えて下さい。

    VBA初心者です。始めてから2,3週間です。 表を作りたいのですが、 顧客名のシートを100枚ほど作り、シート1(シート1は検索シートにしたいので顧客名は無)のA1にクライアント名を入力したら入力した顧客名シートが出てくる様にしたいです。 参考書、ネット等をみて作成しましたがエラーが出ます。作動するにはどの様にしたら宜しいでしょうか?どうかお助け下さい。宜しくお願い致します。コードは下記です。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Integer Dim myWSname As String, myworksheet As Worksheet myWSname = "i" myWSname = Worksheets("sheet2").Range("A1").Value For Each myworksheet In Worksheets If myworksheet.Name = mayWSname Then Worksheets("myWSname").Activate Exit Sub End If Next myworksheet End Sub

  • VBAの質問です

    1つめの質問。 Dim Sht2 As Worksheet Dim Sht3 As Worksheet Set Sht2 = Worksheets("sheet2") Set Sht3 = Worksheets("sheet3") Sht2.Range("A5").CurrentRegion.AdvancedFilter _ Action:=xlFilterCopy, _ criteriarange:=Sht2.Range("A132:A133"), _ copytorange:=Sht3.Range("A5"), _ Unique:=False というプログラムで,AdvancedFilterのところを後で繰り返し処理したいと思っているので,まずcriteriarange:=Sht2.Range("A132:A133"), _のところをcriteriarange:=Sht2.Range(Cells(132,1),Cells(33,1)), _としてみたのですがエラーが出てしまいます。なぜでしょうか。また,繰り返し処理するためにはcriteriarange:=Sht2.Range("A132:A133"), _のままではダメなのでしょうか。 2つめの質問。 ある行に何もデータがないときに限りその行を削除するというようなマクロはどうやればいいのでしょうか。出来たとしてもシートの下の方が全部消えてしまうので,適用する範囲を指定する必要がありそうですが。 よろしくお願い致します。

専門家に質問してみよう