• ベストアンサー

EXCEL VBAで→PDF化→自動メール送信

現在EXCELVBAでプリンターに出力された納品書を毎日50社ぐらいの顧客に手動FAXにて送っています。 通信費削減のために、ファイルをPDF化してEMAIL送信出来るようにしたいと思っています。 添付するファイルがEXCEL BOOKのままであれば以下のコードで出来るのですが、PDF化するやり方が分かりません。 ActiveWorkbook.SendMail Recipients:="email@*****.co.jp", _ Subject:="test" 10万円程度であれば、Adobe Acrobatなどのソフト購入してでも実現させたいと思っています。 又、ユーザーの操作はメーラーの「送信」ボタンをクリックする程度に留めたいです。 よきアドバイスよろしくお願いいたします。

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

  • ベストアンサー
回答No.3

Wordドキュメント → PDF への変換なら、以前VBのメーリングリストでコードを見たことがあり、それを元に作成した経験があります。(2003年の8月頃?) ExcelにもWorkbook.PrintOutメソッドはあり、PrintToFile が引数で指定できますので、同じようなことはできるはずです。(未確認) 参考までに、Word用のコードを単純化したものを抜粋します。 ※ 下記は、必要最小限の要素を単純化して示したものです。 このままでは汎用性もなく、使い物にはなりません。 ※ インデントは半角スペースに変換のこと。 '**************************************************************** '必要ライブラリ ' 'Microsoft Word 9.0 Object Library   C:\Program Files\Microsoft Office\Office\MSWORD9.OLB 'Acrobat Distiller           C:\Program Files\Adobe\Acrobat 5.0\Distillr\Acrodist.exe '**************************************************************** ' 'エラーコードの定義 Public Const pErrPrinterNotAvailable  As Long = 2212 'プリンタが無効です。 Sub MakePdfSample(ByRef strPrinter As String) 'WordドキュメントのPDF変換 'コードの一部分のみ抜粋。   Dim objWrdApp      As Object ' Word.Application   Dim objWrdDoc      As Object ' Word.Document   Dim objAbDist      As Object ' ACRODISTXLib.PdfDistiller   Dim strDefaultPrinter  As String      '「Acrobat ・・・」以外のプリンタは使用させない。   If Left$(strPrinter, Len("Acrobat Distiller")) <> "Acrobat Distiller" Then     Err.Raise pErrPrinterNotAvailable, _       , _       "このプリンタではPDFファイルは出力できません。" _       & vbCrLf & "Adobe の Acrobat Distiller を選択してください。"   End If      Set objWrdApp = CreateObject("Word.Application") 'New Word.Application   Set objAbDist = CreateObject("PdfDistiller.PdfDistiller.1") 'New ACRODISTXLib.PdfDistiller      '通常使用するプリンタの情報を退避。(処理の完了後、または実行時エラー発生時に元に戻す)   strDefaultPrinter = objWrdApp.ActivePrinter      'objWrdApp.ActivePrinter = "Acrobat Distiller on LPT1:"   objWrdApp.ActivePrinter = strPrinter      Set objWrdDoc = objWrdApp.Documents.Open("C:\Test.doc")      objWrdDoc.PrintOut _       Background:=False, _       PrintToFile:=True, _       OutputFileName:="C:\Test.ps"      objAbDist.FileToPDF _       "C:\Test.ps", _       "C:\Test.pdf", _       vbNullString      objWrdDoc.Close False   objWrdApp.ActivePrinter = strDefaultPrinter   objWrdApp.Quit   End Sub Option Explicit '**************************************************************** '必要ライブラリ ' 'Microsoft ActiveX Data Objects 2.5 Library '他のバージョンでの動作は未確認。(2.1での動作は×) 'Microsoft CDO For Exchange 2000 Library '**************************************************************** '引数 ' 'strPath    添付ファイルのフルパス 'strSmtp    SMTPサーバー  (例 : www.mail.hogehoge.com) 'strFromAddr  送信者アドレス (例 : hogehoge@hogehoge.com) 'strFromName  送信者名    (例 : ××株式会社 〇〇担当) 'strSubject   件名      (例 : 未承諾広告) 'strAddr    送信先アドレス (例 : scott@tiger.com) 'strToName   受信者名    (例 : △△株式会社 ◇◇様) 'strMailBody  メール本文 'strCcAddress  CCアドレス 'strBccAddress BCCアドレス '**************************************************************** '添付ファイル付きメールの自動送信。 Public Function SendMail( _             ByRef strPath As String, _             ByRef strSmtp As String, _             ByRef strFromAddr As String, _             ByRef strFromName As String, _             ByRef strSubject As String, _             ByRef strAddr As String, _             ByRef strToName As String, _             ByRef strCcAddress As String, _             ByRef strBccAddress As String, _             ByRef strMailBody As String _         ) As Boolean      Dim objMessage     As CDO.Message   Dim objConfiguration  As CDO.Configuration   Dim objFields      As ADODB.Fields      SendMail = False      ' Configurationオブジェクトを生成   Set objConfiguration = New CDO.Configuration      ' Filedsオブジェクトを生成   Set objFields = objConfiguration.Fields      ' フィールド情報を設定   With objFields     .Item(cdoSendUsingMethod) = cdoSendUsingPort     .Item(cdoSMTPServer) = strSmtp     ' フィールド情報を更新     .Update   End With      ' Messageオブジェクトを生成   Set objMessage = New CDO.Message      ' メッセージ情報を設定   With objMessage     Set .Configuration = objConfiguration     .Subject = strSubject     .To = """" & strToName & " 様"" <" & strAddr & ">"          If Len(strCcAddress) <> 0 Then .CC = strCcAddress     If Len(strBccAddress) <> 0 Then .BCC = strBccAddress          '複数アドレス指定の場合、変更の必要あり。     .From = """" & strFromName & """ <" & strFromAddr & ">"     .TextBody = strMailBody     .AddAttachment strPath     'メールを送信     .Send   End With      SendMail = True      Set objMessage = Nothing End Function

