OptionExplicit
'**********************************************************************************
' ■概要
' 実行ファイルと同じ階層以下の
' Excel、Word ファイルを PDF に変換して指定したフォルダに出力します。
'
' ※ Office 2007 以上、プリンタが使用できる環境でのみ動作します。
'**********************************************************************************
'==============================================================
' 変数の宣言、初期化
'==============================================================
'フォルダ操作用
DimFso
DimobjApl
DimobjFolder
DimobjFolderTo
DimobjFolderItems
DimstrCurrentPath
Dimobj
DimcrtFolderPath
DimtmpFilePath
'Excel用
DimExcelApp
DimWordApp
DimPowerPointApp
DimDoc
DimBook
DimSheet
DimPresentations
'コピーするかどうか(0:しない/1:する)
DimcopyFlg
copyFlg=0
'コピー先
DimcopyTo
copyTo="C:\work\temp\"
'アクティブシートのみとするかどうかのフラグ(0:オフ/1:オン)
Dim ActiveSheetFlg
ActiveSheetFlg = 1
'ページ指定
'From が 0 であれば指定しない
Dim PageFrom
Dim PageTo
PageFrom = 0
PageTo = 0
'変換元ファイルを削除するかどうか
Dim DeleteFlg
DeleteFlg = 0
'==============================================================
' 処理開始
'==============================================================
'1.ファイルオブジェクトを作成
Set Fso = CreateObject( "Scripting.FileSystemObject" )
'2.実行ファイルが格納されているパスを取得
strCurrentPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strCurrentPath )
Set obj = obj.ParentFolder
strCurrentPath = obj.Path
'3.Excel, Word アプリケーションオブジェクトを作成します。
Set ExcelApp = CreateObject("Excel.Application")
Set WordApp = CreateObject("Word.Application")
Set PowerPointApp = CreateObject("PowerPoint.Application")
'4.シェルアプリケーションオブジェクトを作成します
Set objApl = WScript.CreateObject("Shell.Application")
'5.実行ファイルと同じ階層のフォルダオブジェクトを作成します
Set objFolder = objApl.NameSpace(strCurrentPath)
'6.実行ファイルの親フォルダがコピー先になければ作成する
If copyFlg = 1 Then
crtFolderPath = copyTo & Fso.GetBaseName(strCurrentPath)
If Fso.FolderExists(crtFolderPath) = false Then
Fso.CreateFolder(crtFolderPath)
End If
End If
'7.フォルダオブジェクトから格納されているファイル、フォルダを取得します。
Set objFolderItems = objFolder.Items()
'8.ファイル、フォルダ単位の処理
Call prcFolder (objFolder)
'9.終了処理
ExcelApp.Quit()
WordApp.Quit()
PowerPointApp.Quit()
Set ExcelApp = Nothing
Set WordApp = Nothing
Set PowerPointApp = Nothing
Set objFolderItems = Nothing
Set objFolder = Nothing
Set objApl = Nothing
If copyFlg = 1 Then
Wscript.Echo crtFolderPath & "に変換したPDFを出力しました。"
Else
Wscript.Echo "PDFの変換が完了しました。"
End If
'------------------------------------------------------------------------------------------
' ■サブプログラム
' フォルダ内に含まれるファイルやフォルダを検索し、
' Excel、Word ファイルを PDF ファイルに変換する。
'------------------------------------------------------------------------------------------
Sub prcFolder(objFolder)
Dim tmpFolderPath
Dim tmpFolderItems
Dim crtFolderPathB
Dim objFolderItemsB
Dim objItem
Dim i
Dim flg
Set tmpFolderItems = objFolder.Items()
' フォルダ内アイテムの走査
For i=0 To tmpFolderItems.Count-1
'ファイルおよびフォルダオブジェクトを取得
Set objItem = tmpFolderItems.Item(i)
'Wscript.Echo "パス:" & objItem.Name
'ファイル、フォルダの判定
If objItem.IsFolder Then
'パスを退避
tmpFolderPath = crtFolderPath
'処理中のディレクトリをパスに含める
crtFolderPath = crtFolderPath & "\"&objItem.Name
' 親ディレクトリがなければ作成
If Fso.FolderExists(crtFolderPath)=falseThen
Fso.CreateFolder(crtFolderPath)
EndIf
'フォルダであれば再起処理を実施
SetobjFolderItemsB=objItem.GetFolder
CallprcFolder(objFolderItemsB)
'パスを戻る
crtFolderPath=tmpFolderPath
Else
flg=0
' 親ディレクトリがなければ作成
If copyFlg=1Then
If Fso.FolderExists(crtFolderPath)=falseThen
Fso.CreateFolder(crtFolderPath)
EndIf
EndIf
SelectCase LCase(fso.GetExtensionName(objItem.Name))
' Excelの場合
Case"xls","xlsx"
' 出力パス
tmpFilePath=Fso.GetParentFolderName(objItem.Path)&"\" & Fso.GetBaseName(objItem.Name) & ".pdf"
Set Book = ExcelApp.Workbooks.Open( objItem.Path )
If Err.Number <> 0 Then
' 終了( 開放 )
ExcelApp.Quit()
Wscript.Echo Err.Description & vbCrLf & strCurrentPath
' スクリプト終了
Wscript.Quit()
End If
on error goto 0
if ActiveSheetFlg = 1 Then
' アクティブシート指定
Set Sheet = Book.ActiveSheet
If Err.Number <> 0 Then
' 終了( 開放 )
ExcelApp.Quit()
Wscript.Echo Err.Description & vbCrLf & strCurrentPath
' スクリプト終了
Wscript.Quit()
End If
on error goto 0
Call Sheet.ExportAsFixedFormat(0, tmpFilePath)
Else
if PageFrom = 0 Then
' ブック全体
Call Book.ExportAsFixedFormat(0, tmpFilePath, 0)
Else
' ページ指定
Call Book.ExportAsFixedFormat(0, tmpFilePath, 0, False, False, PageFrom, PageTo, False)
End if
End if
' 終了( 開放 )
ExcelApp.DisplayAlerts = False
Book.Close
ExcelApp.DisplayAlerts = True
flg = 1
' Wordの場合
Case "doc", "docx"
' 出力パス
tmpFilePath = Fso.GetParentFolderName(objItem.Path) & "\"&Fso.GetBaseName(objItem.Name)&".pdf"
SetDoc=WordApp.Documents.Open(objItem.Path,true)
If Err.Number<>0Then
' 終了( 開放 )
WordApp.Quit()
Wscript.Echo Err.Description&vbCrLf&strCurrentPath
' スクリプト終了
Wscript.Quit()
EndIf
on errorgoto0
CallWordApp.ActiveDocument.ExportAsFixedFormat(tmpFilePath,17,False)
' 終了( 開放 )
WordApp.DisplayAlerts=False
Doc.Close
WordApp.DisplayAlerts=True
flg=1
' PowerPointの場合
Case"ppt","pptx"
' 出力パス
tmpFilePath=Fso.GetParentFolderName(objItem.Path)&"\" & Fso.GetBaseName(objItem.Name) & ".pdf"
Set Presentations = PowerPointApp.Presentations.Open( objItem.Path, True, False, False)
If Err.Number <> 0 Then
' 終了( 開放 )
WordApp.Quit()
Wscript.Echo Err.Description & vbCrLf & strCurrentPath
' スクリプト終了
Wscript.Quit()
End If
on error goto 0
Call Presentations.SaveAs( tmpFilePath, 32, False)
' 終了( 開放 )
PowerPointApp.DisplayAlerts = False
Presentations.Close
PowerPointApp.DisplayAlerts = True
flg = 1
End Select
' 変換したファイルを移動
If copyFlg = 1 And flg = 1 Then
' PDFのみコピー
Fso.CopyFile tmpFilePath, crtFolderPath & "\",true
' コピー後に削除
Fso.DeleteFile tmpFilePath
if DeleteFlg=1Then
' 元ファイルを削除
Fso.DeleteFile objItem.Path
EndIf
EndIf
EndIf
Next
' 終了( 開放 )
SetobjItem=Nothing
SetobjFolderItemsB=Nothing
EndSub
ディスカッション
コメント一覧
web上を探し回ってここにたどり着き、なんとかじぶんのやりたいことを解決できました。
助かりました、スクリプトの公開をありがとうございました。
ただ一つ、ExcelのシートがすべてPDFに変換してしまうのですが、アクティブシートのみPDF変換するようにはできないものでしょうか。
お忙しい中超初心者のお相手は無理かもしれませんが、お暇な時で結構ですのでご教授いただければ幸いです。
フジイヒロシ様
いつも記事を見ていただきありがとうございます。
ご質問の件、アクティブシートとはどういった状態のことでしょうか。
例えば、
1.対象のExcelを開いていて、且つ表示しているシート
2.何かしらのデータが存在するシート
基本的には、開いているファイルを変換する想定をしていませんでしたが、ご要望であれば少し方法を調べてみます。
doradoraさま
早速のご回答ありがとうございます。お忙しいのに手を煩わせてしまったようで申し訳ございません。
doradoraさまのおっしゃる1.のケースです。
例えばシートが1.2.3とあって、すべてのシートにデータが入っているとします。
1.を編集後、上書き保存してpdfにエキスポートします。そうするとシート1のみPDFにエキスポートして2.3のシートについてはPDFにエキスポートしません。この1の状態をアクティブシートというと認識していますが、勘違いでしょうか?
1のみPDFとしたかったわけです。なにせ、ど素人ですので、お手を煩わせて申し訳ありません。
フジイヒロシ様
ご要望の件について、
1. ブック全体
2. アクティブシートのみ
3. ページ指定
で切り替えられるようにコードを修正しました。
フジイ様が実現したいことであれば、「ActiveSheetFlg」を 1 にしていただければ出来るかと思います。
よろしくお願いします。
doradora様
あまりの素早いご回答にびっくりしました。なおかつ先を見越したようなページ指定(これexcelで初心者が陥る、とんでもないところに入力があって白紙のページが何枚もできてしまうのを防げそうです。)もさらにびっくりです。
お恥ずかしいような話ですが初心者の作ったexcelをpdfにする変換作業が画期的に楽になりそうです。
感謝感謝です。本当にありがとうございました。
フジイヒロシ様
お役に立てたみたいでよかったです。
また何かあれば、ご遠慮なくご連絡いただければ。
今後ともよろしくお願いします。
お言葉に甘えてもいいでしょうか。
変換した元のファイル(xlsx等)が残ってしまいますのでそれをpdf に変換後削除することは可能でしょうか?
毎日一回タイムスケジューラで実行したいのです。毎日新規でxlsxファイルがクラウド上に送られてきます。
お手を煩わせて申し訳ございません。お暇ときで結構です。よろしくお願いいたします。
フジイヒロシ様
ご要望の件、削除するかどうかのフラグを持たせて、
PDF出力後に削除できるように修正しました。
一応、元のファイルがなくなってしまいますので、
バックアップなどをお忘れなく、あくまで自己責任でよろしくお願いします。。
doradora様
お手数をおかけしました。助かりました。重ね重ねありがとうございます。
今後はdoradora様のお手を煩わせることなく、doradora様のサイトを参考に自分自身で勉強します。
申し訳ありませんでした。
もうお願いせずに頑張ります、doradora様のスクリプトが某日本一の巨大山岳会(もちろん非営利で会員数750人)の登山山行計画書、報告書届け出システムで作動していることをご報告申し上げ、感謝の言葉に代えさせていただきます。
本当にありがとうございました。
フジイヒロシ様
無事に利用できたようでよかったです。
私としても、誰かの役に立てばと思いブログをしていますので、
こういったものができないか、等の意見は大歓迎ですし、いつでもご連絡ください。
今後ともよろしくお願いします。
こんにちは!
とても有用なVBSだったので、さっそく使わせていただこうと思ったのですが、エラーが出てしまい動きませんでした。
エラーは以下のような感じです。
行:77
文字:9
エラー:パスが見つかりません
コード:800A004C
ソース:Microsoft VBScipt 実行時エラー
Excel2016なのですが、2016は対応していないでしょうか?
りょう様
いつもブログを観ていただきありがとうございます。
ご質問の件、基本的には 2016 でも動作するはずです。
おそらくですが、34行目の出力先のパスが存在しないのが原因だと思います。(c:\work\temp\)
該当の箇所にフォルダを作成していただくか、パスを書き換えて実行してみてください。
今後もよろしくお願いします。
ご回答ありがとうございます。
パスが間違ってました!
無事使えるようになりました。
これは実行ファイル(vbsファイル)と同じ階層にフォルダを作成し、その中に変換したファイルを入れることはできますか?
りょう様
ご希望の件についてですが、
再起処理をして実行ファイルと同じ階層以下のフォルダを処理しているので、
実行ファイルと同じ階層に出力するのはちょっと手間がかかります。
処理が終わってから、出力したフォルダをまるっと実行ファイルと同じ階層にもってくるのが簡単じゃないかと思います。
86行目、8.ファイル、フォルダ単位の処理 の後に、次のような処理を加えるのはどうでしょうか。
‘フォルダを移動(MoveFolderがうまく動かないケースがあるのでコピー→削除)
Fso.CopyFolder crtFolderPath , strCurrentPath & “\”
Fso.DeleteFolder crtFolderPath
ありがとうございます!!
もひとつお願いなのですが、
copyTo = “C:\work\temp\”
でフォルダ指定すると思うのですが、
このフォルダが存在しない場合に、自動で作成することはできますか?
りょう様
74行目、6.実行ファイルの親フォルダがコピー先になければ作成する
の部分で、先に以下の処理をすれば可能です。
crtFolderPath = copyTo
If Fso.FolderExists(crtFolderPath) = false Then
Fso.CreateFolder(crtFolderPath)
End If
今後ともよろしくお願いします。
ありがとうございます!
とても有用なブログに出会えて幸せです!笑
今後ともよろしくお願いいたします。
りょう様
お役に立てたなら何よりです。
何かありましたらご遠慮なくご連絡ください。
今後ともよろしくお願いします。
たびたびすみません。
以前ご回答いただいた
[74行目、6.実行ファイルの親フォルダがコピー先になければ作成する
の部分で、先に以下の処理をすれば可能です。
crtFolderPath = copyTo
If Fso.FolderExists(crtFolderPath) = false Then
Fso.CreateFolder(crtFolderPath)
End If]
をやってみたのですが、
パスが見つかりません
とエラーになってしまいます。
何が考えられますかね?
りょう様
ご質問の件、
「copyTo」がドライブ直下でなく階層ディレクトリになっているためエラーになるのかと思います。
(Fso.CreateFolderでは階層ディレクトリを作成できない)
doraxdora.gm.biz@gmail.com までご連絡いただければ、階層ディレクトリに対応したソースをお送りします。
よろしくお願いします。
ご回答ありがとうございます。
階層ディレクトリを作成できなかったのですね。
メールさせていただきました。
よろしくお願いいたします。
こんにちは。大学教員をしていて、学生のWordファイルのレポートやレジュメを閲覧したり印刷したりするのにPDFのほうが便利なため、日常的に複数のWordファイルをPDFにする作業が発生します。自分でも似たようなVBAマクロをつくって運用していましたが、こちらのスクリプトの方がよくできているので利用させていただきます。便利なツールを公開してくださいましてありがとうございます。
元ファイル削除のフラグは、デフォルトでオフにしておいていただくほうが安全かと思います。
unomi 様
いつもブログを観ていただきありがとうございます。
ご指摘の件、記事を修正しました。
確かにその方が安全ですよね。。
今後ともよろしくお願いします。
doradora様
こんにちは、当方全くの初心者です。
自分がやりたいことができる理想的なVBSなので使用させて頂きたいと思っています。タスクスケジューラにも組み込みたいのですが、リンクを張って作ったファイルなのでPDF変換後Excelから保存するか、しないかのダイアログが出てしまいます。Excelマクロを使ってダイアログが出ないようにもしてみたのですが、「.xlsm」ではPDFの変換ができませんでした。何か回避する方法はないでしょうか?不躾で恐縮ですが、よろしくお願いいたします。
ひしもち様
いつもブログを観ていただきありがとうございます。
ご質問の件ですが、「リンクを張って作ったファイル」とは何を差しているのでしょうか。
1.PDFに変換する対象のファイル
2.VBSファイル
3.その他
基本的な仕組みとしては、
「バッチ(VBSファイル)の実体があるフォルダ配下のドキュメントをPDFに変換する」となっていて、特に変わったことをしなければタスクからも実行は可能なはずです。
よろしければもう少し具体的にやりたい事をお教えいただければ
何かお役に立てるかもしれません。
よろしくお願いします。
早速のご回答ありがとうございます。言葉足らずですみません。
accessから出力した簡単な数値だけのExcelファイルをもとに、「条件付き書式」などを使ってガントチャートっぽく作ったExcelのファイルをPDF変換しています。accessからのExcelとガントチャートExcelは別ファイル、別フォルダでリンク(ハイパーリンク?)されています。ガントチャートExcelを開いて閉じるとリンク先の値が変わっているので保存するか、しないかのダイアログが出てしまいます。VBSファイルを実行したときも同じダイアログがでるので保存するか、しないを選択してクリックする必要があります。この操作があるのでタスクスケジューラで完全自動化が難しいのではないかと思っています(まだタスクスケジューラは試していません)。何か説明も下手でご迷惑をおかけしてすみません。ご理解いただけるでしょうか。
ひしもち様
ご質問の件、実現したいことについて承知しました。
少しお時間をいただきたいのと、差し支えなければサンプルを頂けないでしょうか。(データ、チャートの2ファイル)
doraxdora.gm.biz@gmail.com
調べてみますので少々お待ちください。
よろしくお願いします。
ありがとうございます!!早速サンプルを送りいたします。Excelのファイルは会社の業務で使用しており明日が休日になるので明後日に送付いたします。何卒よろしくお願いいたします。
コメント失礼します。実行後に「(指定フォルダ)に変換したPDFを出力しました」と出るのですが、その指定フォルダ内にPDFがありません。
原因わかりますでしょうか?お手数をおかけします、お時間あればご回答頂けますと幸いです。
とりさま
いつもブログを見てくださってありがとうございます。
ご質問の件ですが、
指定フォルダはどこにしていますか?
また、officeのバージョンなども教えていただけると調査しやすいです。
よろしくお願いします。
ありがとうございます。指定フォルダはCの中にフォルダを作成して、その中に生成されるようにしています。
あと、バージョンoffice365でした・・・これが原因でしょうか。
とり様
office365が原因かもしれませんね。
ただ、申し訳ないのですが、現時点で環境が用意できなくて調べることができません。
少しお時間をいただければ office365で調べてみます。
他に考えられるのはフォルダの書き込み権限、指定したパスに誤りがある等かなと思います。
(ただこの場合はエラーになりそうですが)
お力になれず申し訳ありません。
素晴らしいスクリプトをありがとうございます!
当方素人なもので、スクリプトをUTF-8で保存してエラーが出たり、拡張子が .xlsmのエクセルファイルが変換されないなど、多少まごつきましたが、全て解決して快適に使用させていただいております。
ところで、エクセルのシートの内容によっては表が分割されてPDFに変換されてしまうのですが、縮小してページフィットさせることは可能でしょうか?
お時間の許すタイミングで構いませんのでご回答いただければ幸いです。
よろしくお願いいたします。
ななし様
いつもブログを観ていただきありがとうございます。
ご質問の件ですが、次の方法で実現できるかと思います。
方法)
「ExportAsFixedFormat」でPDF出力する前に、シートの PageSetupプロパティを変更する。
例1:シートに対して処理
例2:ブックに対して処理
お試しいただければ。
今後もよろしくお願い致します。
お忙しいところ素早いご回答をいただきありがとうございます!
おかげさまで希望通りの処理となりました。
本当にありがとうございます。
引き続き使わせていただきます!
ななし様
無事にご希望の動作が出来たとのことで、良かったです。
引き続きドラブロをよろしくお願い致します。
こんにちは!
VBS初心者です。さっそく使わせていただいたところエラーが生じました。
エラーは以下のような感じです。
原因を教えていただければ幸いです。
行:77
文字:3
エラー:書き込みできません。
コード:800A0046
ソース:Microsoft VBScript 実行時エラー
びば様
いつもブログを観ていただきありがとうございます。
ご質問の件ですが、
34行目、「copyTo = “xxxx” 」の「xxxx」部分に記述されているフォルダは存在しますか?
存在するのであれば、書き込みをする権限が不足していると思われます。
スクリプトのファイルを右クリックし、「管理者として実行」を試してみてください。
よろしくお願いします。
さっそくの回答ありがとうございます!
xxxxの部分は変更していたのですが,そのフォルダに書き込み禁止が設定されていたようで,違うフォルダを設定したらできました!
素晴らしいスクリプトですね!職場で広めます!
そこで,もうひとつ要望なのですが,エクセルにあるすべてのシートをPDF化することはできますか?
びば様
37行目の「ActiveSheetFlg = 1」を「ActiveSheetFlg = 0」に変更すれば全体のPDF化が出来るはずですのでお試しください。
よろしくお願いします。
ありがとうございます!できました!!
ほんとにすばらしいスクリプトです!素人の私にも実行できました。
わがままついでにもうひとつ要望なのですが・・
パワーポイントのPDF化も追加できますか・・・?
びば様
記事中のソース「全体」をパワポ対応に更新しました。
ご確認ください。
ありがとうございます!
私なんかの要望にお応えいただきありがとうございます!
さっそく利用させていただきました。
ちなみに,パワポのPDFが所定のフォルダに移動しませんでした。
これは初心者ながら解読して解消できました^^
びば様
ご要望にお応え出来てよかったです。
今後もよろしくお願いします。
何度もすいません・・
職場に広めたところ便利!とよろこんでもらえたものの,「vbsを保存したフォルダにPDFが作成されないの?」
と贅沢な要望を受けてしまいました・・・
250~261行を実行しないようにしたら出来たものの,copytoで指定した場所に,空のフォルダが作成されるのは止められませんでした。
教えてください。
びば様
メールにてソースを送らせていただきました。
ご確認いただき、希望通りの結果になったようですので、この件はクローズとさせていただきます。
今後もよろしくお願いします。
とても有用なスクリプトを公開していただき、どうもありがとうございます。
ちょうどツールを探していたところで、とても助かりました。
ひばさんが書かれているパワポのPDFが所定のフォルダーに移動しない件は当方でも発生しました。
確認したところ、251行目の変換したファイルを移動するステップで、pptとpptxの拡張子判定が抜けていましたので、
追加したところ正常に移動されるようになりました。
ご報告まで。
くろ様
ご指摘ありがとうございます。
全体のソースを修正しました。
今後もよろしくお願いします。
こんにちは。
素人質問で大変恐縮なのですが、教えてください。
実行ファイルと同じ階層のみを対象にしたいのですが、どこを変えたらよいのでしょうか。
たね様
いつもブログを見ていただきありがとうございます。
ご質問の件、さくっと対応するのであれば
136行目を次のようにすれば同じ階層のみの処理に出来るかと思います。
If objItem.IsFolder Then
↓
If False Then
よろしくお願いします。
早速のご回答ありがとうございます。
本当にさくっと解決いたしました!
すごい!
ありがとうございました!
たね様
解決できたようで良かったです。
また何かございましたらご遠慮なく。
引き続きよろしくお願いします。
こんにちは。素人質問で大変恐縮ですが、教えてください。
拡張子.xlsxのファイルはdoradora様のスクリプトをコピーさせていただき、PDF化できました。
.xlsmが拡張子のExcelファイル及び、.txtが拡張子のメモなどのテキストファイルをPDF化するためには、どこをどのように変更すればよいのでしょうか。。お手数おかけする質問で大変申し訳ないのですが、宜しくお願い致します。
kenbow 様
いつもブログを見ていただきありがとうございます。
ご質問の件、.xlsm ファイルについてはバッチ内で “.xlsx” が書かれている箇所に同じように追記するだけで大丈夫かと思いますが、 txt ファイルについては対応していません。ご了承ください。
今後もよろしくお願いします。
初めまして。
非常に参考になるプログラムをありがとうございます。
質問があるのですが、作成したpdfを一つのpdfファイルにまとめることは可能でしょうか。
お手数ですが、ご確認いただけますと幸いです。
よろしくお願いいたします。
いつもブログを見ていただきありがとうございます。
ご質問の件、たぶん出来ると思います。
ちょっと調べてみるのでお時間をいただければ。。
よろしくお願いします。