« 2019年1月 | トップページ | 2020年4月 »

2020年3月

2020年3月29日 (日)

ヘッダー・フッターの設定

ヘッダーは印刷プレビューや印刷された物の
ページ上部に表示される共通部分のことです。
フッターは下部に表示される共通部分のことです。

Excelではヘッダー・フッターは次の画像の様に
左側、中央、右側の3つの部分に分かれています。
Vba20200329a

手動でヘッダー・フッターを設定するには
[ファイル]-[印刷]-[ページ設定]-[ヘッダー/フッター]タブをクリックすると下の画像のウィンドウが表示されます。
Vba20200329b

次に、[ヘッダーの編集]や[フッターの編集]をクリックすると
下の画像のようなウィンドウが開きますので
ここで表示させたい文字を設定します。

Vba20200329c

VBAで文字列を表示させたい場合は
次のコードのようにします。

ヘッダー・フッターを設定するコード1:

Sub macro20200329a()
'ヘッダー・フッター
'文字列表示

    With ActiveSheet.PageSetup
        .LeftHeader = "ヘッダー左側"
        .CenterHeader = "ヘッダー中央"
        .RightHeader = "ヘッダー右側"
        .LeftFooter = "フッター左側"
        .CenterFooter = "フッター中央"
        .RightFooter = "フッター右側"
    End With
   
 End Sub

実行結果は、この記事にある最初の画像のようになります。
表示させる文字を変更するには""内の文字を変更してください。

 

ヘッダー・フッターには、文字列の他に
次の組み込み要素を表示させることができます。

組み込み要素 指定文字列
ページ番号 &P
総ページ数 &N
日付 &D
時刻 &T
パス &Z
ファイル名 &F
シート名 &A

右側の文字列は、左側の組み込み要素を表示させたい場合に
ヘッダー・フッターに入力する文字です。
例えば、日付を表示させたいときは
「&D」を入力します。

手動でヘッダー・フッターに組み込み要素を設定するには
[ヘッダー]もしくは[フッター]ウィンドウにある組み込み要素のボタンを使います。
Vba20200329d

VBAで組み込み要素を設定していきます。
下のコードはヘッダー右側に印刷時の日付と時間、
フッター中央にページ番号/総ページ数、
フッター右側にパス、ファイル名、シート名を表示します。

""で囲まれた文字列の中に
スペースを入れるとそのまま表示されます。
また、改行したい場合はChr(10)を使います。
使い方は下のコードを参考にしてください。

ヘッダー・フッターを設定するコード2:

Sub Macro20200329b()
'ヘッダー・フッター
'組み込み要素

    With ActiveSheet.PageSetup
        .LeftHeader = ""
        .CenterHeader = ""
        .RightHeader = "&D  &T"
        .LeftFooter = ""
        .CenterFooter = "&P/&N"
        .RightFooter = "&Z" & Chr(10) & "&F" & "  " & "&A"
    End With
   
 End Sub

実行例:
Vba20200329e

 

| | コメント (0)

2020年3月28日 (土)

ページ設定の自動化

ページ設定は
[ファイル]-[印刷]-[ページ設定]をクリックする、もしくは
[ページレイアウト]タブのページ設定区分、右下の矢印をクリックすると
現れるウィンドウで設定できます。
(以下このウィンドウを「ページ設定」とする)
Vba20200328a

ページ設定の項目はたくさんありますが
まずは、アクティブシートを印刷するときに
よく設定する項目についてのみ
自動設定をするマクロを作成します。

よく設定する項目として下記の5点を設定していきます。
(1)印刷範囲の設定
(2)余白
(3)印刷の向き
(4)用紙サイズ
(5)拡大縮小印刷

 

(1)印刷範囲の設定
手動で印刷範囲を設定する場合は、
印刷したい範囲(例としてA1:I100の範囲)を選択した状態で
[ページレイアウト]タブ-[印刷範囲]-[印刷範囲の設定]ボタンをクリックします。

VBAでは
次のようにPrintAreaプロパティを指定します。

ActiveSheet.PageSetup.PrintArea = "A1:I100"

(2)余白
手動では、ページ設定の[余白]タブで設定します。
Vba20200328b

VBAでは次のようにします。
カッコ内の0.6などの数値をcm単位で指定します。
下のコードでは左の余白0.6cm、右0.6cm
上1.9cm、下1.9cm
ヘッダー0.8cm、フッター0.8cmに指定します。

