
PDF ファイルを作る Excel VBA(マクロ)を書きました。
Excel (Office) 2007 以降ではシートの内容を PDF にエクスポートできるようになっています。
それをコードで書くだけなのですが、少しハマリました。
PDF へのエクスポート自体はすぐにできました。
別のPCでにも動作を検証しようと思い、動かしたら・・・
プリンター選択のダイアログが表示され、
Adobe Acrobat が選択済みになっていました。
PDF 出力なので、それで良いかと思い先に進んだら
コードにエラーあり・・・となりました。
そんなこと言われても、開発したPCではちゃんと動いていたじゃないか・・・
検証目的で使ったのは、Windows 7 のメインPC。
メインPCなのでたくさんのソフトが入っています。
そのうちの一つが Adobe Acrobat(PDF ファイルを作るソフト)。
開発したPCには Acrobat は入っていません。
PCに違いは多々あれど、今回の問題に関係しそうなのは Acrobat の有無。
Acrobat の入っているPCではマクロが思ったように動かないのです。
で、当該マクロ付きファイルを開き、VB Editor で [ツール] > [参照設定] に進みました。
参照設定の中より [Acrobat Access 3.0 Type Library] にチェックを入れました。

これで Acrobat がインストールされているPCでも、そうでないPCでも
思ったとおりに PDF ファイルへのエクスポートができるようになりました。
半年経ったら自分でも間違いなく忘れてしまいそうなので、
おやぢチップスとして残します。
なお、シートの内容を PDF にエクスポートするコードはこんな感じ・・・
(シートに [Create PDF] と表示されたボタン btn_CreatePDF を置いています)

Private Sub btn_CreatePDF_Click()
' --- エクスポートする範囲を指定
Range("B1:F38").Select ' --◀ ここの範囲は適当に修正してください
' --- create PDF object
Dim fileName As String ' --◀ 出力する PDF ファイル名をフルパスで指定します
fileName = ThisWorkbook.Path & "ファイル名.pdf"
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
' --- PDF ファイルが開いていたら、メッセージを表示し閉じてもらう
Dim IsOpen As Boolean
IsOpen = True
Do Until (IsOpen = False)
If (fncIsFileOpen(fileName) = True) Then
MsgBox "PDF file is opened already. Close it."
IsOpen = True
Else
IsOpen = False
End If
Loop
' --- PDF へのエクスポート
' ------------------------------------------------------------------------
' Adobe Acrobat がインストールされている場合は次が必要:
' VB エディタ [ツール] -[参照設定] で
' [Adobe Acrobat x.x Type Library] にチェックを入れておくこと。
' そうしなければ、プリンター選択ダイアログが表示され、以下が機能しない。
' ------------------------------------------------------------------------
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
fileName:=fileName
' --- reset range(特に必要ではありません)
Range("B1").Select
' --- post process(後処理)
If (MsgBox("PDF ファイルが作られました。" & Chr(13) & "それを開きますか?", _
vbYesNo, "open or not") = vbYes) Then
Call Shell("explorer.exe " & fileName)
End If
End Sub
' --- ファイルが開かれているかを示す関数(開かれていたら True)
Public Function fncIsFileOpen(ByVal strArgFile As String) As Boolean
On Error GoTo FILE_ERR
Open strArgFile For Binary Access Read Lock Read As #1
Close #1
fncIsFileOpen = False
Exit Function
FILE_ERR:
fncIsFileOpen = True
End Function
---------------------------------------------------------
ブログ記事についてのお問い合わせは「質疑応答 掲示板」で・・・
# ご質問にはできる限りお答えしています。
ただし、お名前(本名)を書いていただいた場合に限らせていただきます。

ここをクリックして、北窓舎のサイトにもお立ち寄りください・・・
Excel (Office) 2007 以降ではシートの内容を PDF にエクスポートできるようになっています。
それをコードで書くだけなのですが、少しハマリました。
PDF へのエクスポート自体はすぐにできました。
別のPCでにも動作を検証しようと思い、動かしたら・・・
プリンター選択のダイアログが表示され、
Adobe Acrobat が選択済みになっていました。
PDF 出力なので、それで良いかと思い先に進んだら
コードにエラーあり・・・となりました。
そんなこと言われても、開発したPCではちゃんと動いていたじゃないか・・・
検証目的で使ったのは、Windows 7 のメインPC。
メインPCなのでたくさんのソフトが入っています。
そのうちの一つが Adobe Acrobat(PDF ファイルを作るソフト)。
開発したPCには Acrobat は入っていません。
PCに違いは多々あれど、今回の問題に関係しそうなのは Acrobat の有無。
Acrobat の入っているPCではマクロが思ったように動かないのです。
で、当該マクロ付きファイルを開き、VB Editor で [ツール] > [参照設定] に進みました。
参照設定の中より [Acrobat Access 3.0 Type Library] にチェックを入れました。

これで Acrobat がインストールされているPCでも、そうでないPCでも
思ったとおりに PDF ファイルへのエクスポートができるようになりました。
半年経ったら自分でも間違いなく忘れてしまいそうなので、
おやぢチップスとして残します。
なお、シートの内容を PDF にエクスポートするコードはこんな感じ・・・
(シートに [Create PDF] と表示されたボタン btn_CreatePDF を置いています)

Private Sub btn_CreatePDF_Click()
' --- エクスポートする範囲を指定
Range("B1:F38").Select ' --◀ ここの範囲は適当に修正してください
' --- create PDF object
Dim fileName As String ' --◀ 出力する PDF ファイル名をフルパスで指定します
fileName = ThisWorkbook.Path & "ファイル名.pdf"
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
' --- PDF ファイルが開いていたら、メッセージを表示し閉じてもらう
Dim IsOpen As Boolean
IsOpen = True
Do Until (IsOpen = False)
If (fncIsFileOpen(fileName) = True) Then
MsgBox "PDF file is opened already. Close it."
IsOpen = True
Else
IsOpen = False
End If
Loop
' --- PDF へのエクスポート
' ------------------------------------------------------------------------
' Adobe Acrobat がインストールされている場合は次が必要:
' VB エディタ [ツール] -[参照設定] で
' [Adobe Acrobat x.x Type Library] にチェックを入れておくこと。
' そうしなければ、プリンター選択ダイアログが表示され、以下が機能しない。
' ------------------------------------------------------------------------
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
fileName:=fileName
' --- reset range(特に必要ではありません)
Range("B1").Select
' --- post process(後処理)
If (MsgBox("PDF ファイルが作られました。" & Chr(13) & "それを開きますか?", _
vbYesNo, "open or not") = vbYes) Then
Call Shell("explorer.exe " & fileName)
End If
End Sub
' --- ファイルが開かれているかを示す関数(開かれていたら True)
Public Function fncIsFileOpen(ByVal strArgFile As String) As Boolean
On Error GoTo FILE_ERR
Open strArgFile For Binary Access Read Lock Read As #1
Close #1
fncIsFileOpen = False
Exit Function
FILE_ERR:
fncIsFileOpen = True
End Function
---------------------------------------------------------
ブログ記事についてのお問い合わせは「質疑応答 掲示板」で・・・
# ご質問にはできる限りお答えしています。
ただし、お名前(本名)を書いていただいた場合に限らせていただきます。

ここをクリックして、北窓舎のサイトにもお立ち寄りください・・・