min128mini
質問者

お礼

ご回答ありがとうございます。 記載いただいたコードを基になんとか出来そうな感じです。来月の生活費がかかっている(笑)ので頑張ってみます。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

もうご存知でしょうが アドビ、低価格PDF作成ソフト「Acrobat 7.0 Elements」が最近発売されています。 http://pc.watch.impress.co.jp/docs/2005/0406/adobe.htm http://www.amazon.co.jp/exec/obidos/ASIN/B00097C4X0/249-9552911-3426739 ’----- 上記ソフトを導入すると、Word/Excelからのワンボタン変換ができるようです。 しかしこの操作(手作業)をエクセルVBAから自動的に行うのは難しいでしょう。それはマイクロソフト社がその気にならないとできないでしょうが、利害対抗関係・特許関係などから実現はむつかしい問題ではないでしょうか(この点自信なし)。 ツールバー(?)ボタンを押す操作を研究してVBAでプログラムで実現しても、ファイル名を与える場面などで行き詰まるとおもいます。 一般にすべてマイクロソフト社のソフトとその他社ソフトの連携という点で難しい問題です。 ’---- むしろアドビ社のAcrobatのカタログなどで、エクセルファイルをe-mail送信で便利な機能がないか検討(カスタマーインフォーメーションに聞くとか)してみてはどうでしょう。(手元に量販店で手に入れたAcrobatの宣伝パンフがありますが、それらしい機能は載ってないようですが。またPro版は5万7千円ですが。)

min128mini
質問者

お礼

そうですね。EXCELにあるAdobeのワンボタンがクリック出来たらいいなと思っていました。 もうAdobe関係の情報も少し調べてみます。

  • NNori
  • ベストアンサー率22% (377/1669)
回答No.1

全体はわからないけど、PDF化するだけならAdbeはいらない。安い「いきなりPDF」とか「瞬間PDF」、フリーの「クセロPDF」で十分できる。 「クセロPDF」はバナー広告がでちゃうのでちょっと向かないとは思うけど、試しにやってみるには十分でしょう。

min128mini
質問者

お礼

回答ありがとうございました。 この辺りの低価格のソフトで出来れば、助かります。 クロセPDFにはメール添付機能があるようですね。これで宛先やタイトルVisualBasicから指定が出来ば言うことはないのですが・・・