- ベストアンサー
Excel VBAを使用してエクセルシートをPDF化する方法
- Excel VBAを使用してエクセルシートをPDF化する方法を教えてください。
- 指定したフォルダに自動的に保存されるようにするためのコードを教えてください。
- Acrobat Distiller 6.0とAdobe Acrobat 6.0 Standardを使用してExcel VBAを使ってPDF化する方法がわかりません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1,2です。 Postscriptのファイルを生成し、そこから更に変換しているので、時間がかかるのかもしれませんね。 解決策は存じません。 #2にご提示のコードで、以前ファイル名指定のダイアログを操作する事にトライしましたが、既にVBAの制御を離れていて、無理な様でした。 余談ですが、会社で試してみたところ、PdfDistillerを用いる方は、Acrobat9 std.でも動作しましたが、AcroExch.PDDocの方は「認証が必要...」といったエラーが発生し、Acrobatを「通常使うプリンタに設定」するといった対策を取らないと動作しませんでした。
その他の回答 (2)
- mitarashi
- ベストアンサー率59% (574/965)
#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
お礼
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
- mitarashi
- ベストアンサー率59% (574/965)
下記がお役に立つかもしれません。 Acrobat6 std. xl2000/windows2000の頃でした。 http://okwave.jp/qa/q4847920.html
補足
早速のご回答ありがとうございます! 明日会社で試した後フィードバックさせていただきたいと思います。 過去の質問歴は見ましたが上記は見逃しておりました。 本当に助かります。
お礼
ど素人相手に丁寧にご指導頂き有難うございます! 大変勉強になりました。 VBAからPDF操作するのは難しいですね。 今回いろいろトライして良い経験になりました。