• ベストアンサー

フォルダに入っているエクセルを一括でpdfに変換

フォルダ内に入っているエクセルファイル(xlsx)を一括でpdfgファイルに変換したいのですが。 更に出来れば xlsmも一気に出来れば最高です。 更に、その他のファイル(word等)が混在していても使えれば良いのですが、別の専用の仮フォルダで処理した後に元のフォルダに戻す、でもOKです。

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.10

乗りかかった船なので、 >恐らくC列が空白の時には無視する を組み込んでみました。 Option Explicit Dim ShCltl As Worksheet Dim SeqNum As Long Sub Sample()  Const SRow = 2 'ブック一覧の開始行番号  Dim RowNum As Long    Set ShCltl = ThisWorkbook.Sheets(1)  RowNum = SRow  SeqNum = 0   'ファイル名用連番を初期化  With ThisWorkbook.Sheets(1)  Do   If ShCltl.Cells(RowNum, 1).Value = "" Then Exit Do   ExportPDF3 RowNum   RowNum = RowNum + 1  Loop  End With End Sub '//---------- PDFに書き出すサブルーチン Sub ExportPDF3(RowNum As Long)  Dim tgBook As Workbook  Dim tgSheet As Worksheet  Dim PdfDir As String  Dim i As Long  Dim PutName As String  Set tgBook = Workbooks.Open(FileName:=ShCltl.Cells(RowNum, 1).Value)  Set tgSheet = tgBook.Sheets(ShCltl.Cells(RowNum, 2).Value)  PdfDir = GetPath(ShCltl.Cells(RowNum, 1).Value) & "\PDF変換"    '出力先フォルダーのチェック、なかったら作成する  If IsExistDirA(PdfDir) = False Then  MkDir PdfDir  End If    SeqNum = SeqNum + 1   'ファイル名用連番をカウントアップ    '出力ファイル名組み立て  If ShCltl.Cells(RowNum, 3).Value <> "" Then  PutName = _   PdfDir & "\" & tgBook.Name & "_" & tgSheet.Name & "_" & _   tgSheet.Range(ShCltl.Cells(RowNum, 3).Value).Text & _   Format(SeqNum, "000000")  Else  PutName = _   PdfDir & "\" & tgBook.Name & "_" & tgSheet.Name & "_" & _   Format(SeqNum, "000000")  End If  'PDF出力  tgSheet.ExportAsFixedFormat Type:=xlTypePDF, _   FileName:=PutName, _   Quality:=xlQualityStandard, _   IncludeDocProperties:=True, _   IgnorePrintAreas:=False, _   OpenAfterPublish:=False    'PDF出力元ファイルを閉じる  tgBook.Close SaveChanges:=False End Sub '//============== フォルダーの実在チェック Function IsExistDirA(a_sFolder As String) As Boolean  Dim result  result = Dir(a_sFolder, vbDirectory)  If result = "" Then  IsExistDirA = False  Else  IsExistDirA = True  End If End Function '//============== フルパスからフォルダーを取得 Function GetPath(FullPath As String)  Dim PathName As String, FileName As String, pos As Long  pos = InStrRev(FullPath, "\")  GetPath = Left(FullPath, pos) End Function

akira0723
質問者

お礼

夜遅くまでありがとうございます。 全くお礼と感謝の雨嵐! 朝一で試行してみたのですが、他の要因でシート&セル指定のマクロ自体が動かなくなってしまったのでこれから一からやり直しです。 フォルダ一内エクセルの一括変換コードは問題なく動くのですが。。。 昨夕、この二つのマクロを仕込んだエクセルBookのシートに使い方を作成してあります。 これから本格的にPDF化していきます。 マクロが動けば恐らくC列の空白問題も解決だと思いますが、万一でもAAA1で解決できておりますので一旦締め切らせていただきます。 今後とも宜しくお願い致します。

その他の回答 (9)

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.9

>開いたままのBookはいつも同じBookで >上書きするか、しないか、の選択画面で止まっている この状態のブックは、なにやら、単に開き、閉じるだけで、 >上書きするか、しないか、の選択画面 が表示される可能性を疑います。 ともあれ、  tgBook.Close を tgBook.Close SaveChanges:=False とするか、または、 Application.DisplayAlerts = False tgBook.Close SaveChanges:=False Application.DisplayAlerts = True とすれば回避できるんじゃないかと思います。

akira0723
質問者

お礼

またまた、何度もお手数をおかけする結果となりましたが、今回も期待値の100%の完成度で解決できました。 本当に毎回ありがとうございます。 今後とも宜しくお願い致します。

akira0723
質問者

