こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excel VBAを使用してエクセルシートをPDF化する方法を教えてく

Excel VBAを使用してエクセルシートをPDF化する方法を教えてください。

【質問】
Excel VBAを使用してエクセルシートをPDF化し、指定したフォルダに自動的に保存されるようにしたいです。どういうコードを書けばよいか具体的にご教示いただけないでしょうか?



以下、参考資料

【参考:PSファイルを作成すべく自分で試したコード】
********************************************************************************
Sub PDF_WRITE()
Set objAcroPDDoc = CreateObject("AcroExch.PDDoc")
Application.ActivePrinter = "Adobe PDF on Ne01:"
ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:= _
"Adobe PDF on Ne01:", Collate:=True, PrintToFile:=True, PrToFileName:="C:\test.ps"
End Sub
********************************************************************************
↑を実行すると「postscript ファイルの作成時には、ホストフォントを送信する必要があります。」
とのエラーが表示されます。
しかしAdobe PDFの印刷設定から「フォントを送信しない」のチェックをはずしても、実行時に同じエラーが表示されます。


【使用ソフト&環境】
・Acrobat Distiller 6.0
・Adobe Acrobat 6.0 Standard
・Excel 2003
・Windows XP


【不可】
・業務用PCで使用するので、フリーソフト等、上記以外のソフトウェアのインストールはできません

【質問者スペック】
・プログラミングは殆どできません。エクセルでマクロを作成する際も、自動記録をベースにして多少変更を加えることができるくらいです。


【今まで参考にしたウェブページ】
http://pdf-file.nnn2.com/ 
(↑いろいろ詳しく書いてあるのですが、(1)「PDF化する」という項目がピンポイントでは出てこない、(2)私のような初心者には「アレンジする」ということができないので、「コピペしたらすぐ使えるコード」でないと参考にできません。。。)

http://www.asp-edita.jp/doda/one/doda1789_15.html
(↑ExcelExecute4MacroでPDF化できるのかもしれませんが、コピペして動かすと「入力した数式は正しくありません」とのエラーがでます。)

投稿日時 - 2010-09-25 00:12:28

QNo.6205938

困ってます

質問者が選んだベストアンサー

#1,2です。
Postscriptのファイルを生成し、そこから更に変換しているので、時間がかかるのかもしれませんね。
解決策は存じません。
#2にご提示のコードで、以前ファイル名指定のダイアログを操作する事にトライしましたが、既にVBAの制御を離れていて、無理な様でした。
余談ですが、会社で試してみたところ、PdfDistillerを用いる方は、Acrobat9 std.でも動作しましたが、AcroExch.PDDocの方は「認証が必要...」といったエラーが発生し、Acrobatを「通常使うプリンタに設定」するといった対策を取らないと動作しませんでした。

投稿日時 - 2010-09-27 21:26:14

お礼

ど素人相手に丁寧にご指導頂き有難うございます!
大変勉強になりました。

VBAからPDF操作するのは難しいですね。
今回いろいろトライして良い経験になりました。

投稿日時 - 2010-09-28 00:14:14

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

#1です、汎用化にトライしました。不足する関数、API宣言は参考URLを参照の事。コントロールパネルの「フォントを送信しない」チェック外しが必要です。ご参考まで。
Sub MakePdf()
Dim wbk As Workbook
Dim sh As Worksheet
Dim objAbDist As Object
Dim defPrt As String
Dim prtList() As String
Dim i As Long
Dim pdfPrt As String, altPrt As String

prtList = Get_Printers
If UBound(prtList) = 0 Then Exit Sub
For i = 0 To UBound(prtList)
If InStr(prtList(i), "PDF") > 0 Then
pdfPrt = prtList(i)
Else
altPrt = prtList(i)
End If
Next i
Set objAbDist = CreateObject("PdfDistiller.PdfDistiller.1")
defPrt = Application.ActivePrinter
Set wbk = Workbooks.Open("C:\Test.xls")
Application.ActivePrinter = altPrt
Application.ActivePrinter = pdfPrt
For Each sh In wbk.Worksheets
sh.PrintOut copies:=1, preview:=False, _
printtofile:=True, collate:=True, prtofilename:="C:\temp.ps"
objAbDist.FileToPDF "C:\temp.ps", "C:\" & sh.Name & ".pdf", vbNullString
'文字超過の為、sh.Name & ".log"削除は省略
Next sh
wbk.Close savechanges:=False
Application.ActivePrinter = defPrt
End Sub
'参考URLを改造させていただきました
Private Function Get_Printers() As String()
Dim objWSH As Object
Dim objPrinter As Object
Dim sPrtList() As String
Dim st1 As String
Dim st2() As String
Dim i As Long
Dim ctr As Long

Const SUB_ROOT = "Software\Microsoft\Windows NT\CurrentVersion\Devices"
Set objWSH = CreateObject("WScript.Network")
Set objPrinter = objWSH.EnumPrinterConnections
If objPrinter.Count < 2 Then
GoTo Exit_Proc
Else
ctr = 0
For i = 0 To objPrinter.Count - 1 Step 2
ReDim Preserve sPrtList(ctr)
sPrtList(ctr) = objPrinter(i + 1)
ctr = ctr + 1
Next
End If
ReDim Preserve st2(0 To ctr - 1)
For i = 0 To ctr - 1
st1 = RegRead_API(HKEY_CURRENT_USER, SUB_ROOT, sPrtList(i))
st1 = Replace(st1, "winspool,", "")
st2(i) = sPrtList(i) & " on " & st1
Next
Get_Printers = st2
Exit_Proc:
Set objPrinter = Nothing
Set objWSH = Nothing
End Function

参考URL:http://blogs.yahoo.co.jp/bardiel_of_may/40864687.html

投稿日時 - 2010-09-25 23:15:01

お礼

mitarashiさま

教えて頂いたコード(以前の回答の方)を張り付けて動かすことができました!
有難うございます。目的は達成できました。


質問を締め切る前に、図々しくて大変申し訳ないですが、もしおわかりでしたらもう一点ご教示ください。

↓のコードはPDFに変換するだけですが、これだと対象のエクセルシートのPDF化が2-3秒で完了します。
一方教えて頂いたコードだとPDF化に15秒程度かかります。
なんとか速くする方法は無いでしょうか?


************PDF化コード*************************************

Sub PDF_WRITE()
Set objAcroPDDoc = CreateObject("AcroExch.PDDoc")
Application.ActivePrinter = "Adobe PDF on Ne01:"
ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:= _
"Adobe PDF on Ne01:", Collate:=True
End Sub

投稿日時 - 2010-09-26 23:29:22

ANo.1

下記がお役に立つかもしれません。
Acrobat6 std. xl2000/windows2000の頃でした。
http://okwave.jp/qa/q4847920.html

投稿日時 - 2010-09-25 11:31:13

補足

早速のご回答ありがとうございます!
明日会社で試した後フィードバックさせていただきたいと思います。

過去の質問歴は見ましたが上記は見逃しておりました。
本当に助かります。

投稿日時 - 2010-09-25 13:49:04

あなたにオススメの質問