質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.04%

VBAでExcelシートを一枚ずつpdfファイルに出力したい

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 6,212

score 35

お世話になっております

ExcelのVBA初心者です

Excelファイルに複数枚のシートが存在しており、
全てのシートの印刷設定は完了しています

各シートを1枚ずつにPDFファイルに出力したいと考えています
シート数だけpdfファイルができるようなイメージです。

そこで、以下のようなプログラムを書きました

Sub sample()

    Dim st As Object
    Dim outPutPath As String
    Dim fileName As String
    Dim waitTime As Variant

    outPutPath = '保存先のパス'

    For Each st In Sheets
     st.Activate
     fileName = outPutPath & st.Name
     ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName
     waitTime = Now + TimeValue("0:00:03")
     Application.Wait waitTime
    Next

End Sub

問題なく実行され
pdfファイルを出力され続けるのですが、以下のエラーが表示され
途中で処理が落ちてしまいます。
落ちる場所もランダムで、特定のシートで止まっているわけではありません

エラー内容
イメージ説明

検索してもこのエラーが発生する原因が多いので特定することができませんでした

環境は以下の通りとなります
ご教授頂ければと思います

OS:Windows10
Excelバージョン:Excel2013


みなさま、コメントありがとうございます

皆様のコメントやご指摘を対応しておりますが、
現状、エラーは表示されております。

デバッグしたところ、pdfの出力処理、以下の行を実行後にエラーが発生しております。

st.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName


ループ中ランダムのタイミングで出力されるので、シートに問題が有るわけではないようです。
本処理を実行後、pdfを出力してからエラーが発生する感じです。
ちなみに、出力したファイルに問題はありません。

申し訳ありませんが、ご教授頂ければと思います。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • lazy

    2017/08/06 10:50

    最初は、Application.Waitの処理はいれてませんでしたが、保存処理に時間がかかった場合の事を考慮してですね

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/08/06 11:20

    fileName = outPutPath & st.NameのoutPutPath は常にブランクですか?

    キャンセル

  • lazy

    2017/08/06 11:21

    ご指摘ありがとうございます。自分のファイルパスが入っていたので質問からは削除していました。質問内容を修正させていただきます。

    キャンセル

回答 4

checkベストアンサー

+1

エラーコード 400 の意味はこちらを参考にして下さい。

おそらく、いくつかのオブジェクトの定義が曖昧なため、何らかの原因で処理中にワークシートなどが参照できない状態になり、 400 番エラーが出ているのではないでしょうか。

ひとまず、提示されたプログラムを流用して、具体的なオブジェクトを指定できるようにしてみました。
何枚印刷するかわかりませんが、とりあえずワークシート100枚程度ならば落ちませんでした。

Option Explicit

' ファイル名 outputpdf.xlsm として保存。
' イミディエイトウィンドウで、以下の通り、ワークブックを引数として呼び出す
' call sample(workbooks("outputpdf.xlsm"))
Sub sample(wb As Workbook)

    ' 曖昧な定義を訂正
    'Dim st As Object
    Dim st As Worksheet
    Dim outPutPath As String
    Dim fileName As String
    'Dim waitTime As Variant

    outPutPath = "c:\work\"

    ' 指定したワークブック中のワークシート分ループ。
    For Each st In wb.Sheets
     st.Activate
     fileName = outPutPath & st.Name

     ' ワークシートオブジェクトは、現在のワークシートを示す st を用いる。
     'ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName
     st.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName

     ' weit 不要
     'waitTime = Now + TimeValue("0:00:03")
     'Application.Wait waitTime
    Next

End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/09 16:02

    ありがとうござます。

    提示頂いたコードで問題なくできましたが、
    どうやら、保存先のパスが原因っぽかったです

    c配下であれば、問題なく出力できたのですが、
    dropbox配下などはダメでした

    パスに日本語が含まれているのが原因かと思ったのですが、
    それも、関係有りませんでした

    とりあえず、今のパスのままでやっていこうと思います(笑)
    ありがとうございます

    キャンセル

0

マクロが無効かもしれませんので確認ください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/07 11:41

    コメントありがとうございますは

    対応してみましたが、エラー変わらず発生してしまいます

    キャンセル

0

手元にExcelがないので検証できませんが、st.ActivateActiveSheet.ExportAsFixedFormat (略)が悪さをしているような気がします。

案として、アクティブ処理を消してしまって、シートの選択なしに直接シートを印刷(PDF化)、つまり、
st.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileNameとしてしまってはいかがでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

stackoverflowに保存するときのpathをちゃんと指定しないと400エラーが出る的な書き込みがありました。fileNameをmsgbox(fileName )とするなりなんなりで、ちゃんとしたpathになっているか確認した方がよいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る