[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『PDFファイル名一括置換』(労務担当)
こんにちは。労務担当です。よろしくお願いいたします。
給与ソフトから出力した給与明細のPDFにパスワードを設定して
自動でメール配信しようと考えています。
現在躓いているのがPDFファイル名一括置換です。
給与ソフトから出力されるPDFのファイル名は下記のとおりです。
0025 山田 太郎 給与明細書 令和 5年6月23日.pdf
社員番号半角数字4桁+氏名+給与明細書+支給日
これを下記のように変更したいです
山田 太郎 給与明細書 2023年6月度.pdf
氏名+給与明細書+支給月
並び順はこだわりありません。
作業をするのは必ず支給付きなので日付の月は当月です
エクセルを用意して変更前と変更後のファイル名を記載して一括変換する方法はわかります。
今回の希望は同じパターンのファイル名なのでエクセルを用意せず
置換したいのです。
拡張子PDFのファイル名を取得して変更をループさせるはなんとなくわかるのですが変更させる部分の構文がわかりません。
"マクロ ファイル名の一括変更"と検索するとエクセル一覧を使用するものばかり出てきて躓いています。
ヒントや参考にするとよいサイトなどご教授いただけると助かります。
よろしくお願いいたします。
< 使用 Excel:Microsoft365、使用 OS:Windows10 >
(隠居Z) 2023/06/19(月) 11:11:30
>拡張子PDFのファイル名を取得して変更をループさせるはなんとなくわかるのですが変更させる部分の構文がわかりません。
以下は正規表現を使った例です。
'「0025 山田 太郎 給与明細書 令和 5年6月23日.pdf」を '「山田 太郎 給与明細書 2023年6月度.pdf」に置換 Sub test() Const strDate$ = "0025 山田 太郎 給与明細書 令和 5年6月23日.pdf" MsgBox ReNamePDF(strDate) End Sub
Function ReNamePDF$(pdfPath$) Dim mc, strMonth$, ret$ Static RegEx As Object If RegEx Is Nothing Then Set RegEx = CreateObject("VBScript.RegExp") With RegEx .IgnoreCase = True .Pattern = "令和.*(?=.pdf)" Set mc = .Execute(pdfPath) If mc.Count > 0 Then If IsDate(mc(0)) Then strMonth = VBA.Format$(CDate(mc(0)), "yyyy年m月度") ret = .Replace(VBA.Trim$(VBA.Mid$(pdfPath, 5)), strMonth) End If Else ret = pdfPath End If End With ReNamePDF = ret End Function (まる2021) 2023/06/19(月) 11:26:57
すみません。条件漏れがあったので以下に修正。
Sub test() Const path$ = "0025 山田 太郎 給与明細書 令和 5年6月23日.pdf" MsgBox ReNamePDF(path) End Sub
Function ReNamePDF$(pdfPath$) Dim mc, strMonth$, ret$ Static RegEx As Object If RegEx Is Nothing Then Set RegEx = CreateObject("VBScript.RegExp") With RegEx .IgnoreCase = True .Pattern = "令和.*(?=.pdf)" Set mc = .Execute(pdfPath) If mc.Count > 0 Then If IsDate(mc(0)) Then strMonth = VBA.Format$(CDate(mc(0)), "yyyy年m月度") ret = .Replace(VBA.Trim$(VBA.Mid$(pdfPath, 5)), strMonth) Else ret = pdfPath End If Else ret = pdfPath End If End With ReNamePDF = ret End Function
(まる2021) 2023/06/19(月) 11:35:05
私は以前この掲示板で紹介されてた Flexible Renamer https://www.vector.co.jp/soft/winnt/util/se131133.html をよく使っています。 フリーソフトが使える環境であればオススメです (´・ω・`) 2023/06/19(月) 11:43:28
またまた修正。「.」をエスケープするの、忘れてた。スレ汚してすみません。
.Pattern = "令和.*(?=.pdf)" => .Pattern = "令和.*(?=\.pdf)" (まる2021) 2023/06/19(月) 11:49:04
要件としては、下記の2つの処理が必要ですが、
ループでフォルダー内のPDFファイル一覧を取得する。
取得したファイル名を特定の条件で変換する。
どちらで躓いていますか。両方ですか。
(hatena) 2023/06/19(月) 11:54:52
とりあえず、PDFファイル名の変換のコード例。
Public Function RenamePDF(PDFName As String) As String Dim v As Variant
v = Split(PDFName, " 給与明細書 ") v(0) = Mid(v(0), 6) v(1) = Format(Split(v(1), ".")(0), "yyyy年m月度") & ".pdf"
RenamePDF = Join(v, " 給与明細書 ") End Function
Sub test() Const path = "0025 山田 太郎 給与明細書 令和 5年6月23日.pdf" MsgBox ReNamePDF(path) End Sub
(hatena) 2023/06/19(月) 12:11:37
ファイル名一覧の取得は、下記あたりを参考に。
Office TANAKA - ファイルの操作[ファイルの一覧を取得する] http://officetanaka.net/excel/vba/file/file07.htm
Dir関数を使う方法と、FileSystemObjectを使う方法が紹介されてます。
Dir関数はワイルドカードが使えるので、 buf = Dir(Path & "*.pdf") とすれば拡張子がpdfのファイルを取得できます。 ただし、ループ内でファイル名を変更すると、取得する順番が変わるため、抜けがでたり、 重複して変更したりするので、いったんファイル名を配列に格納して、 その配列をループしてファイル名変更する必要があります。
FileSystemObjectは一覧をコレクション(配列のようなもの)として取得しますので、 そのコレクションをループしてファイル名変更すればOKです。 ただし、ワイルドカードは使えないので、ループ内で拡張子がpdfかチェックして、 pdfのときのみファイル名変更するようにします。 (hatena) 2023/06/19(月) 12:57:03
(隠居Z) 2023/06/19(月) 12:59:49
給与明細で分割して頭の半角数字とスペースを取ればと思いましたが
自分にはまだ難しくいろいろ試すもうまくいきませんでした。
結局一度エクセルに書き出してスペースで区切りのウィザードをかける方法に変更しました
もう少し簡単な文字列操作から勉強してみます。
ありがとうございました。
(労務担当) 2023/06/20(火) 16:10:12
何を試してうまくいかなかったのか不明ですが、動作確認済みのコードを提示しておきます。 コードの意味が分かりやすいようにコメントを入れてます。
Sub RenamePDFAll() Const TargetFolder = "C:\test\pdf" '対象フォルダー名 Dim f As Object, cnt As Long With CreateObject("Scripting.FileSystemObject") 'FileSystemObjectオブジェクト生成 For Each f In .GetFolder(TargetFolder).Files '対象フォルダー内のファイルをループ処理 If f.Name Like "#### * 給与明細書 *.pdf" Then 'ファイル名が定型書式に合致するかチェック f.Name = RenamePDF(f.Name) 'ファイル名の変換 End If Next f End With End Sub
'ファイル名変換関数 '引数 "0025 山田 太郎 給与明細書 令和 5年6月23日.pdf" '戻り値 "山田 太郎 給与明細書 2023年6月度.pdf" Public Function RenamePDF(PDFName As String) As String Dim v As Variant v = Split(PDFName, " 給与明細書 ") '" 給与明細書 "を区切り文字にして分割して配列に v(0) = Mid(v(0), 6) '前半の6桁以降を取り出す(数字+空白を除去) v(1) = Format(Split(v(1), ".")(0), "yyyy年m月度") & ".pdf" '後半の日付部分の書式を変更 RenamePDF = Join(v, " 給与明細書 ") '前半と後半を" 給与明細書 "を区切り文字にして結合 End Function
(hatena) 2023/06/21(水) 01:29:05
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.