補足

朝一で確認しました。ご推察通り両方のコード共 > tgBook.Close SaveChanges:=False で解決できました。 これでシート1枚のBookはフォルダ内一括、複数のシートのBookはシートにパスのコピペでPDF化できます。 (フォルダ毎にBookの種類がそのように区別できます) また、シート名まででファイルが区別できる場合はC列にAAA1を指定すれば問題なく動くことを確認しました子これで「完成!!」 恐らくC列が空白の時には無視する、はHohoPapaさんには簡単だと思いますが、AAA1で回避できることが分かりましたのでこれで100%希望通りで、これ以上は不要(オーバスペック)ですので締め切らせていただきます。

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.8

>但し、作業終後、変換したエクセルが開いたままになってしまうので >「保存せず」で閉じる必要が有ります。  tgBook.Close このコードが、 PDFファイルの作成元となったエクセルブックを閉じるコードです。 私なテストしてみる限り 開いたまま残ることはありません。 残らないようにコードを書いているツモリです。 開いたまま残るとおっしゃっているには、 ①PDFファイルの作成元となったエクセルブックですか? ②それとも、PDFファイルですか? ③それととも、このマクロをコピペしたマクロ付きエクセルブックですか? もし③なら、閉じるコードは組み込んでいませんので残ります。 残るという症状をできる限り詳しく説明してみてください。

akira0723
質問者

お礼

何度もすみません。 いくつか試してみましたが、PDFで保存後、開いたままのBookと閉じるBookが有るようで、同じ組み合わせで何度か試してみましたが、開いたままのBookはいつも同じBookで、現象を再現しました。

akira0723
質問者

補足

お手数をおかけしています。 動作後開いたまま残るのは①の元のエクセルファイルです。 一応今もファイルパスを2つだけにして、一度動かして「PDF変換」フォルダを作っておいて、そのフォルダを見えるようにして実行してみました。 やはり一度元のエクセルが開いてきて、PDFファイルがフォルダ中に現われて、その後2つ目のエクセルが開いてきてPDFファイルが作成されて、動作完了。 その後手動で、変更を「保存します」「保存しません」で「保存しません」を選択するとCloseします。 つまり、エクセルを閉じる際に X をクリックするところまでは実行されて、上書きするか、しないか、の選択画面で止まっているということだと思います。 ここまで書いて、考えたらエクセルを開いて、pdfファイルで保存した後 X をクリックすると何も聞いて来ないで閉じますね。(今確認しました) 再度違う3つのエクセルBookで試行したところ、今度は3つともうまく閉じました。 この作業の前にMicro Softから「更新プログラム」のインストール要求があり、(朝一のMsgは無視しましたが)、毎回煩わしいのでインストールを実行して「Officeの更新プログラムがインストールされました。アプリが使えるようになりました。」 とのMsgが有り、その後の3つのファイルではうまく閉じました。 これが原因とも思えないのですが・・・ 昨日の段階では、ご回答の2つマクロともエクセルのCloseは手動で実行しました。 これから後で、また少し試してみて明日にはお礼枠で追加報告します。

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.7

>C列に指定した当該シートのセルをシート名の後に組み込む 直してみました。 また、一部手直しもしました。 Option Explicit Dim ShCltl As Worksheet Dim SeqNum As Long Sub Sample()  Const SRow = 2 'ブック一覧の開始行番号  Dim RowNum As Long    Set ShCltl = ThisWorkbook.Sheets(1)  RowNum = SRow  SeqNum = 0     'ファイル名用連番を初期化  With ThisWorkbook.Sheets(1)   Do    If ShCltl.Cells(RowNum, 1).Value = "" Then Exit Do     ExportPDF3 RowNum    RowNum = RowNum + 1   Loop  End With End Sub '//---------- PDFに書き出すサブルーチン Sub ExportPDF3(RowNum As Long)  Dim tgBook As Workbook  Dim tgSheet As Worksheet  Dim PdfDir As String  Dim i As Long  Dim PutName As String  Set tgBook = Workbooks.Open(FileName:=ShCltl.Cells(RowNum, 1).Value)  Set tgSheet = tgBook.Sheets(ShCltl.Cells(RowNum, 2).Value)  PdfDir = GetPath(ShCltl.Cells(RowNum, 1).Value) & "\PDF変換"    '出力先フォルダーのチェック、なかったら作成する  If IsExistDirA(PdfDir) = False Then   MkDir PdfDir  End If    SeqNum = SeqNum + 1     'ファイル名用連番をカウントアップ     '出力ファイル名組み立て  PutName = _    PdfDir & "\" & tgBook.Name & "_" & tgSheet.Name & "_" & _    tgSheet.Range(ShCltl.Cells(RowNum, 3).Value).Text & _    Format(SeqNum, "000000")  'PDF出力  tgSheet.ExportAsFixedFormat Type:=xlTypePDF, _    FileName:=PutName, _    Quality:=xlQualityStandard, _    IncludeDocProperties:=True, _    IgnorePrintAreas:=False, _    OpenAfterPublish:=False    tgBook.Close End Sub '//============== フォルダーの実在チェック Function IsExistDirA(a_sFolder As String) As Boolean  Dim result  result = Dir(a_sFolder, vbDirectory)  If result = "" Then   IsExistDirA = False  Else   IsExistDirA = True  End If End Function '//============== フルパスからフォルダーを取得 Function GetPath(FullPath As String)  Dim PathName As String, FileName As String, pos As Long  pos = InStrRev(FullPath, "\")  GetPath = Left(FullPath, pos) End Function

