Excelマクロ入門
マクロの記録からのマクロ作成
Excelマクロ入門として、簡単なマクロの記録からマクロを作成していく手順を追っていく。
作成するマクロ
ExcelファイルをPDFで保存するマクロを作成することにする。
Excelファイルを準備
複数シートが1つをPDFになるのを確認するために、シートが2つあるサンプルのExcelファイルを準備する。
シートが2つあるサンプルのExcelファイル
PDFの出力手順
まずは、手動でExcelファイルをPDFで保存する方法を確認する。
以下の手順でExcelファイルをPDFで出力できる。
ファイル→エクスポート→PDF/XPSの作成→オプション→発行対象→ブック全体→OK→発行→PDFが出力される。
出力されたPDF
複数シートが出力されていることを確認する。
マクロの記録
上記の手順をマクロの記録を押してから行う。
開発→マクロの記録
記録された内容を確認してみる。
Sub Macro1()
'
' Macro1 Macro
'
'
ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"C:\Users\user\Documents\pdfにするサンプル.pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
True
End Sub
ActiveWorkbookはその時に操作対象になっているExcelファイルで
そのExcelファイルオブジェクトのExportAsFixedFormatメソッドでPDFに出力されているらしい。
TypeでおそらくPDFとかXPSを指定して、Filenameで保存する名称を指定しているように見える。
マクロの実行
作成したマクロを実行してみる。
そのままだと同じファイル名のPDFが出力されてしまうので、とりあえず、保存されるファイル名を変更してみる。
Sub Macro1()
'
' Macro1 Macro
'
'
ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"C:\Users\user\Documents\マクロから出力したPDF.pdf", _
Quality:=xlQualityStandard, IncludeDocProperties:=True, _
IgnorePrintAreas:=False, OpenAfterPublish:=True
End Sub
Excelシートの画面に戻って、
開発→マクロ [Alt] + [F8]
で表示されるダイアログでMacro1を選択して、実行ボタンをクリックすると、
変更した名前でPDFが出力される。
マクロの修正
出力後に作成したPDFが毎回Acrobat Readerで開かれてしまっている。
マイクロソフトのヘルプによると
OpenAfterPublish:=Trueのせいでいちいち作成したPDFが開かれるようなので
OpenAfterPublish:=Falseに変更する。
マクロの名称もMacro1ではわかりにくいので、ExportPDFに変更。
マイクロソフトのヘルプ:ExportAsFixedFormat メソッド
https://msdn.microsoft.com/ja-jp/library/office/ff198122.aspx
Sub ExportPDF()
'
' PDFを出力しても開かない
'
'
ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"C:\Users\user\Documents\PDFを出力しても開かない.pdf", _
Quality:=xlQualityStandard, IncludeDocProperties:=True, _
IgnorePrintAreas:=False, OpenAfterPublish:=False
End Sub
できたら、もう一度マクロの実行でPDFが出力されたかを確認する。
Acrobat Readerが開かれずに済むようになった。
一応動作するマクロができたので、ファイルを保存する。
マクロを保存するために拡張子をxlsmにしなければならない。
マクロ有効ブックで保存する。
マクロの汎用化
このままではこのマクロが埋め込まれたExcelファイルしかPDFにできない。
どうせなら開いたファイルをどれでもPDF出力できるようにしたい。
アドインの作成
アドインを作成してどのExcelファイルを開いた場合でもPDF出力できるようにしてみる。
名前を付けて保存から、拡張子「.xlam」で保存することでExcelにアドインとして読み込まれるようにできる。
アドインを起動して、もとのxlsxファイルをPDFにできるかを確認する。
しかしアドインのマクロはマクロの表示のダイアログには表示されない。
Visual Basic Editor からマクロを選択すれば実行できるが、使い勝手が悪すぎる。
ツールバー(リボン)に組み込んでみる
Excelのツールバー(リボン)からはアドインのマクロも実行できる。
ツールバー(リボン)に作成したマクロを実行するボタンを追加する。
これで、リボンからアドインのマクロを実行することができる。
このままでは毎回アドインを起動してからでないとはマクロを実行できない。
Excel起動時に自動で読み込まれていると、目的のExcelファイルを開くだけでツールバーからPDFを出力できる。
簡単にアドインを組み込むためにExcelの起動時に特定のブックを自動的に開く機能を利用する。
XLStartフォルダにブックを配置することで、起動時にアドインが自動的に開かれるようにできる。
マイクロソフトのヘルプ:Application.StartupPath プロパティ
https://msdn.microsoft.com/ja-jp/library/office/ff193231.aspx
XLStartフォルダの調べ方
Visual Basic Editor のイミディエイトペインでExcelファイルのスタートパスを確認できる。
[Alt]+[F11]
[Ctrl]+[G] [Enter]
?Application.StartupPath [Enter]
C:\Users\user\AppData\Roaming\Microsoft\Excel\XLSTART
このパスにアドインを保存することで、作成したアドインがExcel起動時に毎回読み込まれている状態になる。
PDFファイル名が同じになってしまうので、開いているExcelファイルの拡張子がPDFになったものが出力されるように修正する。
Sub ExportPDF()
'
' Excelファイル名の拡張子をPDFにしたもので保存
'
'
Dim targetBook As Workbook
Dim saveFileName As String
Dim saveFileFullName As String
Dim objFileSys As Object
Set targetBook = ActiveWorkbook
'ファイルシステムを扱うオブジェクトを作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
'GetBaseName:ファイル名から拡張子を除いたものを取得
saveFileName = objFileSys.GetBaseName(targetBook.Name) & ".pdf"
'BuildPath:パスの末尾に文字列を追加したパスを取得
saveFileFullName = objFileSys.BuildPath(targetBook.Path, saveFileName)
targetBook.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
saveFileFullName, _
Quality:=xlQualityStandard, IncludeDocProperties:=True, _
IgnorePrintAreas:=False, OpenAfterPublish:=False
End Sub
Excelを開かないでPDFにしたい
このままではExcelファイルを開いてからツールバーをクリックしないとPDFに変換できない。
いちいちExcelファイルを開いてからPDFに出力するのは煩わしい。
VBScriptに変換してExcelファイルを開かなくてもPDF出力できるようにしてみる。
VBScriptへ移植
VBAとVBScriptでは型の宣言に違いがある。
VBScriptではDimなどでStringなどの型の宣言が必要が無いというより、使用できない。
Excelファイルのパスをパラメータで受け取ることとする。
パラメータで受け取るといっても使用するときは簡単でVBScriptファイルにExcelファイルをドラッグアンドドロップするだけで済む。
Dim objArgs
Dim excelApplication
Dim workBook
'パラメータを受け取る
Set objArgs = WScript.Arguments
Set excelApplication = CreateObject("Excel.Application")
Set workBook = excelApplication.Workbooks.Open(objArgs(0))
Call ExportPDF (workBook)
'Excelブックを閉じる
workBook.Close
'ExcelApplicationを終了する
excelApplication.Quit()
Sub ExportPDF( targetBook )
'
' Excelファイル名の拡張子をPDFにしたもので保存
'
'
Dim saveFileName
Dim saveFileFullName
Dim objFileSys
'ファイルシステムを扱うオブジェクトを作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
'GetBaseName:ファイル名から拡張子を除いたものを取得
saveFileName = objFileSys.GetBaseName(targetBook.Name) & ".pdf"
'BuildPath:パスの末尾に文字列を追加したパスを取得
saveFileFullName = objFileSys.BuildPath(targetBook.Path, saveFileName)
targetBook.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
saveFileFullName, _
Quality:=xlQualityStandard, IncludeDocProperties:=True, _
IgnorePrintAreas:=False, OpenAfterPublish:=False
End Sub
拡張子vbsで保存することでvbscriptとして実行できる。
実行してみるために、ファイルをvbscriptファイルにドラッグ・アンド・ドロップして実行すると、ExportAsFixedFormat の行でエラーになってしまう。
xlTypePDFとかxlQualityStandardなどの定数がVBScriptではそのままでは使用できない。
ExcelのVBEで値を調べて定数として定義する。
それでも、まだExportAsFixedFormat の行でエラーになってしまう。
「Type:=」などの記述はVBScriptでは受け付けてくれない。
「Type:=」などはすべて外して
マイクロソフトのヘルプ:ExportAsFixedFormat メソッド
https://msdn.microsoft.com/ja-jp/library/office/ff198122.aspx
にのっている順番でパラメータをセットする。
Const xlTypePDF = 0
Const xlQualityStandard = 0
Dim objArgs
Dim excelApplication
Dim workBook
Set objArgs = WScript.Arguments
Set excelApplication = CreateObject("Excel.Application")
Set workBook = excelApplication.Workbooks.Open(objArgs(0))
Call ExportPDF (workBook)
workBook.Close
excelApplication.Quit()
Sub ExportPDF( targetBook )
'
' Excelファイル名の拡張子をPDFにしたもので保存
'
'
Dim saveFileName
Dim saveFileFullName
Dim objFileSys
'ファイルシステムを扱うオブジェクトを作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
'GetBaseName:ファイル名から拡張子を除いたものを取得
saveFileName = objFileSys.GetBaseName(targetBook.Name) & ".pdf"
'BuildPath:パスの末尾に文字列を追加したパスを取得
saveFileFullName = objFileSys.BuildPath(targetBook.Path, saveFileName)
targetBook.ExportAsFixedFormat 0, saveFileFullName, xlQualityStandard _
, True, False, , , False
End Sub
これでExcelファイルをVBScriptにドラッグ・アンド・ドロップすればPDFが出力されるようにできた。
ひとつづつではまだ面倒なので、複数のファイルをドラッグ・アンド・ドロップできるように複数の引数を受け付けるようにしたのがこちら。
Const xlTypePDF = 0
Const xlQualityStandard = 0
Dim excelApplication
Dim workBook
Set excelApplication = CreateObject("Excel.Application")
For Each a In WScript.Arguments
Set workBook = excelApplication.Workbooks.Open(a)
Call ExportPDF (workBook)
workBook.Close
Next
excelApplication.Quit()
Sub ExportPDF( targetBook )
'
' Excelファイル名の拡張子をPDFにしたもので保存
'
'
Dim saveFileName
Dim saveFileFullName
Dim objFileSys
'ファイルシステムを扱うオブジェクトを作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
'GetBaseName:ファイル名から拡張子を除いたものを取得
saveFileName = objFileSys.GetBaseName(targetBook.Name) & ".pdf"
'BuildPath:パスの末尾に文字列を追加したパスを取得
saveFileFullName = objFileSys.BuildPath(targetBook.Path, saveFileName)
targetBook.ExportAsFixedFormat 0, saveFileFullName, xlQualityStandard, True, False, , , False
End Sub
まだ改善の余地がありそうだが、自分の作業を簡略化するためならこのくらいで十分使用できる。
今回は使わなかったネタ
枠線をなくすマクロを作成
- Active
- Activate
- Select
- Selection
は、なくしていく
"A1"などのアドレスではなく
Cell(1,1)などで指定する方がプログラムとしては扱いやすい。
ウォッチに登録して内容を確認
自分自身の指定
×ActiveWorkbook
ThisWorkbook
×ActiveWorksheet
Me






















