アクティブシートと同じページ設定・シート書式・セル書式のシートを挿入するマクロ

Insert the same worksheet as the active worksheet page setup, sheet formatting and range formatting


はじめに

今回のマクロは手間をかけないためのマクロです。
タイトルどおり、あるシートと同じページ設定、シート書式、セル書式のシートを挿入します。

ふつうはシートをコピーして全セルを選択し、「DELETE」キーで値・数式を[ジャンプ]->[セル選択]でコメントや、オブジェクト、データの入力規則などを削除すればよいのですが、それが面倒な方向けのマクロです。

今回のマクロは標準モジュールに登録し、[Alt + F8]で実行することを念頭において開発しました。
これから説明しますが、ボタンに登録する意味がないマクロなので、そのような形になりました。

・動作は無保証です。
・動作確認は、Windows 10 + Excel 2016でおこなっています。

今回はファイルは作成しておりませんが、モジュールをエクスポートしたものでよろしければ、ここからダウンロードしてください。
セキュリティ上の理由からファイルの拡張子は「.txt」となっています。「.bas」に変更してお使いください。

 

アクティブシートと同じページ設定・シート書式・セル書式のシートを挿入するマクロのソースコード

Option Explicit

'モジュールレベル変数宣言

'***ページ
    '***印刷の向き
        Private myOrientation As Long
    '***拡大縮小印刷
        Private myZoom As Variant               '拡大/縮小
        Private myFitToPagesWide As Variant     '横ページ数
        Private myFitToPagesTall As Variant     '縦ページ数
    '***用紙サイズ
        Private myPaperSize As Long
    '***印刷品質
        Private myPrintQuality As Variant
    '***先頭ページ番号
        Private myFirstPageNumber As Long

'***余白
    '***上
        Private myTopMargin As Double
    '***下
        Private myBottomMargin As Double
    '***左
        Private myLeftMargin As Double
    '***右
        Private myRightMargin As Double
    '***ヘッダ
        Private myHeaderMargin As Double
    '***フッタ
        Private myFooterMargin As Double
    '***ページ中央
        Private myCenterHorizontally As Boolean '水平
        Private myCenterVertically As Boolean   '垂直
    '***ページ余白にあわせてヘッダ・フッタを配置
        Private myAlignMarginsHeaderFooter As Boolean

'***ヘッダ/フッタ
    '***ヘッダ
        Private myLeftHeader As String          '左側
        Private myCenterHeader As String        '中央部
        Private myRightHeader As String         '右側
    '***フッタ
        Private myLeftFooter As String          '左側
        Private myCenterFooter As String        '中央部
        Private myRightFooter As String         '右側
    '***先頭ページに別のヘッダーおよびフッターを設定
        Private myDifferentFirstPageHeaderFooter As Boolean
        '先頭ページ
        Private myFirstPage As Variant
    '***奇数ページと偶数ページに異なるヘッダーとフッター
        Private myOddAndEvenPagesHeaderFooter
        '偶数ページ
        Private myEvenPage As Variant
    '***ヘッダーとフッターのサイズが文書に合わせて変更されるかどうか
        Private myScaleWithDocHeaderFooter As Boolean

'***シート
    '***印刷範囲
        Private myPrintArea As String
    '***印刷タイトル
        Private myPrintTitleRows As String      '行のタイトル
        Private myPrintTitleColumns As String   '列のタイトル
    '***印刷
        Private myPrintGridlines As Boolean     '枠線
        Private myPrintHeadings As Boolean      '行列番号
        Private myBlackAndWhite As Boolean      '白黒印刷
        Private myPrintComments As Long         'コメント
        Private myPrintNotes As Boolean         'コメント(セル内)
        Private myDraft As Boolean              '簡易印刷
    '***ページの方向
        Private myOrder As Long                 '(左から右・上から下)

Private Property Let Switch(ByVal Flag As Boolean)
  With Application
    .ScreenUpdating = Not Flag
    .PrintCommunication = Not Flag
  End With
End Property

Public Sub S_CloneWS()
  Switch = True

  On Error GoTo HandleError

  Dim CopyWS As String: CopyWS = ActiveSheet.Name
  Worksheets.Add.Move After:=Worksheets(CopyWS)

  Dim PasteWS As String: PasteWS = CopyWS & "(0)"
  ActiveSheet.Name = PasteWS

  Call S_CopyPageSetup(CopyWS)
  Call S_PastePageSetup(PasteWS)
  Call S_CopyWSFormat(CopyWS, PasteWS)

  Worksheets(PasteWS).Cells(1, 1).Select

  On Error GoTo 0

  Switch = False

  Exit Sub
