• 締切済み

PDF化に関するマクロを教えてください。

初めまして。どなたかご親切な方、教えてください。 エクセルのファイルに、約50のシートがあります。すべて同じ形式で、A4縦1枚に収まるサイズです。それぞれのシートに、外部からのリンクで数値が入るようになっています。このファイルを開いて、 ・シートごとに ・シートの名前をファイル名として ・PDF化 したいのです。 例)シート「A商事」→「A商事.pdf」 シートごとにPDF化するところまでは自力で組めたのですが、シートの名前を自動でPDFファイルの名前にする工程がうまく行きません。 なお、作業環境はWindows2000pro、Microsft Office Excel 97、Adobe PDF Writerです。派遣社員で、派遣先の環境のため、バージョンアップしたり新しいソフトを(フリーソフトでも)ダウンロードすることはできません。注文が多くて申し訳ありません。 下記に自分で組んだマクロを記述します。アドバイスよろしくお願いいたします。 Sub PDF化() Application.ActivePrinter = "Adobe PDF on Ne01:" For i = 1 To ActiveWorkbook.Sheets.Count Sheets(i).Activate ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:= _ "Adobe PDF on Ne01:", Collate:=True Next i End Sub

みんなの回答

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.5

もう誰も見ていないと思いますが、他の質問に答えた際に気になって、追加で調べてみました。 Acrobatの「フォントを送信しない」のチェック外すのを、コントロールパネルのプリンタから設定すると、PCをリセットするまでは、有効 ただし、既にxlsブックの、特定シートで、「フォントを送信しない」にチェックが入った状態で出力した事のあるファイルは、そちらの設定が記憶されており、優先されてしまう。 対策としては、対象ブックを開いた状態で、ActiveprinterをAcrobat以外に一旦設定し、再度Acrobatに戻す事で、シート毎の設定がリセットされ、コントロールパネルでの設定が有効になる。 それを盛り込んだコードです。DocuWorksがインストールされているので、それに合わせてありますが、お手元の環境に合わせて、Acrobat以外のプリンタに設定してください。 なお、on Ne 0?: を含むプリンタのリスト取得は、結構難航しましたが、下記に見つけました。(当方、その後プリンタを一時接続したので、ポート番号が変わっています) http://blogs.yahoo.co.jp/bardiel_of_may/40864687.html Sub MakePdf() Dim wbk As Workbook Dim sh As Worksheet Dim objAbDist As Object ' ACRODISTXLib.PdfDistiller Dim strDefaultPrinter As String Set objAbDist = CreateObject("PdfDistiller.PdfDistiller.1") strDefaultPrinter = Application.ActivePrinter Set wbk = Workbooks.Open("C:\Test.xls") Application.ActivePrinter = "DocuWorks Printer on Ne01:" Application.ActivePrinter = "Adobe PDF on Ne02:" Application.ScreenUpdating = False 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 Next sh wbk.Close savechanges:=False Application.ActivePrinter = strDefaultPrinter Application.ScreenUpdating = True End Sub

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.4