akira0723
質問者

補足

早々の何度もの手直しありがとうございます。 また、いつものように「解説」付きなので下記の数字を変えれば使いやすい表を作成できます。  >Const SRow = 2 'ブック一覧の開始行番号 smanple1のコードではフォルダ内にxlsまであったのですが >・・・ Or (Right(tFi.Name, 4) = ".xls"))の追記で解決できました。 さて、シートに5つのファイルを入れて、試してみて動作は完璧でした。 但し、作業終後、変換したエクセルが開いたままになってしまうので「保存せず」で閉じる必要が有ります。 これは実際の作業でファイルが多くなるとチト面倒です。 贅沢な要望だと思いますが、ここまで来たら完成度を高めたい。(誰の?) そこで、誠に厚かましいのですが、処理後対象ファイルを「保存せず」で終了させる動作(コード)を追加願えないでしょうか? 忙しければこれで十分ですので出来ればで結構です(当たり前ですが。。。。) ======================== しかし「HohoPapaさん、スゴ~イ!」の一言です。 これほど長いコードが、1,2日で書けて、無知な相手エクセルで一発で動くことに驚きです。 ちなみに最初の、#No5のフォルダ内の一括変換のコードとこのコードは用途別に使わせていただきますので、出来ればーこちらもお願いします。

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.6

>A列にファイルパス、B列にそのBookのシート名を入れると >B列で指定したシートだけがPDFに変換される。 >PDFの保存先は元のフォルダ中に新らしく >「PDF変換」というフォルダを作成してそこに保存される。 を書いてみました。 出力するPDFのファイル名をどのようにするのか未詳なので 前回の仕様を踏襲しました。 簡単なテストしかしていませんので 使う場合は、十分にテストしてください。 Option Explicit Dim SeqNum As Long Sub Sample()   Const SRow = 2 'ブック名一覧の開始行番号   Dim i As Long   i = SRow      With ThisWorkbook.Sheets(1)     Do       If .Cells(i, 1).Value = "" Then Exit Do         ExportPDF2 .Cells(i, 1).Value, .Cells(i, 2).Value       i = i + 1     Loop   End With End Sub '//---------- PDFに書き出すサブルーチン Sub ExportPDF2(BookPath As String, ShName As String)   Dim tgBook As Workbook   Dim i As Long   Dim PutName As String   Set tgBook = Workbooks.Open(FileName:=BookPath)   SeqNum = SeqNum + 1      '出力先フォルダーのチェック、なかったら作成する   If IsExistDirA(GetPath(BookPath) & "\PDF変換") = False Then     MkDir GetPath(BookPath) & "\PDF変換"   End If      '出力ファイル名組み立て   PutName = GetPath(BookPath) & "\PDF変換\" & _       tgBook.Name & "_" & ShName & Format(SeqNum, "000000")        tgBook.Sheets(ShName).ExportAsFixedFormat Type:=xlTypePDF, FileName:= _       PutName, Quality:= _       xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _       OpenAfterPublish:=False   tgBook.Close End Sub '//============== フォルダーの実在チェック Function IsExistDirA(a_sFolder As String) As Boolean   Dim result   result = Dir(a_sFolder, vbDirectory)   If result = "" Then     IsExistDirA = False   Else     IsExistDirA = True   End If End Function '//============== フルパスからフォルダーを取得 Function GetPath(FullPath As String)   Dim PathName As String, FileName As String, pos As Long   pos = InStrRev(FullPath, "\")   GetPath = Left(FullPath, pos) End Function '//============== フルパスからファイル名を取得 Function GetName(FullPath As String)   Dim PathName As String, FileName As String, pos As Long   pos = InStrRev(FullPath, "\")   GetName = Mid(FullPath, pos + 1) End Function

