北の窓から(芦田っち)

PC関連と私的雑感のブログ。
2015年7月10日、カッコ内に名前を加えました。昔の友だちに気付いてほしくて・・・

おやぢチップス (74) : Excel VBA での PDF エクスポートは要注意

2017-05-15 12:36:19 | おやぢチップス
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


---------------------------------------------------------
ブログ記事についてのお問い合わせは「質疑応答 掲示板」で・・・

  # ご質問にはできる限りお答えしています。
    ただし、お名前(本名)を書いていただいた場合に限らせていただきます。


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

ジャンル:
ウェブログ
コメント   この記事についてブログを書く
この記事をはてなブックマークに追加
« 明日は何の日? Windows Upda... | トップ | WannaCrypt ランサムウェアの... »
最近の画像もっと見る

コメントを投稿


コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。

あわせて読む

トラックバック

この記事のトラックバック  Ping-URL