• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBAでPDF保存ができません)

エクセルVBAでPDF保存ができません

このQ&Aのポイント
  • エクセルのシートを連続してPDFで出力するVBAで困っています
  • 会社のサーバー内の共有フォルダーに保存して動かすと、最初の1件だけは正常にPDFに保存されますが、2件目でエラーになりPDFが保存されません
  • 保存ができるまでに10秒待機することで問題を回避できますが、別の方法で対応する方法はありませんか

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

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

ごめんなさい、 ファイルがない場合にFSO.DeleteFileがエラーになることを考慮していなかったです。 ぶっちゃけ、 Sub TEST20201019() '2020/10/19 同名ファイル対策済み このコードで安定しているならそれでもいいと思いますが、 なにしろ、ないやら問題ありな環境と思われることから もう少し丈夫なコード (エラーが出ても、何度かはリトライするコード) が望まれるだろうと思うのです。 そこで、 存在しないファイルを削除する場合のエラーはスルーし、 それ以外のエラーの場合には、指定回数再試行する。 指定回数を超えたらエラーメッセージを表示して 次のステップに進む。 というコードにしてみました。 よかったら試してみてください。 '//fsoで移動 再試行付き -------------------- Sub TEST07() '「Microsoft Scripting Runtime」を参照設定  Dim fdr As String, Fn As String  Dim n As Long  Dim myFileSystem As New Scripting.FileSystemObject  Dim MyTemp As String  MyTemp = myFileSystem.GetSpecialFolder(TemporaryFolder)  With Sheets("Test")   .Activate   fdr = ThisWorkbook.Path & "\" & Format(Date, "YYYYMMDD") & "-PDF" 'PDF保存先'   If Dir(fdr, vbDirectory) = "" Then     MkDir fdr '無ければ作成   End If     For n = 1 To 20    .Range("C5").Value = Sheets("Data").Cells(n, "A").Value    Fn = .Range("C5").Value & "_" & .Range("D5").Value  'ファイル名    Application.StatusBar = Fn & " PDFファイル作成中/" & n & "件目"    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=MyTemp & "\" & Fn & ".pdf"    TryMove fdr & "\" & Fn & ".pdf", MyTemp & "\" & Fn & ".pdf", fdr & "\"   Next n  End With  Application.StatusBar = "" End Sub Sub TryMove(f As String, t As String, fdr As String)  Dim ErrCnt As Long  Dim FSO As Object  Set FSO = CreateObject("Scripting.FileSystemObject")  Const Border = 5   '再試行回数  On Error GoTo ErrLabel  ErrCnt = 0    FSO.DeleteFile f    FSO.MoveFile t, fdr & "\"  Set FSO = Nothing  Exit Sub ErrLabel:  If Err.Number = 53 Then Resume Next  ErrCnt = ErrCnt + 1  If ErrCnt > Border Then   MsgBox "エラーが限界回数を超過" & f  End If  Resume End Sub 繰り返しますが、当方ではエラーが出ないので エラーが起きる場合の動作確認はしていません。

emaxemax
質問者

お礼

HohoPapaさん、ほんとに最後までお付き合いくださいましてもう感謝の気持ちでいっぱいです。 ご教示のコードで問題なく全件作成できました! 20件で58秒ですので時間もかかりません。 これで安心して上司に完成を報告できます。 ありがとうございました。

その他の回答 (14)

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.4

No.2です. 同じ結果になるかも知れませんが,Dirではなく FSOを使ってみてはどうでしょうか. ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Fdr & "\" & Fn & ".pdf" Set myFile = Nothing With CreateObject("Scripting.FileSystemObject") Do While myFile Is Nothing Application.Wait Now() + TimeValue("00:00:01")   '1秒PDF保存完了を待つ On Error Resume Next Set myFile = .GetFile(Fdr & "\" & Fn & ".pdf") On Error GoTo 0 Loop End With Set myFile = Nothing

emaxemax
質問者

お礼

なんどもありがとうございます。 やってみましたが結果は同じでした。

  • kkkkkm
  • ベストアンサー率66% (1725/2595)
回答No.3

> 別の方法で対応する方法 結果は同じ(エラーになる)かもしれませんが、いったんローカルに全て保存して、それをサーバーに移動するVBAにすればどうなんでしょう。

emaxemax
質問者

お礼

ありがとうございます。ただ今回はサーバー内でという条件付きなのです。

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.2

No.1 です. Application.Wait Now() + TimeValue("00:00:10")   '10秒PDF保存完了を待つ(1-8秒では保存エラー) この部分を以下のようにループ処理します. Do While Dir(Fdr & "\" & Fn & ".pdf") = "" Application.Wait Now() + TimeValue("00:00:01")   '1秒PDF保存完了を待つ Loop

emaxemax
質問者

お礼

ありがとうございます。 早速以下のようにやってみました。 Do While Dir(Fdr & "\" & Fn & ".pdf") = ""   Application.Wait Now() + TimeValue("00:00:01")   '1秒PDF保存完了を待つ   ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Fdr & "\" & Fn & ".pdf" Loop ところが同じエラーが出ます。 フォルダを見るとPDFファイルはできています。しかしファイルサイズが 0KB で、「ファイルが破損している」となってこれをひらくことはできませんでした。

emaxemax
質問者

補足

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Fdr & "\" & Fn & ".pdf" Do While Dir(Fdr & "\" & Fn & ".pdf") = ""   Application.Wait Now() + TimeValue("00:00:01")   '1秒PDF保存完了を待つ Loop でもダメでした。

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.1

サーバー側の処理が終わる前に次の作業に移るのが原因でしょう。 タイミングの問題なので何秒待てば良いという答えはありません(10秒待てば十分だとは思いますが)。 待ち時間がもったいないのであれば、書き込み処理のあと、そのファイルがサーバーで見つかるまでループで待てば良いと思います。

emaxemax
質問者

お礼

ありがとうございます。

関連するQ&A