With ActiveSheet.PageSetup
    .LeftMargin = Application.CentimetersToPoints(0.6) '左
    .RightMargin = Application.CentimetersToPoints(0.6) '右
    .TopMargin = Application.CentimetersToPoints(1.9) '上
    .BottomMargin = Application.CentimetersToPoints(1.9) '下
    .HeaderMargin = Application.CentimetersToPoints(0.8) 'ヘッダー
    .FooterMargin = Application.CentimetersToPoints(0.8) 'フッター
End With

(3)印刷の向き
手動では、
ページ設定の[ページ]タブ-[印刷の向き]で設定します。
Vba20200328c

VBAでは次のコードの1行目で縦向き、2行目で横向きを指定します。
どちらか片方のみ使用してください。

ActiveSheet.PageSetup.Orientation = xlPortrait '縦
ActiveSheet.PageSetup.Orientation = xlLandscape '横

(4)用紙サイズ
手動では
ページ設定の[ページ]タブ-[用紙サイズ]で設定します。
Vba20200328d

VBAでは
下記のコードの1行目でA4用紙サイズを指定します。
2行目がA3サイズ、3行目がB5サイズを指定します。
目的の用紙サイズの1行のみ使用してください。

ActiveSheet.PageSetup.PaperSize = xlPaperA4 'A4
ActiveSheet.PageSetup.PaperSize = xlPaperA3 'A3
ActiveSheet.PageSetup.PaperSize = xlPaperA5 'B5

その他のサイズは下記のMicrosoftサイト内を参照してください。
xlpapersize 列挙 (Excel)

(5)拡大縮小印刷
手動では
ページ設定の[ページ]タブ-[拡大縮小印刷]で設定します。
Vba20200328e

VBAでの方法は、次のよく使う設定3パターンを見ていきます。
・シートを1ページに印刷
・すべての列を1ページに印刷
・拡大縮小率を設定

下記のコードのようにします。

'シートを1ページに印刷
With ActiveSheet.PageSetup
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With

'すべての列を1ページに印刷
With ActiveSheet.PageSetup
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = False
End With

'拡大縮小率を設定
ActiveSheet.PageSetup.Zoom = 80

 

以上で設定の各要素を見てきましたので、
これらをまとめて一括でページ設定をできるようにします。
(1)~(5)の必要な部分をコピペして
1つのマクロにまとめます。

ページ設定のコードの前に
次のコード記述してプリンタとの通信を停止します。

Application.PrintCommunication = False

設定後PrintCommunicationプロパティをTrueにして
プリンタの設定にも変更を反映させます。
これをしないと設定項目を変更するごとに
プリンタも設定することになるので
コードの実行時間が長くなります。

例としてページ設定をまとめたコードは次のようになります。

ページ設定の自動化するコード1:

Sub macro20200328a()
'印刷設定
' 印刷範囲 A1:I100
' 余白 左右0.6cm 上下1.9cm ヘッダーフッター0.8cm
' 用紙向き 縦
' 用紙サイズ A4
' 拡大縮小 シートを1ページに印刷

    Application.PrintCommunication = False
   
'印刷範囲
    ActiveSheet.PageSetup.PrintArea = "A1:I100"
   
'余白
    With ActiveSheet.PageSetup
        .LeftMargin = Application.CentimetersToPoints(0.6)
        .RightMargin = Application.CentimetersToPoints(0.6)
        .TopMargin = Application.CentimetersToPoints(1.9)
        .BottomMargin = Application.CentimetersToPoints(1.9)
        .HeaderMargin = Application.CentimetersToPoints(0.8)
        .FooterMargin = Application.CentimetersToPoints(0.8)
    End With
   
'用紙の向き
    ActiveSheet.PageSetup.Orientation = xlPortrait '縦
   
'用紙サイズ
    ActiveSheet.PageSetup.PaperSize = xlPaperA4 'A4

'拡大縮小
    'シートを1ページに印刷
    With ActiveSheet.PageSetup
        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = 1
    End With
   
    Application.PrintCommunication = True
   
End Sub

上記マクロをよく見てみると
ActiveSheet.PageSetupの部分が共通していますので、
この共通部分はWithステートメントでまとめることができます。
まとめると次のコードのようになります。

ページ設定の自動化するコード2:

'印刷設定
' 印刷範囲 A1:I100
' 余白 左右0.6cm 上下1.9cm ヘッダーフッター0.8cm
' 用紙向き 縦
' 用紙サイズ A4
' 拡大縮小 シートを1ページに印刷

    Application.PrintCommunication = False
   
    With ActiveSheet.PageSetup
        '印刷範囲
        .PrintArea = "A1:I100"
       
        '余白
        .LeftMargin = Application.CentimetersToPoints(0.6)
        .RightMargin = Application.CentimetersToPoints(0.6)
        .TopMargin = Application.CentimetersToPoints(1.9)
        .BottomMargin = Application.CentimetersToPoints(1.9)
        .HeaderMargin = Application.CentimetersToPoints(0.8)
        .FooterMargin = Application.CentimetersToPoints(0.8)
       
        '用紙の向き
        .Orientation = xlPortrait '縦
       
        '用紙サイズ
        .PaperSize = xlPaperA4 'A4
       
        '拡大縮小
        'シートを1ページに印刷
        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = 1
       
    End With
   
    Application.PrintCommunication = True
   
