[[20230619100103]] 『PDFファイル名一括置換』(労務担当) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『PDFファイル名一括置換』(労務担当)

こんにちは。労務担当です。よろしくお願いいたします。

給与ソフトから出力した給与明細のPDFにパスワードを設定して
自動でメール配信しようと考えています。

現在躓いているのがPDFファイル名一括置換です。

給与ソフトから出力されるPDFのファイル名は下記のとおりです。

0025 山田 太郎 給与明細書 令和 5年6月23日.pdf

社員番号半角数字4桁+氏名+給与明細書+支給日

これを下記のように変更したいです

山田 太郎 給与明細書 2023年6月度.pdf
氏名+給与明細書+支給月
並び順はこだわりありません。
作業をするのは必ず支給付きなので日付の月は当月です

エクセルを用意して変更前と変更後のファイル名を記載して一括変換する方法はわかります。
今回の希望は同じパターンのファイル名なのでエクセルを用意せず
置換したいのです。

拡張子PDFのファイル名を取得して変更をループさせるはなんとなくわかるのですが変更させる部分の構文がわかりません。

"マクロ ファイル名の一括変更"と検索するとエクセル一覧を使用するものばかり出てきて躓いています。

ヒントや参考にするとよいサイトなどご教授いただけると助かります。

よろしくお願いいたします。

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


こんにちわ〜^^
他にもスマートな方法はたくさんあるかもですが
一案ですぅ^^;
給与明細 は固定文?
日付け  当月 作成可能
であれば、後はご尊名のみ取り出せばOKかと
例えば、給 で分割、添え字ゼロの文字列から、数値と空白文字列を
除去すればお名前のみが抽出!
後は、お名前、給与明細という文字列、当年、当月、拡張子を繋げれば
(^◇^)v
m(__)m。。。文字列操作。。。とかでたくさん参考サイトが

(隠居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

特定のフォルダーにPDFファイルが複数あり、ループで一括でファイル名を変更したいということでしょうか。

要件としては、下記の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(月) 11:11:30は
給与明細書

分割、が無難だと思います。。。^^;
給与明細書というお名前の人はいないと思いますので。。。^^;
hatenaさん案がよろしい様で。。。でわ
退散いたします。m(__)mm(__)mm(__)m

(隠居Z) 2023/06/19(月) 12:59:49


たくさんのご意見ありがとうございました。
隠居Zさんの言われた通り文字列操作で調べたらたくさん出てきました。

給与明細で分割して頭の半角数字とスペースを取ればと思いましたが
自分にはまだ難しくいろいろ試すもうまくいきませんでした。

結局一度エクセルに書き出してスペースで区切りのウィザードをかける方法に変更しました

もう少し簡単な文字列操作から勉強してみます。

ありがとうございました。

(労務担当) 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.