#1です。 Adobe Acrobat ?. Type Libraryを使う方法をみつけました。 http://questionbox.jp.msn.com/qa197098.html の回答番号1がそれですが、次の制約があります。 1.Activesheetしか出力しない。 2.印刷範囲を設定してあると、確認のダイアログが表示されてしまい、連続でという訳にいかない。 なお、上記リンク先のNo.1のコードは、Adobe Acrobatに参照設定しているのに、CreateObjectを使っている等、疑問な点もあります。 また、OKwaveの過去の記事に、AcrobatのダイアログをSendkeysで制御する方法がありましたが、VBA側に制御が戻らず、別プロセスのExcelからpdfを出力する方法を試みましたが、ダメでした。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#1です。検証していましたが、Acrobatの「フォントの送信」設定でエラーが出る事があり、難航しました。現状判明したのは、下記の通りです。 'コントロールパネル/プリンタで、Adobe PDFのアイコン上で右クリックし、印刷設定のAdobe PDF設定で、「フォントを送信しない」のチェックを外してから実行しないとエラーになる。 'この箇所をExcelブックで設定する場合は、各シート毎に設定する必要があり、不適当。一旦ブック上で設定してしまうと、情報がファイル内に残ってしまい何かと面倒。 Sub MakePdf() Dim wbk As Workbook Dim sh As Worksheet Dim objAbDist As Object ' ACRODISTXLib.PdfDistiller Dim strDefaultPrinter As String Set objAbDist = CreateObject("PdfDistiller.PdfDistiller.1") 'New ACRODISTXLib.PdfDistiller strDefaultPrinter = Application.ActivePrinter Application.ActivePrinter = "Adobe PDF on Ne01:" Set wbk = Workbooks.Open("C:\Test.xls") Application.ScreenUpdating = False 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 Next sh wbk.Close savechanges:=False Application.ActivePrinter = strDefaultPrinter Application.ScreenUpdating = True End Sub 数年来MS Office+Adobe Acrobatを使用しておりますが、Adobe PDF Makerとそのご先祖様のAdobe PDF Writerの意味を今回初めて知りました。Excelのメニューバーの端にある、Adobe PDF のメニューを一度も使った事がありませんでした(^^;) このアドインを制御できれば、もっと簡単に出来るのかもしれませんが、その道の達人にお任せします。

don-fox
質問者

お礼

ありがとうございます。 今日の昼間、教えていただいたマクロを自分で試してみましたが、まさにおっしゃる通りのところで難航しており、再度ご質問申し上げようかと思っていたところです。(とはいえ、いくつかのコードを使わせて頂き、はじめに考えていたものには及ばないながら、ある程度役に立つものを組むことができました。これもはじめのご回答をいただいたおかげです。ありがとうございます。) まだ、引き続き、アドバイスを募集させていただきたいと思います。よろしくお願いいたします。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

#1です。 開いたブックを閉じるタイミングを間違えてました。差し替え願います。 objAbDist.FileToPDF "C:\temp.ps", "C:\" & ActiveSheet.Name & ".pdf", vbNullString で、PostScriptファイルからpdfを生成後、閉じないといけませんね。 ActiveWorkbook.Close savechanges:=False もう寝ます。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

Acrobat 7.0 Standardの環境ではとりあえず動きました。眠いので検証・推敲不十分ですがご参考まで。 '出典 http://oshiete1.goo.ne.jp/qa1416324.html Sub MakePdf2() Dim objAbDist As Object ' ACRODISTXLib.PdfDistiller Dim strDefaultPrinter As String Set objAbDist = CreateObject("PdfDistiller.PdfDistiller.1") 'New ACRODISTXLib.PdfDistiller strDefaultPrinter = Application.ActivePrinter Application.ActivePrinter = "Adobe PDF on Ne01:" Workbooks.Open ("C:\Test.xls") ActiveSheet.PrintOut copies:=1, preview:=False, _ printtofile:=True, collate:=True, prtofilename:="C:\temp.ps" ActiveWorkbook.Close savechanges:=False objAbDist.FileToPDF "C:\temp.ps", "C:\" & ActiveSheet.Name & ".pdf", vbNullString Application.ActivePrinter = strDefaultPrinter End Sub

