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

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

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

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

Q&A

解決済

3回答

14804閲覧

VBAのPDF出力処理を高速化したい

taka-hoop

総合スコア14

VBA

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

0グッド

0クリップ

投稿2020/07/31 03:32

編集2020/07/31 04:23

先日の質問からの続きで大変恐縮なのですが
無事こちらで質問させてもらったおかげで条件分岐してPDF出力処理ができたのですが
ここから出力される際に「保存中 処理中のページ」とエクセルが開いて表示され動きが重たくなります。
ファイル数が多いのでせっかく自動化したものの恩恵を感じにくい状態となっております。

このウィンドウを消して処理を早くする方法が知りたいです。
宜しくお願い致します。

VBA

1 2Sub EXCELファイルPDF化03() 'フォルダのEXCELファイルの一括変換 3Application.ScreenUpdating = False 4 Dim Button, T, I, L As Integer 5 Dim OpenExcelFileName, ExcelFileName, ExcelFilePath, ExFileName As String 6 7 Application.DisplayAlerts = False '確認メッセージを無効化します。 8 9 10 Button = MsgBox("EXCEファイルの一括PDF変を行いますか?", vbYesNo + vbQuestion, "確認") 11 If Button = vbYes Then 12 13 OpenExcelFileName = Application.GetOpenFilename 'ダイアログを表示取り込むフォルダーにあるファイルを選択します。 14 15 If OpenExcelFileName <> "False" Then 16 ExcelFileName = Dir(OpenExcelFileName) '指定したファイルパスからファイル名を代入します。 17 ExcelFilePath = Replace(OpenExcelFileName, ExcelFileName, "") '指定したファイルパスを指定します。(ファイルパスからファイル名を取り除く) 18 19 MsgBox ExcelFilePath & "この選択フォルダからPDFに変換します。" 20 Else 21 MsgBox "キャンセルされました" 22 Exit Sub 'キャンセルでプログラムを終了します。 23 24 End If 25 26 ExFileName = Dir(ExcelFilePath & "*.xls?") '指定したフォルダーから一件目のEXCELファイルを指定します。 27 28 29 Do While ExFileName <> "" '読み込むファイルがなくなるまで繰り返す。 30 31 Workbooks.Open fileName:=ExcelFilePath & ExFileName, ReadOnly:=True, UpdateLinks:=0 'EXCELファイルを読み取り専用で読み込む 32 ExFileName = Left(ExFileName, InStr(ExFileName, ".") - 1) ' ファイル名から拡張子を取り除く(.xls?) 33 34 'ActiveWorkbook の記述はいらなかった 35 'レポートの記述にいらないスペースがあったかも 36 Dim ws As Worksheet 37 38 On Error Resume Next 'エラー無視 39 Set ws = Worksheets("レポート") 40 On Error GoTo 0 'エラー無視解除 41 If ws Is Nothing Then '"レポート"シートが存在しなければ、 42 Worksheets(Array("表紙", "検索", "表示箇所", "行動", "順位")).Select 43 ActiveSheet.ExportAsFixedFormat _ 44 Type:=xlTypePDF, _ 45 fileName:=ExcelFilePath & ExFileName, _ 46 OpenAfterPublish:=True 47 Else 48 ws.ExportAsFixedFormat _ 49 Type:=xlTypePDF, _ 50 fileName:=ExcelFilePath & ExFileName, _ 51 OpenAfterPublish:=True 52 End If 53 54 55 ActiveWindow.Close '読み込んだファイルを閉じます。 56 57 ExFileName = Dir() '次のファイルを指定する。 58 59 Loop 60 61 MsgBox "PDFファイルに一括変換しました。" 62 Else 63 MsgBox "処理を中断します" 64 End If 65 66 Application.DisplayAlerts = True '確認メッセージを有効化します。 67 68End Sub

参考にした記事: https://www.tipsfound.com/vba/02014

OS:macOS Catalina バージョン10.15.3
Excelバージョン: Microsoft Excel for Mac バージョン16.39

補足:追加記載した画像の表示を消したり裏で?作業させたりできないかという事です。
このウィンドウが出る時は毎回エクセルも開かれますイメージ説明

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

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

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

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

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

guest

回答3

0

ベストアンサー