End Sub

以上ではアクティブシートに対してのページ設定でしたが
ActiveSheetの部分をSheets("Sheet1")などとすれば
特定のシートに対してページ設定ができます。

| | コメント (0)

2020年3月27日 (金)

ワークブックのパスを取得する

パスとは、
ブックが保存されているフォルダの場所のことです。

例えば、

C:\Users\Username\Documents\

のようなものです。

アクティブブックのパスは
次のコードで取得できます。

ActiveWorkbook.Path

A1セルにパスの値を入れるには
次のコードのようにします。

アクティブブックのパスを取得するコード:

Sub macro20200327a()
'アクティブブックのパスを取得

    Sheets.Add 'シート追加
    Cells(1, 1) = ActiveWorkbook.Path
   
End Sub

実行結果一例:
Vba20200327a
シートが追加され、
アクティブブックのパスが入力されました。

 

開いているすべてのブックのパスを取得したい場合は、
For Each文を使って
Workbookオブジェクトに格納されているすべてのブックに対して
パスを取得していきます。

Workbookオブジェクトには
開いているすべてのブックが格納されています。

開いているすべてのブックのパスを取得するコード:

Sub macro20200327b()
'開いているすべてのブックのパスを取得

    Dim wb As Workbook
    Dim count As Integer
   
    Sheets.Add
    Cells(1, 1) = "No."
    Cells(1, 2) = "ファイル名"
    Cells(1, 3) = "パス"
   
    count = 0
    For Each wb In Workbooks
        count = count + 1
        Cells(count + 1, 1) = count
        Cells(count + 1, 2) = wb.Name
        Cells(count + 1, 3) = wb.Path
    Next wb
   
    Cells.EntireRow.AutoFit
    Cells.EntireColumn.AutoFit
   
End Sub

実行結果一例:
Vba20200327b

 

次は取得したパスを使って
アクティブブックと同じフォルダに
アクティブブックの複製を保存するコードを作成してみます。

変数wb_pathにアクティブブックのパスを入れます。
複製として保存するブック名は変数wb_nameです。
アクティブブックの名前+日時を
複製するブックの名前にします。

SaveCopyAsメソッドで
アクティブブックの複製を名前を付けて保存します。
このときActiveWorkbook自体は保存や変更はされません。

アクティブブックの複製を保存するコード:

Sub macro20200327c()
'アクティブブックの複製を保存

    Dim wb_path As String 'アクティブブックのパス
    Dim ab_name As String 'アクティブブック名
    Dim wb_name As String '複製されたブック名
   
    wb_path = ActiveWorkbook.Path
    ab_name = ActiveWorkbook.Name
    wb_name = Left(ab_name, InStr(ab_name, ".") - 1) _
        & "_" & Format(Now(), "yyyymmdd_hhmmss") _
        & ".xlsx"
   
    ActiveWorkbook.SaveCopyAs wb_path & "\" & wb_name

End Sub

実行結果は
アクティブブックが保存されているフォルダに
次のようなブックが保存されていることを確認してください。
ファイル名(一例):アクティブブック名_20200327_2142.xlsx

 

| | コメント (0)

2020年3月26日 (木)

ワークブックをアクティブにする

ワークブックをアクティブにするとは
手動操作でいうと
Excelのウィンドウ内をクリックして
編集できる状態にすることです。

VBAでワークブックをアクティブにするには
次のようにします。

ワークブックをアクティブにするコード:

Sub macro200326a()
'ワークブックをアクティブにする

    Workbooks("Book1.xlsx").Activate
   
End Sub

"Book1.xlsx"の部分でワークブックの名前を指定します。
ワークブックの名前は拡張子も含めて指定します。
ただし、1回も保存していないワークブックは拡張子がないので
拡張子なしで指定します。

また、既に開いている状態のワークブックの名前しか
指定できません。
既に開いているワークブックの名前は
ウィンドウのタイトルでも確認できます。

  Vba20200326a

Activateメソッドを実行したときに
次のエラーが発生することがあります。

Vba20200326b

