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

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

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

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

Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

Q&A

解決済

1回答

4033閲覧

word文書を上書き保存した時に vbaでPDFのコピーを作りたいです。

say_you2001

総合スコア40

VBA

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

Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

0グッド

0クリップ

投稿2019/03/03 02:24

word for office365 です。
顧客に提供するのはPDF形式です。
ワードの文章をちょくちょく直すのですが、
直した後、上書き保存した時にPDF化されていると便利だと考えています。

以下のURLを参考に
https://www.wordvbalab.com/code/3838/

ファイルを保存した時にPDFのコピーを作るコードを以下のようにしてみました。

vba

1Private Sub Document_Close() 2 3 Dim myFileName As String 'ファイル名 4 Dim myFilePath As String '保存先のフォルダパス 5 Dim myDoc As Document 6 Dim intPos As Integer 'ピリオドの位置 7 8 Set myDoc = ActiveDocument 9 10 '拡張子のない名称を取得 11 myFileName = myDoc.Name 12 intPos = InStrRev(myFileName, ".") 13 myFileName = Left(myFileName, intPos - 1) 14 15 'PDFファイルで保存 16 myFilePath = myDoc.Path 'Wordファイルと同じフォルダ 17 myDoc.ExportAsFixedFormat _ 18 OutputFileName:=myFilePath & "\" & myFileName & ".pdf", _ 19 ExportFormat:=wdExportFormatPDF 20 21 Set myDoc = Nothing 22 23End Sub

しかし、これですとファイルを閉じた時に無条件にPDFが(上書きされ)作られてしまいます。

上書き保存を選んだときにのみPDFのコピーを作るにはどうしたらよろしいでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

WordのDocumentBeforeSaveイベントを使用する方法がよいと思います。
このイベントはWordファイル保存前に発生します。
「word イベント DocumentBeforeSave」で検索すると参考になりそうなページが色々とヒットしますので、まずはDocumentBeforeSaveを検知する方法を確認してください。
イベントを検知できるようになれば、そのイベントハンドラでPDF保存の処理を行えばよいです。

追記

ちょっと時間があったので、提示頂きましたstackoverflowサイトに記載のサンプル(一番上の回答)を試してみました。
とりあえず、このサイトの方法で、保存時イベントによるメッセージ表示を確認しました。
私の環境はWord2016ですので、お使いの環境によっては若干操作が異なるかも知れませんが、試した手順を示します。

・まず、適当なWordファイルを用意します。
Wordの「開発」より「Visual Basic」を選び、用意したWordファイルの名前がついているプロジェクトに対して、EventClassModuleという名前のクラスモジュールを作成します。
対象プロジェクトの右クリックで「挿入」-「クラスモジュール」を選択すると「Class1」というクラスモジュールが生成されますが、プロパティウィンドウでクラス名を変えることができます。

・上記で作成したクラスモジュールに、参考サイトに記載の「Public WithEvents App As Word.Application」で始まるコードサンプルを貼り付けます。

・次に、mdlEventConnectという名前の標準モジュールを作成します。
上記クラスモジュールの作成方法に倣いますが、こちらは「クラスモジュール」ではなく、「標準モジュール」とします。

・上記で作成した標準モジュールに、参考サイトに記載の「Dim X As New EventClassModule」で始まるコードサンプルを貼り付けます。

・最後に、すでに存在するThisDocumentに、参考サイトに記載の「Private Sub Document_New()」で始まるコードサンプルを貼り付けます。

このコードを含むWordファイルを保存します。
(マクロ包含形式*.docmまたは旧形式*.doc)
一度このWordファイルを閉じてから再度Wordファイルを開くと、保存時イベントによりメッセージが表示されました。

これがうまくいったら、保存時イベントでPDFエクスポートを行う、という方法でいけるのでは、と思います。
ちなみに、DocumentBeforeSaveイベントの第2引数「SaveAsUI」には、上書き保存でFalse、名前を付けて保存でTrueが渡されますので、必要に応じて活用ください。

投稿2019/03/03 03:50

編集2019/03/04 01:59
kenshirou

総合スコア772

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

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

kenshirou

2019/03/04 01:49

回答に、提示頂きましたstackoverflowサイトに記載のサンプルを試した結果を追記しました。
kenshirou

2019/03/04 02:18

クラスモジュールに作成したDocumentBeforeSaveイベントに、質問時に記載されていた「Document_Close()」の中身をそのまま持ってくればOKのようですね。 対象Wordファイル保存時に、同名PDFが出力されることを確認しました。 このままだと、「上書き保存」「名前を付けて保存」いずれの場合もこのイベントが発生しますが、必要に応じて調整ください。
say_you2001

2019/03/04 07:15

kenshirou様 アドバイスありがとうございました。 すべて標準モジュールに作成していたのが原因でした。 教えていただいたとおりにしているつもりなのですが、 保存した後にファイルを開くと、 「メソッドまたはデータ メンバが見つかりません。」 とエラーメッセージが出て Set X.App = Word.Application の行が青く反転表示されます。 もしも、心当たりがありましたらご指導下さい。
say_you2001

2019/03/04 23:22

kenshirou様 アドバイスありがおとうございました。 w局、この方向での問題解決は諦めて、VBでWordファイルを一気にPDFするコードを書きました。 保存するごとにWordをPDF化するのではなく、変更したWordファイルを貯めておいてPDF化する方法です。 しかし、今回kenshirou様にコメントを頂いたことをキッカケに標準モジュール、クラスモジュール、ThisDocumentの違いについて調べることができました。 感謝する次第です。
kenshirou

2019/03/05 00:32

こちらこそ、BAありがとうございました。 しかしながら、別方法で解決されたとのことで、このままBAを頂くのは大変恐縮ですので、もう少し書き込みさせてください。 「Set X.App = Word.Application」の行で「メソッドまたはデータ メンバが見つかりません。」のエラーが出るとのことですが、エラーの原因は「X.App」の方でしょうか、「Word.Application」の方でしょうか? (上記「X.App」の「App」の部分、または「Word.Application」の「Application」の部分を右クリックしてメニューの「定義」を選択した場合に、定義されていないメンバの場合はアラートが出ます。) 「X.App」に問題がある場合は、クラスモジュール内にAppというメンバが定義されていないことが原因のように思います。 「Public WithEvents App As Word.Application」の行はこのクラスモジュールの先頭に記載されていますでしょうか?
say_you2001

2019/03/05 08:55

ありがとうございました。 無事解決いたしました。 経緯をご報告しますと。 「Word.Application」の「Application」の部分を右クリックしてメニューの「定義」を選択するとGlobalのメンバーが出てきました。 しかし、「X.App」の「App」の部分で同じことをすると「カーソル下にある識別子を認識できません」とのメッセージがでました。 そこでプログラムをよく読むとなんと 「Public WithEvents AppWord As Word.Application」 とWordの文字が混入していました。 これからこのコードを良く研究してみます。 ということで2重のベストアンサーを差し上げたいくらいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問