手動でやっても、VBAでやっても
エクセル君が作業している時間は変わりません。
ただ、煩雑な手順の繰り返しを自動化できるだけでもマクロ化の意味は十分あると思います。
画面の更新を止めたり、表示を隠したところで数にもよりますが、
大した高速化は望めないと思います。
画面がちらちらするのを止めるなら更新を止めてもいいですが、
なんか仕事をやってくれてる感があるので、
個人的には画面の更新を止めることはあまりやりません。個人の好みの問題ですが。。。

ExcelVBA

1Option Explicit 2 3Sub test() 4 Dim sFolderPath As String 5 Dim sFilePath As String 6 Dim wsh As Worksheet 7 8 If GetFolderPath(sFolderPath) = False Then Exit Sub 9 10 sFilePath = Dir(sFolderPath & "*.xlsx") 11 Do Until Len(sFilePath) = 0 12 With Workbooks.Open(sFolderPath & "\" & sFilePath) 13 .ExportAsFixedFormat Type:=xlTypePDF, _ 14 Filename:=Replace(.FullName, "xlsx", "pdf"), _ 15 OpenAfterPublish:=False 16 .Close False 17 sFilePath = Dir() 18 End With 19 Loop 20End Sub 21 22Private Function GetFolderPath(ByRef sFileName As String) As Boolean 23 With Application.FileDialog(msoFileDialogFolderPicker) 24 .InitialFileName = "C:\Users\Guest\test\" 25 If .Show = -1 Then 26 sFileName = .SelectedItems(1) 27 GetFolderPath = True 28 End If 29 End With 30End Function

とりあえず、ブック全体でサンプル書いてます。
条件分岐が必要な部分は改変願います。
(なんか上手くグループ化して指定ができなかったけど、時間がないので^^;)
参考になれば。

投稿2020/07/31 11:11

mattuwan

総合スコア2163

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

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

taka-hoop

2020/08/01 06:39

ご回答ありがとうございます! 返答遅れてしまい申し訳ありません! なるほど!非常に参考になります。 そうですね確かに多数のPDF出力を自動化できただけでもマクロ化した意味は十分ですよね! コードすごく勉強になります! ご丁寧に返答頂きありがとうございます!
guest

0

プログレスバーを消したところで速くはならないと思いますよ。
Excelの標準機能を使ってPDFに変換するには、まずブックを開く必要があり、開くブックが大きければ大きいほど、数が多ければ多いほど時間がかかります。
開く処理(Open)と変換処理(ExportAsFixedFormat)が重い処理になるかと思いますが、閉じた世界ですので外からどうこうするのは厳しいかと思います。

投稿2020/07/31 09:54

ttyp03

総合スコア17000

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

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

taka-hoop

2020/08/01 03:23

ご回答ありがとうございます! お返事遅れて申し訳ありません。 なるほど、やはり作業的には厳しい感じなんですね とても参考なりました!ありがとうございます!
guest

0

素人考えですが

Application.ScreenUpdating = False '描画省略
Application.DisplayAlerts = False '警告省略

と記述されていますので、VBAのロジックを最適化できればいいと思いますが
簡単には最適化できなさそうな雰囲気を感じます・・・。
エクセルそのもののPDF変換そのものは高コストのような気がします。

投稿2020/07/31 03:41

mako1972

総合スコア383

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

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

taka-hoop

2020/07/31 03:44

ご回答ありがとうございます! エクセルファイルからPDFに変換する時が一番重くて 変換される際に毎回ファイルが開かれ表示されるのでそれが重い原因なのかなと感じています。 エクセルのPDF出力はそもそも重たい作業という事でしょうか?
mako1972

2020/07/31 03:49 編集

確かにエクセルを開いて閉じる処理自体がファイル数が多いと高コストの処理となります。 PDF作成自体も重い処理となりますので、詳しい方の回答を広く聞いた方がよさそうですね。
mako1972

2020/07/31 03:53

こういう記述もあるようですが・・。 検証してみてください。 Sub test() Workbooks.Open Filename:="\XXX.xlsx", ReadOnly:=True ActiveWindow.Visible = False ’XX処理 ActiveWindow.Visible = True End Sub
taka-hoop

2020/07/31 03:55 編集

ご返答ありがとうございます! なるほど!一つ理解が進みました。勉強になります! いつもご丁寧に回答ありがとうございます。 検証コメントもありがとうございます! ぜひ試させて頂きます!
mako1972

2020/07/31 03:56

あまり変わらない気がします・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問