関連するQ&A

  • Excelマクロで1シートの中身変えて一冊のPDF

    ExcelのPDF出力で教えてください シート1に帳票テンプレートを作りまして、連番印刷しておりました。 雰囲気でこんな感じで Sub Macro1() ' Macro1 印刷 Dim i As Integer For i = 1 To 10 Range("a1").Value = Format(i, "0000") Sheets(1).PrintOut Next End Sub #例として1~10としましたが、本当は別シートの台帳の連番で #次は11から10枚とか50枚とか変数で指定してますです。 これをPDF出力へと変えようとして次のように変えようと考えました Sub Macro2() ' Macro2 PDF Dim FilePath As String FilePath = "C:\Temp\" Dim FileName As String Dim i As Integer For i = 1 To 10 Range("a1").Value = Format(i, "0000") FileName = "Temp" & i & ".pdf" Sheets(1).ExportAsFixedFormat Type:=xlTypePDF, _ FileName:=FilePath & FileName, _ Quality:=xlQualityStandard, _ IncludeDocProperties:=False, _ IgnorePrintAreas:=False, _ OpenAfterPublish:=False Next End Sub で、ここからが相談なんですが、これだとPDFファイルが10個出来ますよね? そうではなく、一冊の10ページのtemp.pdfとしたい場合はどのようにしましょうか? 一旦ズラズラズラーとPDF作ってからのPDF連結ソフト立ち上げての 手作業とかじゃ面倒なので、全自動でVBA処理で出来ればいいなと思っています。 Sheets(1)に0001作ってSheets(2)に複写 Sheets(1)に0002作ってSheets(3)に複写 Sheets(1)に0003作ってSheets(4)に複写 ・・・ Sheets(2)~Sheets(11)まで選択してあげてのPDFエクスポート Sheets(2)~Sheets(11)削除 という流れを構想してみたのですが 他にも、こうすると簡単だよとかいうアドバイスなどありましたら ぜひともご教示くださいませ♪ Sheets(Array("Sheet2", "Sheet3",・・・)).Select ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF~ ActiveWindow.SelectedSheets.Delete という感じ 一挙にいきなりいっぱいシート生成していくのも見た目びっくりだし 配列にシート名入れていくのも面倒だし、どうしてやるのがベターなのかな?と 思案中です

  • VBAでExcelファイルのPDF自動化

    表題の通りの事をしたいと思っています。とあるサイトで参照したvbaコードで、デスクトップにファイルをExcelのブック名と同じ名前でPDFに変換するところまで出来ました。あと自動でやりたいことは2つあり、(1)とあるセルの情報を読み込み保存名にしたい【○○○.pdfという具合に】、(2)生成したpdfファイルの保存先をマクロ内に設け指定したいです。【\\サーバー名\○○\△△\□□などのように】 現状までのコードを表記します。わかる方いらっしゃいましたら、お手数ですがアドバイスお願いします。 自分はマクロは手を出したばかりで、初心者です。宜しくお願いします。 Sub pdf() Dim i As Integer Dim s_prn As String, oldprn As String, flg As Boolean On Error Resume Next s_prn = "Adobe PDF" 'インストールされているPDFプリンタの名前 oldprn = ActivePrinter 'アクティブプリンタを取得 If InStr(oldprn, s_prn) = 0 Then '切替えたいプリンタがアクティブプリンタでない場合 flg = False 'プリンタ切替フラグ For i = 0 To 99 ActivePrinter = s_prn & " on Ne" & Format(i, "00") & ":" '「"プリンタ名"on NeXX:」形式PC用 ActivePrinter = "Ne" & Format(i, "00") & ": の " & s_prn '「NeXX: の "プリンタ名"」形式PC用 If ActivePrinter <> oldprn Then flg = True 'プリンタ切替成功 Exit For End If Next i If flg = False Then 'プリンタ切替失敗の場合 MsgBox "プリンタ名:" & s_prn & " が見つかりません。" Exit Sub End If End If ActiveSheet.PrintOut ActivePrinter = oldprn 'アクティブプリンタを元に戻す MsgBox "終了しました。" End Sub

  • ExcelマクロでAcrobatを制御したい

    いつも楽しく勉強させていただいております。 下記の作業をExcelマクロで自動化したいのですが、うまくいきません。 (1)ブックの中の非表示でないシートをすべて選択する。 (2)PDFファイルとして出力する。 Win7でExcelのバージョンは2003です。 社内には2007もあるのですが、レーダーチャートが崩れるとかで2003を使わないといけません。 PDF化するためにAdobe Acrobat XI Proの製品版を購入する予定ですが、とりあえず30日間無料のお試し版をインストールしてあります。 自動記録を利用しつつ、下記のマクロを作成しました。 Sub PDF化() Dim ws As Worksheet Dim i As Integer Dim ArrayShName() As String Workbooks.Open "C:\Users\meglin\Documents\出力フォルダ\book1.xls" i=0 For Each ws In Worksheets If ws.Visible = xlSheetVisible Then ReDim Preserve ArrayShName(i) ArrayShName(i) = ws.Name i = i + 1 End If Next Worksheets(ArrayShName).Select Application.ActivePrinter = "Adobe PDF on Ne10:" ActiveWindow.SelectedSheets.PrintOut copies:=1, collate:=True End Sub ところがこれを実行すると困ったことが二つあります。 (1)PDFの保存場所を聞くダイアログボックスが表示される。 (2)できたPDFファイルが自動的に表示されてしまう。 Excelのブックは将来的には数千個になるので、これではやっていられません。 保存場所は最初に指定したフォルダに入れて毎回聞いて来ないでほしいし、できたPDFもいちいち表示されないようにできないものでしょうか。 Adobe Acrobat XI Proを起動しておいて複数のブックを選択してPDF化することも試しましたが、一番最初のシートしかPDFにしてくれません。

  • 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化できるのかもしれませんが、コピペして動かすと「入力した数式は正しくありません」とのエラーがでます。)

  • エクセルで印刷時に、ページ毎にPDF保存するマクロ

    エクセルで印刷時にPDF保存をしたいですのですが、ページ毎に名前を変えて保存をしたいです。 例えば、 For i = 1 To 50 Application.ActivePrinter = "Microsoft Print to PDF on Ne02:" ActiveSheet.PrintOut From:=i, to:=i Next i であれば、1ページずつ保存は出来るのですが、ファイル名もセルを参照しながら変えていきたいです。 具体的には、G列の1行名から50行目まで取引先の名前を入れていて 印刷毎に、取引先名でPDFを保存します。 Activesheet.ExportAsFixedFormat Type:=xlTypePDF, _ Filename:=ActiveWorkbook.Path & "\" & fName & ".pdf" のような方法は、ネットにもありますが、これだとページ毎にファイル名を変えられないので困っています。 よろしくお願いいたします。

  • マクロ

    色々やってみたものの… これ以上できません。 やりたいこと↓ 例)シート2のA~Zにデータがあります (1)シート2、A1~24をシート1、D2に貼り付ける (2)シート1を印刷、PDFでフォルダに保存(保存名は【シート2、A25】又は【シート1、D3&"_"&D4】) (3)シート2のA列を削除、シート1の(1)で張り付けたものを消す ※これをシート2、A列のデータがなくなるまで繰り返す。  ・(※)の繰り返すやり方がわからない  ・下記で実行を何度かやると印刷は上手く行くんですが   保存する時にファイル名が最初のファイル名のままで中身が上書きされてしまいます… Sub カード() ' ' カード Macro ' ' Keyboard Shortcut: Ctrl+a ' Sheets("Sheet2").Select Range("A1:A24").Select Selection.Cut Sheets("Sheet1").Select Range("D2").Select ActiveSheet.Paste Sheets("Sheet2").Select Range("A25").Select ActiveCell.FormulaR1C1 = "" Sheets("Sheet1").Select ChDir "C:\Users\sinnbasi\Desktop\カード" ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ "C:\Users\sinnbasi\Desktop\カード\RON37806_4021489.pdf", Quality:= _ xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _ OpenAfterPublish:=False ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _ IgnorePrintAreas:=False Range("D2:D25").Select Selection.ClearContents Sheets("Sheet2").Select Columns("A:A").Select Selection.Delete Shift:=xlToLeft Sheets("Sheet1").Select End Sub 詳しい方教えて頂けないでしょうか。 宜しくお願い致します。

  • excel マクロ PDF化の際のエラーについて

    エクセルブックを一括で名前をつけてpdfに変換するようなマクロを作ろうとして作ってみました。 基本は、マクロで印刷を一気に行う要領でpdfをアクティブプリンタに設定したのですが、見かけ上pdfファイルが作成されるものの、開くと破損していますとなってしまい、きちんとpdf化が出来ていないようです。 システムフォントを利用~のエラーは回避できたのですが、無理やりファイル名を指定しているせいでこのようになっているのでしょうか。 お手数ですがアドバイスをお願いします。 マクロの記録ではアクティブプリンタを指定して、プリントアウトというものしか記録されないので、プリントアウトのところが何か間違っているとは思うのですが・・・ 以下コードです。 Sub PrtPDF() Dim MyFile As String, MyPath As String Dim wb As Object Dim fn As String If vbNo = MsgBox("フォルダ内のブックの一括印刷を行いますか?", vbYesNo) Then GoTo CloseFile Dim bookname1 As String bookname1 = "Conv.xls" MyPath = ThisWorkbook.Path & "\" '自分のパスを取得 MyFile = Dir(MyPath & "*.xls", vbNormal) 'パス内のxlsファイル If LCase(MyFile) = LCase(bookname1) Then MyFile = Dir 'MyFileとbookname1が同じファイルの場合スキップする Do Until MyFile = "" '対象ファイルがなくなるまで Set wb = Workbooks.Open(MyPath & "\" & MyFile) '選択したファイルを開く fn = MyPath & "PDF\" & Range("J4").Value & ".pdf" 'アクティブシートを印刷する。 Application.ActivePrinter = "Adobe PDF on Ne07:" ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, PrtoFileName:=fn 'アクティブブックを閉じる。 ActiveWorkbook.Close MyFile = Dir '次のファイルを検索 If LCase(MyFile) = LCase(bookname1) Then MyFile = Dir 'MyFileとbookname1が同じファイルの場合スキップする Set wb = Nothing Loop '繰り返し GoTo ProcessEnd CloseFile: ActiveWorkbook.Close MsgBox "処理を中止しました。" Exit Sub ProcessEnd: MsgBox "処理が終了しました" End Sub

  • 簡単マクロ編集

    Sheets("Sheet1").Select  ←Range("A3:H8") Selection.Copy Sheets("Sheet2").Select Range("A3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet4").Select Application.CutCopyMode = False ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True 下方にこの操作を繰り返ししたいのですが Dim i As Long Worksheets("Sheet1").Select For i = 3 To 100 Step 6 If Cells(i, "A") = "" Then Exit Sub End If Cells(i, "A").Resize(6, 8).Copy Destination:=Worksheets("Sheet2").Range("A3:H8") Next i 貼付けは値で貼り付けたいと思います。 どう組み合わせればよいですか?

  • マクロについて

    Sub FormShow() Qry.Show Private Sub CommandButton1_Click() Sheets("A").Select Sheets("B").Select Replace:=False Sheets("C").Select Replace:=False ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Sheets("Help").Select Sheets("A").Select End Sub のマクロが登録された「ボタン(フォームコントロール)」により実行した後に、 Bシート内のA1セルの中に"・"を検索し、 もし"・"があった場合は"WWW()"のマクロを実行、 "・"がなかった場合は"XXX()"のマクロを実行する。 これが中々上手くいかず困っております。 ご教授いただければ幸いです。

  • ExcelVBAでPrimoPDを制御したい

    いつも楽しく勉強させていただいております。 環境はwin7でExcel2003です。 Excelのブックをマクロを使ってPDF化したいのですが、問題はOfficeのバージョンが2003なのでPDF形式でで保存という機能がありません。 そこでPrimoPDFというフリーソフトをインストールして、マクロの自動保存で下記のプログラムを作りました。 Sub Macro1() Application.ActivePrinter = "PrimoPDF on Ne08:" ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:= _ "PrimoPDF on Ne08:", Collate:=True End Sub 問題はこれを実行するとPrimoPDFのダイアログボックスが出てきてしまうことです。 PDF化したいファイルは1000以上あるのでいちいち手動でボタンをクリックすることはできません。 できれば保存する場所やポストプロセス(PDFを開くなど)を「なし」にするなどの設定もマクロで行いたいのですが、相手がPrimoPDFでは無理でしょうか。どうしてもPrimoPDFを使いたいわけではありません。もしそれ以外でお勧めの方法があればそれでもいいのですが。 ただ、Excelはどうしても2003でやりたいのです。2007だと「PDFで保存」の機能を使用できるのですが、どういうわけか2007だとレーダーチャートの形が崩れてしまうので

専門家に質問してみよう