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

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

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

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

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

5回答

8693閲覧

EXCEL VBA シートごとにPDF出力したいが、同姓同名ファイルが上書きされてほしくない

Shimejin

総合スコア0

VBA

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

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

0グッド

0クリップ

投稿2020/12/18 03:47

実現したいこと

EXCEL VBA 内で**【シートごとにPDF出力したい】**と思い、
下記VBAを組みましたが、同姓同名の場合に上書きされてしまいます。
同姓同名ファイルが上書きされてほしくないのですが、どうしたらよいでしょうか?
重複する場合、末尾に番号を1から振っていけたらいいのかなと思っております。

シート名がフルネームで「田中太郎」になります
保存後のファイル名は「通知書_田中太郎.pdf」

<重複した場合>
「通知書_田中太郎.pdf」と
「通知書_田中太郎1.pdf」が同ファイルに保存されてほしいです。

また、重複しない別名ファイルはそのまま保存されていってほしいです。
以下が理想形のフォルダ群です。

C:\通知書格納フォルダ\通知書格納フォルダ   通知書_田中太郎.pdf   通知書_田中太郎1.pdf   通知書_山田花子.pdf   通知書_山本次郎.pdf   通知書_山本次郎1.pdf   通知書_山本次郎2.pdf

該当のソースコード

VBA

1Sub PDF出力() 2 Dim ws As Worksheet 3 Dim exPath As String 4 Dim Path As String 5 6 Path = "C:\通知書格納フォルダ" 7 8 For Each ws In Worksheets 9 exPath = Path & "\通知書_" & ws.Name & ".pdf" 10 ws.ExportAsFixedFormat _ 11 Type:=xlTypePDF, _ 12 FileName:=exPath, _ 13 Quality:=xlQualityStandard 14 Next 15End Sub

基本的にはPathフォルダは空の状態からスタートする予定です。
(出力したPDFは、毎日各個人フォルダへ振り分けるのでPathフォルダから移動する)

試したこと

https://qiita.com/yagi_eng/items/cc7570b3878818a8e495

ここのコードを使えるかもと思い試しましたが、わたくしがそこまで詳しくなく、どこに挿入し修正すればよいのかわかりませんでした。
ご教授いただければ幸いです。
また別の方法でももちろんかまいません。

補足情報(FW/ツールのバージョンなど)

使用ソフトウェア
・Microsoft 365 Excel バージョン2011(ビルド 13426.20308)
・UiPath

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/12/18 04:15

> どこに挿入し修正すればよいのかわかりませんでした。 何がわからなかったのかを詳しく書いてください。 参考にされたQiitaに書かれていることと同じことしか回答できないですよ。
tatsu99

2020/12/18 04:31

>基本的にはPathフォルダは空の状態からスタートする予定です。 >(出力したPDFは、毎日各個人フォルダへ振り分けるのでPathフォルダから移動する) 上記をきちんと行っていれば、ファイル名の重複は発生しないはずですが、それでも、重複時の処理を実装したいというのは、万が一、上記の処理が行われなかった場合に、備えたいとということでしょうか。
guest

回答5

0

同じファイル名が存在する場合は、連番を追加したファイル名を返す関数を作成しておくといいでしょう。
そういう要件はわりとあると思いますので。

標準モジュール

vba

1Public Function GetSaveFileName(Path As String, FileName As String, ext As String) 2 Dim FN As String, i As Long 3 4 GetSaveFileName = Path & "\" & FileName & "." & ext 5 6 FN = Dir(GetSaveFileName) 7 Do Until FN = "" 8 i = i + 1 9 GetSaveFileName = Path & "\" & FileName & i & "." & ext 10 FN = Dir(GetSaveFileName) 11 Loop 12End Function

上記の関数を使って質問のコードを書き直すと下記になります。

vba

1Sub PDF出力() 2 Dim ws As Worksheet 3 Dim exPath As String 4 Dim Path As String 5 6 Path = "C:\通知書格納フォルダ" 7 8 For Each ws In Worksheets 9 exPath = GetSaveFileName(Path, "通知書_" & ws.Name, "pdf") 10 ws.ExportAsFixedFormat _ 11 Type:=xlTypePDF, _ 12 FileName:=exPath, _ 13 Quality:=xlQualityStandard 14 Next 15End Sub

投稿2020/12/18 04:54

hatena19

総合スコア33790

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

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

0

保存するファイル名をVBA内で生成しているのであれば、
出力する前にファイルの存在確認をして回避策をとるのが妥当ではないかと。

Dir関数を使えば、見つからないときに長さゼロの文字列を返すので。

投稿2020/12/18 04:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

  1. とある変数に1を入れる
  2. ファイル名にこの変数の値を入れ他ファイル名を作成
  3. そのファイル名のファイルが存在するかをチェック
  4. 存在していなければそのファイル名でPDFファイルを作成、終了
  5. 変数を+1する
  6. 2にループ

という手順となります
この中でやり方のわからない処理というのはあるでしょうか

投稿2020/12/18 04:10

y_waiwai

総合スコア87800

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

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

0

通知書_シート名.pdf という規則でファイル名が決まっているようですが、そもそも同名のシートは作れないはずです。
よって同名のファイルが重複することはないはずです。
マクロ実行前に既に同名のファイルが存在しているということでしょうか?

基本的にはPathフォルダは空の状態からスタートする予定です。

とあるので、同名のファイルはないですよね?
そもそも何かを勘違いしていないでしょうか?

投稿2020/12/18 05:00

ttyp03

総合スコア16998

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

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

0

ここのコードを使えるかもと思い試しましたが、わたくしがそこまで詳しくなく、どこに挿入し修正すればよいのかわかりませんでした。

保存するファイル名を作るのと、ファイル保存をする前の間ですね。

exPathのファイルが存在するかチェックして、なければそのまま保存。あれば、添え字を付けて保存。
添え字をつけたファイルも存在するのも忘れずに。。。

投稿2020/12/18 04:11

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問