HandleError:
  Dim myErr  As String

  myErr = "エラー番号:" & Err.Number & vbCrLf & _
          "エラー内容:" & Err.Description

  MsgBox myErr, vbExclamation, "エラー発生!"
End Sub

Private Sub S_CopyPageSetup(ByVal WS As String)
  On Error Resume Next

  With Worksheets(WS).PageSetup
    myPrintTitleRows = .PrintTitleRows
    myPrintTitleColumns = .PrintTitleColumns
    myPrintArea = .PrintArea

    myLeftHeader = .LeftHeader
    myCenterHeader = .CenterHeader
    myRightHeader = .RightHeader
    myLeftFooter = .LeftFooter
    myCenterFooter = .CenterFooter
    myRightFooter = .RightFooter
    myDifferentFirstPageHeaderFooter _
      = .DifferentFirstPageHeaderFooter
    myFirstPage = .FirstPage
    myOddAndEvenPagesHeaderFooter _
      = .OddAndEvenPagesHeaderFooter
    myOddAndEvenPagesHeaderFooter = .OddAndEvenPagesHeaderFooter
    myEvenPage = .EvenPage
    myScaleWithDocHeaderFooter = .ScaleWithDocHeaderFooter

    myLeftMargin = .LeftMargin
    myRightMargin = .RightMargin
    myTopMargin = .TopMargin
    myBottomMargin = .BottomMargin
    myHeaderMargin = .HeaderMargin
    myFooterMargin = .FooterMargin
    myAlignMarginsHeaderFooter = .AlignMarginsHeaderFooter

    myPrintHeadings = .PrintHeadings
    myPrintGridlines = .PrintGridlines
    myPrintComments = .PrintComments
    myPrintNotes = .PrintNotes
    myPrintQuality = .PrintQuality
    myCenterHorizontally = .CenterHorizontally
    myCenterVertically = .CenterVertically

    myOrientation = .Orientation
    myDraft = .Draft
    myPaperSize = .PaperSize
    myFirstPageNumber = .FirstPageNumber
    myOrder = .Order
    myBlackAndWhite = .BlackAndWhite

    myZoom = .Zoom
    myFitToPagesWide = .FitToPagesWide
    myFitToPagesTall = .FitToPagesTall
  End With

  On Error GoTo 0
End Sub

Private Sub S_PastePageSetup(ByVal WS As String)
  On Error Resume Next

  With Worksheets(WS).PageSetup
    .PrintTitleRows = myPrintTitleRows
    .PrintTitleColumns = myPrintTitleColumns
    .PrintArea = myPrintArea

    .LeftHeader = myLeftHeader
    .CenterHeader = myCenterHeader
    .RightHeader = myRightHeader
    .LeftFooter = myLeftFooter
    .CenterFooter = myCenterFooter
    .RightFooter = myRightFooter
    .DifferentFirstPageHeaderFooter _
      = myDifferentFirstPageHeaderFooter
    .FirstPage = myFirstPage
    .OddAndEvenPagesHeaderFooter = myOddAndEvenPagesHeaderFooter
    .EvenPage = myEvenPage
    .ScaleWithDocHeaderFooter = myScaleWithDocHeaderFooter

    .LeftMargin = myLeftMargin
    .RightMargin = myRightMargin
    .TopMargin = myTopMargin
    .BottomMargin = myBottomMargin
    .HeaderMargin = myHeaderMargin
    .FooterMargin = myFooterMargin
    .AlignMarginsHeaderFooter = myAlignMarginsHeaderFooter

    .PrintHeadings = myPrintHeadings
    .PrintGridlines = myPrintGridlines
    .PrintComments = myPrintComments
    .PrintNotes = myPrintNotes
    .PrintQuality = myPrintQuality
    .CenterHorizontally = myCenterHorizontally
    .CenterVertically = myCenterVertically

    .Orientation = myOrientation
    .Draft = myDraft
    .PaperSize = myPaperSize
    .FirstPageNumber = myFirstPageNumber
    .Order = myOrder
    .BlackAndWhite = myBlackAndWhite

    .Zoom = myZoom
    .FitToPagesWide = myFitToPagesWide
    .FitToPagesTall = myFitToPagesTall
  End With

  On Error GoTo 0
