4年ほど前に書いた、下記記事のマクロがWordでも使えるか?との質問を頂きました。
残念ながら、上記記事のコードをWordでそのまま使うことはできません。
そこで今回は、Excelに限定せず、WordやPowerPointファイルにも対応したマクロを書いてみました。
※下記コードはAcrobat PDFMakerを利用してPDFファイルへの変換を行います。Acrobatをインストールした上で、各Officeアプリケーション上でPDFMakerアドインを有効にする必要があります。
Option Explicit
Public Sub Sample()
'Wordファイルを読み取り・権限パスワード付のPDFに変換
ConvertPdfUsingPDFMaker "C:\Test\Conv\Test.docx", "C:\Test\Conv\Test.pdf", "passr", "passw"
End Sub
Public Sub Sample2()
'Word,PowerPoint,Excelファイルを読み取り・権限パスワード付のPDFに一括変換
Dim in_files, out_files
Dim i As Long
Const ReadPassWord As String = "1234"
Const WritePassWord As String = "7777"
in_files = Array("C:\Test\Conv\TestDOC.docx", _
"C:\Test\Conv\TestPPT.pptx", _
"C:\Test\Conv\TestXLS.xlsx")
out_files = Array("C:\Test\Conv\TestDOC.pdf", _
"C:\Test\Conv\TestPPT.pdf", _
"C:\Test\Conv\TestXLS.pdf")
For i = LBound(in_files) To UBound(in_files)
ConvertPdfUsingPDFMaker in_files(i), out_files(i), ReadPassWord, WritePassWord
Next
End Sub
Private Sub ConvertPdfUsingPDFMaker(ByVal InputFilePath As String, _
ByVal OutputFilePath As String, _
Optional ByVal ReadPassWord As String = "", _
Optional ByVal WritePassWord As String = "")
Dim pm As Object 'PDFMAKERAPILib.PDFMakerApp
Dim cset As Object 'PDFMAKERAPILib.ConversionSettings
Dim sset As Object 'PDFMAKERAPILib.securitySettings
Dim appType As Long
Dim settingsName As String
Dim prms As Long
Dim ret As Long
'PDFMAKERAPILib.SupportedApps
Const kAppUnknown = 0
'PDFMAKERAPILib.PDFMakerRetVals
Const kPDFMSuccess = 0
Const kPDFMErrorPDFMakerUnavailable = -10
Const kPDFMErrorFileOpenInAnotherApp = -24
'PDFMAKERAPILib.tagPrintingModesAllowedEnum
Const kPrintingAllowedNone = 0
Const kPrintingAllowedLowRes = 1
Const kPrintingAllowedHighRes = 2
'PDFMAKERAPILib.tagAllowedChangesEnum
Const kAllowChangesNone = 0
Const kAllowChangesInsertDeleteRotatePages = 1
Const kAllowChangesFormfillsSign = 2
Const kAllowChangesCommentingFormfillsSign = 6
Const kAllowChangesLayoutTouchupFormfillSign = 10
Const kAllowChangesAnyExceptPageExtraction = 14
Const kAllowChangesAll = 15
On Error Resume Next
Set pm = CreateObject("PDFMakerAPI.PDFMakerApp")
On Error GoTo 0
If pm Is Nothing Then
MsgBox "PDFMakerを取得できませんでした。" & vbNewLine & _
"処理を中止します。", vbCritical + vbSystemModal
Exit Sub
End If
'ファイル判定
appType = pm.GetSupportedAppType(InputFilePath)
Select Case appType
Case kAppUnknown
MsgBox "サポートされていないファイルです。" & vbNewLine & _
"処理を中止します。", vbCritical + vbSystemModal
Exit Sub
End Select
'変換設定 ※アプリケーションの設定に依存
'細かく設定する場合は下行のようにPDFMakerSettingsで指定
'prms = kCreateDocInfo Or kCreateComments Or kCreateLinks
Set cset = CreateObject("PDFMakerAPI.ConversionSettings")
cset.GetAppConversionDefaults appType, prms, settingsName
cset.SetConversionParameters prms
'セキュリティ設定
Set sset = cset.GetSecuritySettings
With sset
'文書を開くときのパスワード設定
If Len(Trim(ReadPassWord)) > 0 Then
.OpenDocPasswdNeeded = True
.OpenDocPasswd = ReadPassWord
End If
'権限設定
If Len(Trim(WritePassWord)) > 0 Then
.PermsPasswdNeeded = True
.PermsPasswd = WritePassWord
'------------------------------------------------------------
' * 下記は必要に応じて設定
'------------------------------------------------------------
' * 印刷を許可
'------------------------------------------------------------
'.PrintingModeAllowed = kPrintingAllowedHighRes '高解像度
'.PrintingModeAllowed = kPrintingAllowedLowRes '低解像度 (150 dpi)
.PrintingModeAllowed = kPrintingAllowedNone '許可しない
'------------------------------------------------------------
' * 変更を許可
'------------------------------------------------------------
'.AllowedChanges = kAllowChangesAnyExceptPageExtraction 'ページの抽出を除くすべての操作
'.AllowedChanges = kAllowChangesCommentingFormfillsSign '注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名
'.AllowedChanges = kAllowChangesFormfillsSign 'フォームフィールドの入力と既存の署名フィールドに署名
'.AllowedChanges = kAllowChangesInsertDeleteRotatePages 'ページの挿入、削除、回転
.AllowedChanges = kAllowChangesNone '許可しない
'------------------------------------------------------------
' * テキスト、画像、およびその他の内容のコピーを有効にする
'------------------------------------------------------------
.EnableCopyingContent = False 'True:チェックON / False:チェックOFF
End If
End With
cset.SetSecuritySettings sset
'PDF作成
ret = pm.CreatePDF(srcFilePath:=InputFilePath, _
pdfFilePath:=OutputFilePath, _
pSettings:=cset, _
bConvertSilent:=True, _
bShowProgress:=True, _
bConvertAsync:=False)
Select Case ret
Case kPDFMErrorFileOpenInAnotherApp
MsgBox "対象ファイルが別のアプリケーションによって開かれています。" & vbNewLine & _
"ファイルを閉じてから、再度実行してください。", vbCritical + vbSystemModal
Case kPDFMErrorPDFMakerUnavailable
MsgBox "PDFMakerアドインが有効になっていません。" & vbNewLine & _
"アドインを有効にしてから、再度実行してください。", vbCritical + vbSystemModal
Case kPDFMSuccess
Debug.Print "正常終了:" & InputFilePath '確認用
Case Else
MsgBox "処理が失敗しました。" & vbNewLine & _
"code:" & Hex(ret), vbCritical + vbSystemModal
End Select
End Sub
「Sample」は1ファイルのみ変換を行い、「Sample2」は複数のファイルを一括して変換するサンプルです。
例えば、Excelのシートに元ファイルのパスや出力先、パスワードを記載しておけば、まとめてパスワード付のPDFを作成することができるので、出番は割と多いのではないかと思います。
なお、本マクロは、Excelだけでなく、WordやPowerPointでも実行することができます。
本マクロを作成するにあたり、下記サイトを参考にしました。
情報量が少ないPDFMakerを使った処理について詳細にまとめられており、大変助かりました。
この場を借りてお礼申し上げます。



















この記事へのコメントはありません。