このエラーは
指定したワークブックが
開いているワークブックの中になかったため起きた可能性があるので
ワークブックの名前が正しいか確認してください。

| | コメント (0)

2020年3月24日 (火)

既存xls形式ブックをxlsx、xlsm形式で保存し直す

Excel2003までの保存形式はxls形式でした。
Excel2007以降はマクロが使えるブックはxlsm形式、
マクロが使えないブックはxlsx形式になりました。

xls形式のブックとは言い換えると
拡張子が.xlsのブックのことです。
同じくxlsx形式の拡張子は.xlsx、
xlsm形式の拡張子は.xlsmです。

xlsx、xlsm形式で保存すると
使用できる行数、列数が
65,536 行、256 列から1,048,576 行、16,384 列に増加するなど
既存のxls形式ブックをxlsx、xlsm形式で保存し直すメリットがあります。

VBAで既存xls形式ブックをxlsx形式で保存し直していきます。

下記のコードでは
既存xls形式ブックを開いて、
保存形式をxlsxに変更して名前を付けて保存します。

変数wb_path1は既存xls形式ブックが保存されているフォルダ場所、
変数wb_name1は既存ブックの拡張子xlsを含むブック名、
変数wb_path2は再保存するブックを保存するフォルダ場所、
変数wb_name2はwb_name1の拡張子を除いたブック名です。

名前を付けて保存はSaveASメソッドを使用します。
xlsx形式で保存する際にアラートが出るので

Application.DisplayAlerts = False

でアラートを無効にしています。

また、xls形式ブックにマクロがあった場合は
xlsx形式ブックにマクロは保存されません。

コードはこちら

既存xls形式ブックをxlsx形式で保存し直すコード:

Sub macro200323a()
'既存xls形式ファイルをxlsx形式で保存し直す

    Dim wb As Workbook
    Dim wb_path1 As String, wb_path2 As String
    Dim wb_name1 As String, wb_name2 As String
    wb_path1 = "C:\Users\●●●\元ブック"
    wb_name1 = "Book1.xls"

    wb_path2 = "C:\Users\●●●\再保存ブック"
    wb_name2 = Left(wb_name1, InStr(wb_name1, ".") - 1)

    Set wb = Workbooks.Open(wb_path1 & "\" & wb_name1)

    Application.DisplayAlerts = False
    wb.SaveAs Filename:=wb_path2 & "\" & wb_name2, _
        FileFormat:=xlWorkbookDefault
    Application.DisplayAlerts = True

    wb.Close

End Sub

実行結果は
保存先に指定したフォルダに
xlsx形式のブックが保存されているか確認してください。

xlsm形式で保存したい場合は、
上のマクロのFileFormat引数のxlWorkbookNormal部分を
xlOpenXMLWorkbookMacroEnabledに変更してください。

| | コメント (0)

2020年3月21日 (土)

ワークブックを新規作成、名前をつけて保存、閉じる

ワークブックを新規作成するには
Workbooks.Addメソッドを使用します。
今回は変数wbに新規作成したワークブックを入れておきます。

新しく作成したワークブックに名前をつけるには
"名前を付けて保存"をします。
保存をしないで名前を付けることはできません。

"名前を付けて保存"をするにはSaveASメソッドを使用します。
Filename引数にファイルのフルパスを指定します。

下記のマクロでは変数wb_pathに保存先のフォルダを指定、
変数wb_nameに拡張子を含まないファイル名を指定します。

FileFormatプロパティで保存形式を指定します。
下記のマクロではxls形式を表す"xlWorkbookNormal"を指定しています。

ワークブックを新規作成、名前を付けて保存、閉じるコード:

Sub macro200316a()
'ワークブックを新規作成して名前を付けて保存、閉じる

    Dim wb As Workbook
    Dim wb_path As String
    Dim wb_name As String
    wb_path = "C:\保存先フォルダ"
    wb_name = "Book1"

    Set wb = Workbooks.Add
    wb.SaveAs Filename:=wb_path & "\" & wb_name, _
        FileFormat:=xlWorkbookNormal
    wb.Close

End Sub

実行結果は
保存先に指定したフォルダに
Book1.xlsが保存されているか確認してください。

xlsx形式で保存したい場合は、
上記のマクロのFileFormat引数のxlWorkbookNormal部分を
xlWorkbookDefaultに変更してください。
同じくxlsm形式で保存したい場合は、
xlOpenXMLWorkbookMacroEnabled に変更してください。

その他の形式については
FileFormat引数の詳細については記載された
次のMicrosoftページを参照してください。
「XlFileFormat 列挙体 (Excel)」

 

| | コメント (0)

« 2019年1月 | トップページ | 2020年4月 »