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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

5回答

9461閲覧

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

lazy

総合スコア36

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2017/08/05 00:41

編集2017/08/07 02:45

お世話になっております

ExcelのVBA初心者です

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

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

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

vba

1Sub sample() 2 3 Dim st As Object 4 Dim outPutPath As String 5 Dim fileName As String 6 Dim waitTime As Variant 7 8 outPutPath = '保存先のパス' 9 10 For Each st In Sheets 11 st.Activate 12 fileName = outPutPath & st.Name 13 ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName 14 waitTime = Now + TimeValue("0:00:03") 15 Application.Wait waitTime 16 Next 17 18End Sub

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

エラー内容
イメージ説明

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

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

OS:Windows10
Excelバージョン:Excel2013


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

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

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

vba

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moh1ee

2017/08/05 17:18

Application.Waitで処理を止めるのは何か目的があってのことでしょうか?
退会済みユーザー

退会済みユーザー

2017/08/06 01:46 編集

私は。保存直後に待機なしでループさせるとクラッシュする、と踏んだからだと思っていました(実際どうなるかは...)
lazy

2017/08/06 01:50

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

退会済みユーザー

2017/08/06 02:20

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

2017/08/06 02:21

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

回答5

0

ベストアンサー

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

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

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

vba

1Option Explicit 2 3' ファイル名 outputpdf.xlsm として保存。 4' イミディエイトウィンドウで、以下の通り、ワークブックを引数として呼び出す 5' call sample(workbooks("outputpdf.xlsm")) 6Sub sample(wb As Workbook) 7 8 ' 曖昧な定義を訂正 9 'Dim st As Object 10 Dim st As Worksheet 11 Dim outPutPath As String 12 Dim fileName As String 13 'Dim waitTime As Variant 14 15 outPutPath = "c:\work\" 16 17 ' 指定したワークブック中のワークシート分ループ。 18 For Each st In wb.Sheets 19 st.Activate 20 fileName = outPutPath & st.Name 21 22 ' ワークシートオブジェクトは、現在のワークシートを示す st を用いる。 23 'ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName 24 st.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName 25 26 ' weit 不要 27 'waitTime = Now + TimeValue("0:00:03") 28 'Application.Wait waitTime 29 Next 30 31End Sub

投稿2017/08/07 04:54

tukuroku

総合スコア234

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lazy

2017/08/09 07:02

ありがとうござます。 提示頂いたコードで問題なくできましたが、 どうやら、保存先のパスが原因っぽかったです c配下であれば、問題なく出力できたのですが、 dropbox配下などはダメでした パスに日本語が含まれているのが原因かと思ったのですが、 それも、関係有りませんでした とりあえず、今のパスのままでやっていこうと思います(笑) ありがとうございます
guest

0

こちらは無料のVBA向けのコンポーネントSpire.XLS for .NETがありまして、問題のExcelからPDFに出力することがでいきると思いますので、一度試してみませんか、ダウンロードしてから参照に追加するだけで普通に使用できますから、無料にしては意外と簡単ですよ。使えるコードも一応貼り付けてます:

Imports

1 2Namespace Excel_Worksheet_to_PDF 3 Class Program 4 Private Shared Sub Main(args As String()) 5 Dim workbook As New Workbook() 6 workbook.LoadFromFile("Sample.xlsx") 7 8 Dim sheet As Worksheet = workbook.Worksheets(0) 9 10 sheet.SaveToPdf("toPDF.pdf") 11 System.Diagnostics.Process.Start("toPDF.pdf") 12 End Sub 13 End Class 14End Namespace

お役に立つと幸いです、よろしく

投稿2021/12/29 02:11

yamausag1

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2017/08/06 02:23

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2017/08/06 02:14

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2017/08/05 10:49

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lazy

2017/08/07 02:41

コメントありがとうございますは 対応してみましたが、エラー変わらず発生してしまいます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問