End Sub

Private Sub S_CopyWSFormat(ByVal OriginalWS As String, _
                           ByVal TargetWS As String)
  On Error Resume Next

  Worksheets(OriginalWS).Activate

  Dim myZoom  As Variant: myZoom = ActiveWindow.Zoom

  Cells.Copy

  Worksheets(TargetWS).Activate

  Cells(1, 1).PasteSpecial Paste:=xlFormats

  ActiveWindow.Zoom = myZoom
End Sub

 

アクティブシートと同じページ設定・シート書式・セル書式のシートを挿入するマクロの概説

モジュールレベル変数とPageSetupオブジェクトのプロパティ

Worksheet.PageSetupオブジェクトには、48のプロパティがあります。つまり、それだけの設定項目があるということです。
このうち、シートのクローン(コピー)を作るのに必要なプロパティは37個あります。それらは、数値を設定するものか、チェックを入れてオン・オフを表すものです。
使い方としては単純なものなので、次のページから該当のプロパティを調べればほとんどのことはわかります。
PageSetup オブジェクト (Excel)
カンタンな説明でよければ、本マクロ内のモジュールレベル変数のコメントを参照してください。
モジュールレベル変数はすべて「my」+「プロパティ名」という変数名になっています。
「myPaperSize」が用紙サイズを表すとか、「myPrintQuality」が印刷品質を表すとか、そういうもののことです。

今回使用しなかったプロパティ

ヘッダ・フッタに画像を挿入するためのプロパティはわたしがそういうことをしないので、今回はマクロには使いませんでした。
しかし、会社の資料で必ず同じ画像をヘッダ・フッタに挿入するという方もいらっしゃると思います。その手間をマクロで自動化したいというニーズもあるかと思います。
そういうときは次のページが一番役に立つでしょう。
PageSetup.CenterFooterPicture プロパティ (Excel)
ここには次の例があげられています。

Sub InsertPicture()
  With ActiveSheet.PageSetup.CentertFooterPicture
    .FileName = "C:\Sample.jpg"
    .Height = 275.25
    .Width = 463.5
    .Brightness = 0.36
    .ColorType = msoPictureGrayscale
    .Contrast = 0.39
    .CropBottom = -14.4
    .CropLeft = -28.8
    .CropRight = -14.4
    .CropTop = 21.6
  End With

  'Enable the image to show up in the center footer.
  ActiveSheet.PageSetup.CenterFooter = "&G"
End Sub

ここにあげられているプロパティを参考にして改造すれば、うまく自動化できると思います。
ちなみに画像を挿入できる箇所は左・中・右のヘッダ・フッタの計6か所あり、プロパティも6個あります。その6個をあげておきます。
PageSetup.LeftHeaderPicture プロパティ (Excel)
PageSetup.CenterHeaderPicture プロパティ (Excel)
PageSetup.RightHeaderPicture プロパティ (Excel)
PageSetup.LeftFooterPicture プロパティ (Excel)
PageSetup.CenterFooterPicture プロパティ (Excel)
PageSetup.RightFooterPicture プロパティ (Excel)
このプロパティの記事も参考になると思います。
PictureFormat.ColorType プロパティ (Excel)

 

プロパティプロシージャ「Switch」の解説

以前にもプロパティプロシージャは使いましたが、今回はこのマクロを高速化するのに関係ありそうなものに絞ってプロパティを設定しています。

Private Property Let Switch(ByVal Flag As Boolean)
  With Application
    .ScreenUpdating = Not Flag
    .PrintCommunication = Not Flag
  End With
End Property

「ScreenUpdating」プロパティはマクロを書く方にはおなじみでしょうが、「PrintCommunication」プロパティはあまりなじみがないと思います。
しかし、「PrintCommunication」プロパティを「False」に設定すると、「PageSetup」プロパティを設定するコードの実行を高速化することができます。つまり、このマクロを高速化できる、ということです。

 

「S_CloneWS」プロシージャの解説