akira0723
質問者

お礼

毎度の追加要求に対応していただき感謝の雨嵐!! 最初は自分が想定できる範囲の要求から始まるので、出来ることが分かると欲が出てきてダメ元で要求してしまうので本当に恐縮です。 これまで頂いたコードはみんな活躍しております。 いくつかは(恥ずかしながら小生が少しいじって)他部署でも活躍しています。 最近Callを覚えたのでHohoPapaさんのコードの汎用性が急増しています。 説明付きなので何となくわかる気がして、試行錯誤しやすいので。

akira0723
質問者

補足

何度もありがとうございます。 朝一で試してみました。 別のファイル、同じファイルのシート違い、同じファイルパス一覧の2度目の変換・・・等々、全て?のケースで期待通りに動きました!(!の数は付けきれないので1つ) ただ~~、実際に試行してみて、これが最後のお願いです。(毎度ですみません) 実際に変換してみると、同じ内容のファイルの目的のシート(複数もあり)の変換になる事が多いのでシート名まででは、ファイル名の最後の連番がランダムになっていて中身を空けないと内容が分からない状態になる事に気付きました。 そこで、時間のある時で良いので、 C列に指定した当該シートのセルをシート名の後に組み込むように追加してもらえないでしょうか? それまではこのシートで作業を始めますので時間のある時で結構です。

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.5

あると便利そうなので、コードを書いてみました。 PDFファイルを次々と作成するわけですが そのファイル名をどのように決めればいいのか どのフォルダーに作成すればいいのかが未詳なので、 勝手に考えて書いてみました。 よかったら試し、期待と異なることがあれば、 指摘してみてください。 Option Explicit Const GetDir = "D:\TestDir\TryToPDF\ファイル集"  'エクセルブック対象フォルダー Const PutDir = "D:\TestDir\TryToPDF\PDF"     'PDF作成先フォルダー Dim SeqNum As Long '//---------- PDF化するメインマクロ Sub sample()  SeqNum = 0     'ファイル名用連番を初期化  GetFileName GetDir End Sub '//---全てのフォルダー内のエクセルブックを総当たり Sub GetFileName(strPath As String)  Dim tSfo As Object  Dim tGf As Object  Dim tFi As Object  Dim tSub As Object  Set tSfo = CreateObject("Scripting.FileSystemObject")  Set tGf = tSfo.GetFolder(strPath)  For Each tFi In tGf.Files   If ((Right(tFi.Name, 5) = ".xlsx") Or (Right(tFi.Name, 5) = ".xlsm")) Then    ExportPDF tFi.Path   End If  Next  For Each tSub In tGf.SubFolders   GetFileName tSub.Path  Next End Sub '//---------- PDFに書き出すサブルーチン Sub ExportPDF(BookPath As String)  Dim tgBook As Workbook  Dim i As Long  Dim PutName As String    Set tgBook = Workbooks.Open(Filename:=BookPath)  For i = 1 To tgBook.Sheets.Count   SeqNum = SeqNum + 1   PutName = PutDir & "\" & _    tgBook.Name & "_" & tgBook.Sheets(i).Name & Format(SeqNum, "000000")      'MsgBox PutName      tgBook.Sheets(i).ExportAsFixedFormat Type:=xlTypePDF, Filename:= _     PutName, Quality:= _     xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _     OpenAfterPublish:=False  Next i  tgBook.Close End Sub

akira0723
質問者

お礼

<間に合えば>気付いたこと 作業終了後に対象エクセルを1つずつ「閉じる」作業が発生します。 出来れば自動で閉じるようにお願いします。 このままでも「保存せずに閉じる」にOKをクリックするだけですので特に問題はありませんが、間に合えば、出来ることなら・・・

akira0723
質問者

補足

HohoPapa-さん いつもいつも見事なご回答感謝感激です。 また、いつもの質問の抜けを忖度した回答内容にも感服致します。 正直このコードは売れます! 実際に今回の他のご回答でも市販のソフトが紹介されていますね。 昨夜試してみて1発で期待通りの動きで今回の課題に対しては100%解決できました。 ウッカリケースとして、一度変換したエクセルファイルを同じ条件(フォルダ指定のまま)再処理した場合、等々試してみましがエラーになることなく完璧に仕事してくれました。 こうなると毎度の癖(後知恵)で質問時に想定していなかった汎用性が欲しくなりました。 A列にファイルパス、B列にそのBookのシート名を入れるとB列で指定したシートだけがPDFに変換される。 PDFの保存先は元のフォルダ中に新らしく「PDF変換」というフォルダを作成してそこに保存される。 というようなことは出来ないでしょうか? 今回ご回答いただいて、過去の色々なエクセルも順次PFDにしていくことを考えました。 昔はエクセルをPDFで保存する知恵が無く、全てエクセルで保存されていますが、最近はPDFでの保存の要求が出てきており、今回はその対策の1つです。 全く違うプロシージャーになると思いますのであまりにお手数なら今回のご回答で本当に充分です。