Public Sub S_CloneWS()
  Switch = True

  On Error GoTo HandleError

  Dim CopyWS As String: CopyWS = ActiveSheet.Name
  Worksheets.Add.Move After:=Worksheets(CopyWS)

  Dim PasteWS As String: PasteWS = CopyWS & "(0)"
  ActiveSheet.Name = PasteWS

  Call S_CopyPageSetup(CopyWS)
  Call S_PastePageSetup(PasteWS)
  Call S_CopyWSFormat(CopyWS, PasteWS)

  Worksheets(PasteWS).Cells(1, 1).Select

  On Error GoTo 0

  Switch = False

  Exit Sub
HandleError:
  Dim myErr  As String

  myErr = "エラー番号:" & Err.Number & vbCrLf & _
          "エラー内容:" & Err.Description

  MsgBox myErr, vbExclamation, "エラー発生!"
End Sub

このプロシージャがメインのプロシージャです。

  Dim CopyWS As String: CopyWS = ActiveSheet.Name
  Worksheets.Add.Move After:=Worksheets(CopyWS)

  Dim PasteWS As String: PasteWS = CopyWS & "(0)"
  ActiveSheet.Name = PasteWS

「CopyWS」はコピー元(コピーしてくる)シート名を格納する変数名。「PasteWS」はコピー先(コピーしてやる)シート名を格納する変数名。
そして、実際にシート名を変数に格納しています。
コピー元シートの後ろ(右側)に新規シートを作成し、そのシート名を「コピー元シート名」+「(0)」としています。

Call S_CopyPageSetup(CopyWS)
Call S_PastePageSetup(PasteWS)
Call S_CopyWSFormat(CopyWS, PasteWS)

「Call S_CopyPageSetup(CopyWS)」でコピー元のシートからページ設定関係のプロパティの設定値をコピーします。
「Call S_PastePageSetup(PasteWS)」でコピー先のシートに設定値をペーストします。
「Call S_CopyWSFormat(CopyWS, PasteWS)」で設定値のコピペではコピーできない「ActiveWindow」の設定をコピペします。

 

「S_CopyPageSetup」プロシージャの解説

Private Sub S_CopyPageSetup(ByVal WS As String)
  On Error Resume Next

~~~~~~~~

  On Error GoTo 0
End Sub

各プロパティの設定値を変数に格納しています。この変数はモジュールレベル変数なので、他のプロシージャでこの変数に格納された設定値を使うことができます。

 

「S_PastePageSetup」プロシージャの解説

Private Sub S_PastePageSetup(ByVal WS As String)
  On Error Resume Next

~~~~~~~~

  On Error GoTo 0
End Sub

「S_CopyPageSetup」でモジュールレベル変数に格納した設定値をすぐにこのプロシージャで各プロパティに設定しています。
みなさんもモジュールレベル変数を使うときは、いったん設定値を変数に格納したら、すぐに新たに格納されるべきプロパティに設定してください。いくら有効範囲がモジュールレベルだからといって、いつ設定値が消えて変数が初期化されるかわかりません。これはVBAの仕様です。Microsoftがこのことについて何も保証していません。いつ設定値が消えても文句は言えないということです。だから、すぐ使いましょう。
これについて詳しく知りたい方は次のページをお読みください。
Excel VBA を学ぶなら moug モーグ|即効テクニック|モジュールレベル変数の値が消えるとき

 

「S_CopyWSFormat」プロシージャの解説

Private Sub S_CopyWSFormat(ByVal OriginalWS As String, _
                           ByVal TargetWS As String)
  On Error Resume Next

  Worksheets(OriginalWS).Activate

  Dim myZoom  As Variant: myZoom = ActiveWindow.Zoom

  Cells.Copy

  Worksheets(TargetWS).Activate

  Cells(1, 1).PasteSpecial Paste:=xlFormats

  ActiveWindow.Zoom = myZoom
End Sub

このプロシージャでは、プロパティの設定値のコピペではコピーできない「ActiveWindow」関連の設定値をコピペしています。また、セルの書式もすべてコピペしています。

 

おわりに

今回は、「PageSetup」オブジェクトのプロパティを使って、シートのクローンを作りましたが、冒頭にも書いたように「シートをコピーして全セルを選択し、「DELETE」キーで値・数式を、[ジャンプ]->[セル選択]でコメントや、オブジェクト、データの入力規則などを削除すればよい」ので、興味のある方はチャレンジしてみてください。

コメントを残す