回答No.4

フォルダ内に入っているエクセルファイルを一括でPDFファイルに変換できるソフトを使えば可能です。 acrobatはできますが有料です。自分が使っているソフトPDFelementを例とします。 ソフトを開いて、「一括PDF」をクリックして、左側のメニューから「変換」を選択して、「フォルダ」を自分で指定できます。 「ドラッグ・アンド・ドロップ」でもできます。 出力形式を「Excel」に選択して、出力場所をパソコンで保存したい位置に指定すれば、「開始」をクリックして一括で変換できます。 参考:複数のPDFを一括でエクセルに変換する方法。大量作業がたった数秒で完了できる! https://pdf.wondershare.jp/pdf-convert/pdf-to-excel-batch.html 無料試用できるので試してみてください。 https://pdf.wondershare.jp/ 他にもhipdf、ilovepdf、cubepdfやsmallpdfなどのオンラインツールも無料で利用できます。

akira0723
質問者

お礼

ご回答ありがとうございました。 早々にいじってみたら色々な機能があり有用なソフトだと思います。 但し、エクセル以外は変換後のファイルには透かしが入るようです。 また一度に変換出来るファイルは3つまでと無料故の制限もあるようです。 機能が充実していて無料なので文句は言えませんが。 自分用には活用できるソフトだと思いますので今後使わせていただきます。

akira0723
質問者

補足

早々にダウンロードしながら説明を読んでいたのですが、PDFの編集ソフトのようです。 また、ご回答にも >出力形式を「Excel」に選択して・・・ とありますのでこれはPDFをエクセルに一括変換ではないでしょうか? それはそれであれば便利なので、とりあえずINST.して試させていただき、結果報告致します。

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

>一括でpdfに変換 見かけは一括と言っても、処理の中身は、個別ファイルごとに処理は、根底では崩せないでしょう。 >フォルダ内に入っているエクセルファイル(xlsx)を一括 これをVBA、FSOで捉えることは、少し調べれば、記事が出てくる、簡単に出来ることです。 一例 Dir使用 https://hall.ssz.or.jp/school_blog/all/excel-vba-getfilelist/ しかしエクセルファイル(今ではXMLか?)形式のファイルデータを、PDFに変換するのは、プロの領域で、市販のソフトや、セミプロの作ったフリーソフトを探しましょう。 ーー 本来PDFのファイル形式の詳細説明や加工やエクセルファイルの詳細説明は、むつかしいはずだが、今どきはライブラリ化されて、ファイル保存時の、拡張子を適切に指定で、左右できる時代です。 ーー Pythonを勉強すると https://myafu-python.com/work/excel-to-pdf/ のような記事も見つかる。 ーー VBAでは https://tonari-it.com/excel-vba-pdf/ のような記事がある。 実際に活用してないので、自信はないが、質問者がやって見るのはどうか? コード行数も少なく、理解して使い、結果がOKなら、自分で変換したという感覚が残り、結構な話でしょう。

akira0723
質問者

お礼

ご回答ありがとうございます。 一番上のご回答はフォルダの一覧のようです。 2番目のPythonはDOS?のようですが当方には難しく。 3万円のVBAは一括変換ではなさそうなので・・

  • hiro_1116
  • ベストアンサー率30% (2563/8280)
回答No.2

私は使ったことがありませんが、下記のようなソフトもあるようですね。 https://www.vector.co.jp/soft/winnt/business/se518117.html

akira0723
質問者

お礼

ご回答ありがとうございます。 お勧めのソフトを試そうとしてダウンロードしてインストールしようとしたらwindowsから「危険!」とのアラームが出ました。 今までいろんなソフトを一杯ダウンロードしてきて今まで見たことの無い警告だったのでインスト―ルを断念しましたので悪しからず。

  • hiro_1116
  • ベストアンサー率30% (2563/8280)
回答No.1

PDFに変換するのにAdobe Acrobat(Readerではない)をお使いでしたら、複数ファイルを選択して右クリックすればPDFを作成するメニューが出ると思います。

akira0723
質問者

補足

残念ながら無料の閲覧ソフトしか持っていません。

関連するQ&A