dポイントプレゼントキャンペーン実施中!

先日質問させていただきましたが、解決済みにしてしまったので再度質問としてあげさせていただきます。
前回回答していただいた方々の回答を参考にはさせていただきましたがまだ実現できておりません。
時間があればじっくりマクロ等勉強してしてわからないときに質問しようと思いましたがあまり時間がありません。

やりたいことはPDFのリネームなのですが、単純にAをBにすればいいというものではなく…

先日質問させていただきましたが、解決済みにしてしまったので再度質問としてあげさせていただきます。
前回回答していただいた方々の回答を参考にはさせていただきましたがまだ実現できておりません。
時間があればじっくりマクロ等勉強してしてわからないときに質問しようと思いましたがあまり時間がありません。
やりたいことはPDFのリネームなのですが、単純にAをBにすればいいというものではなく、、

使用するセルはA~D列、行は空になるまで繰り返しとなります。
元ファイル名は、
「C列D列(決まった文字列1).pdf」
となり、このファイル名を
「(決まった文字列2)A列-B列_(決まった文字列3)_エクセルの行番号_C列D列.pdf」

にリネームしたいのです。

例えば一行目であれば
「データ3データ4(決まった文字列1).pdf」を
「(決まった文字列2)データ1-データ2_(決まった文字列3)_エクセルの行番号_データ3データ4.pdf」
にしてこれを行が空になるまで(この場合だと3)といった形です。
A列とB列は全てデータ1とデータ2になります。
また、pdfファイルは決まった同じフォルダ内にあります。

前回の質問ではマクロにより実施したいと記載しましたが、回答の一つとして
「シート上で、数式を駆使して、コマンドプロンプトのRENAMEコマンドの形式で文字列を組み立てて、
その文字列をファイルに出力して、バッチファイルとして実行するのが、一番簡単で安全確実な方法だと思います」
といった回答も頂いているのでこちらの方法をまずはやってみようと思っています。
そこで、具体的にどうすればこの処理を実現できるのかご教授頂きたく存じます。

内容としてはもっと突き詰めてから質問しろと思われるということは重々承知ですが、
経験上このようなスキルが全くといっていいほどなく、これを機にスキルを磨いていきたいと考えております。
何卒、宜しくお願い致します。

「PDFのファイル名をリネームをしたい(若」の質問画像

A 回答 (10件)

E列に結果を表示する版です。


Const folder As String = "d:\goo\pdfdata\" '格納フォルダ名
Const str1 As String = "STR1" '決まった文字列1
Const str2 As String = "STR2" '決まった文字列2
Const str3 As String = "STR3" '決まった文字列3
はあなたの環境にあわせてください。
-----------------------------------------------------------------
Option Explicit

Public Sub PDFリネーム()
Const folder As String = "d:\goo\pdfdata\" '格納フォルダ名
Const str1 As String = "STR1" '決まった文字列1
Const str2 As String = "STR2" '決まった文字列2
Const str3 As String = "STR3" '決まった文字列3
Dim fname As String
Dim maxrow As Long
Dim wrow As Long
Dim ws As Worksheet
Dim oldName As String
Dim newName As String
Set ws = ActiveSheet
maxrow = ws.Cells(Rows.Count, "C").End(xlUp).Row ' C列最終行を求める
ws.Range("E:E").ClearContents
For wrow = 1 To maxrow
oldName = ws.Cells(wrow, "C").Value & ws.Cells(wrow, "D").Value & str3 & ".pdf"
If Dir(folder & oldName) <> "" Then
newName = str2 & ws.Cells(1, "A").Value & "-" & ws.Cells(1, "B").Value & "_" & str3 & "_" & wrow & "_" & ws.Cells(wrow, "C").Value & ws.Cells(wrow, "D").Value & ".pdf"
Name folder & oldName As folder & newName
ws.Cells(wrow, "E").Value = "リネーム完了"
Else
ws.Cells(wrow, "E").Value = "該当ファイル無"
End If
Next

End Sub
    • good
    • 0
この回答へのお礼

感謝してもしきれません。。ありがとうございます。

お礼日時:2020/12/02 12:23

No8です。


Debug.Print oldName
の行がありますが、これはこちらの確認用の為でした。削除してください。
失礼しました。
    • good
    • 0
この回答へのお礼

因みにですが、E列に出力する場合のコードはどのようになりますでしょうか。お時間があればで結構ですので、宜しくお願いします。

お礼日時:2020/11/18 13:37

リネーム結果をE列に出力しようと思いましたが、望まれていないようなので


メッセージボックスに表示します。
もし、それも望まれていないなら、その個所はコメントにしてください。
以下のマクロを標準モジュールに登録してください。
尚、
Const folder As String = "d:\goo\pdfdata\" '格納フォルダ名
Const str1 As String = "STR1" '決まった文字列1
Const str2 As String = "STR2" '決まった文字列2
Const str3 As String = "STR3" '決まった文字列3
についてはあなたの環境にあわせて適切に設定してください。
--------------------------------------------
Option Explicit

Public Sub PDFリネーム()
Const folder As String = "d:\goo\pdfdata\" '格納フォルダ名
Const str1 As String = "STR1" '決まった文字列1
Const str2 As String = "STR2" '決まった文字列2
Const str3 As String = "STR3" '決まった文字列3
Dim fname As String
Dim maxrow As Long
Dim wrow As Long
Dim ws As Worksheet
Dim oldName As String
Dim newName As String
Set ws = ActiveSheet
maxrow = ws.Cells(Rows.Count, "C").End(xlUp).Row ' C列最終行を求める
For wrow = 1 To maxrow
oldName = ws.Cells(wrow, "C").Value & ws.Cells(wrow, "D").Value & str3 & ".pdf"
If Dir(folder & oldName) <> "" Then
newName = str2 & ws.Cells(1, "A").Value & "-" & ws.Cells(1, "B").Value & "_" & str3 & "_" & wrow & "_" & ws.Cells(wrow, "C").Value & ws.Cells(wrow, "D").Value & ".pdf"
Name folder & oldName As folder & newName
MsgBox ("<" & oldName & ">リネーム完了")
Else
MsgBox ("<" & oldName & ">が存在しません")
Debug.Print oldName
End If
Next

End Sub
    • good
    • 0
この回答へのお礼

いえ、もしE列に出力した方がベターということであれば手段の条件はありません。わざわざコードありがとうございます。試行してみます。助かります。

お礼日時:2020/11/18 13:34

E列が空いているなら、その列にリネーム結果を出力するようにしてはいかがでしょうか。



完了
ファイルなし
などです。
    • good
    • 0

もし、添付図のようなセルの内容だとして、


決まった文字列1=STR1
決まった文字列2=STR2
決まった文字列3=STR3
の場合
1行目のデータに対応する
変更前のPDFファイル名=CCCDDDSTR3.pdf
変更後のPDFファイル名=STR2AAA-BBB_STR3_1_CCCDDD.pdf

であっていますか。
「PDFのファイル名をリネームをしたい(若」の回答画像6
    • good
    • 0
この回答へのお礼

ご記載のとおりでございます。

お礼日時:2020/11/18 09:43

#4です。


よく読まず、ごめんなさい。下記のようにリネームするのですね。
「(決まった文字列2)データ1-データ2_(決まった文字列3)_エクセルの行番号_データ3データ4.pdf」
であるなら、下記を
ReName = r.Value & r.Offset(, 1).Value

下記のように変更して
ReName = "(決まった文字列2)" & BaseName & "_(決まった文字列3) _ " & r.Row & "_" & r.Value & r.Offset(, 1).Value

また、下記を
BaseName = r.Offset(, -2).MergeArea(1, 1).Value & r.Offset(, -1).MergeArea(1, 1).Value & Ext

BaseName = r.Offset(, -2).MergeArea(1, 1).Value & r.Offset(, -1).MergeArea(1, 1).Value
( & Extを削除)として更に

Loop
の下に
BaseName = BaseName & Ext
を書き加えてください。

判り難いかも、、すみません。
    • good
    • 0

こんばんは、


>その文字列をファイルに出力して、バッチファイルとして実行するのが、一番簡単で安全確実な方法だと思います」
そうかもしれませんが、
DirとFileCopyで別のフォルダに名前を付けて保存するのはどうでしょう。

QAサイトでのご質問は、問題の解決と捉えています。
しかし、プログラム系の場合、アドバイスが欲しいのか、コードが欲しいのか、プロシージャが欲しいのか私には判断できませんが、解決していないようですので、私が処理内容を理解しているか分かりませんが、VBAの一例です。
PDFの入ったフォルダを選択します。(拡張子は小文字を対象にしています。大文字がある場合は、一部手直しが必要かと)
リネームファイルは、デスクトップに
"ReNamePDF" & Format(Date, "yyyymmdd")フォルダが作成され保存されます。すでにある場合は、フォルダは作成されません。
フォルダ内にすでに同じファイル名が存在する場合は、ファイル名に_ver+№が付加され保存されます。データ量はC列を対象にしています。

学習については、色々方法があると思いますのでご自身で考えてください。
私的には、QAサイトは学習には適しているとは、思えません。
書き方沢山あるし、、よほど検索能力を磨いた方がスキルUPに繋がるかと思いますよ。

Sub Copy_ReName()
Dim BaseName As String, ReName As String
Dim path As String, cPath As String
Dim SaveDir As String
Dim n As Long
Dim r As Range
Const Ext As String = ".pdf"
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then
path = .SelectedItems(1) & "\"
Else
Exit Sub
End If
End With
cPath = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\"
SaveDir = cPath & "ReNamePDF" & Format(Date, "yyyymmdd")
If Dir(SaveDir, vbDirectory) = "" Then
MkDir SaveDir
End If
For Each r In Range(Cells(1, "C"), Cells(Rows.Count, "C").End(xlUp))
BaseName = r.Offset(, -2).MergeArea(1, 1).Value & r.Offset(, -1).MergeArea(1, 1).Value & Ext
ReName = r.Value & r.Offset(, 1).Value
n = 0
Do While Dir(SaveDir & "\" & ReName & Ext) <> ""
n = n + 1
ReName = ReName & "_ver" & CStr(n)
Loop
ReName = ReName & Ext
If Dir(path & BaseName) <> "" Then
FileCopy path & BaseName, SaveDir & "\" & ReName
End If
Next r
End Sub
    • good
    • 0
この回答へのお礼

わざわざ具体例まで記載いただきありがとうございます。
正直ぱっと見処理内容は全くと言っていいほど理解できませんが、読み解けるよう調べて参考にさせていただきます。
学習に関しては仰る通りですよね。すみません。

お礼日時:2020/11/18 09:42

先の質問が分からないため、これ!という回答が出来ませんが、ご了承下さい。



件のアドバイスについてですが、恐らくエクセル側でAをBにするrenameコマンドをファイル数分作成する事を意図したのだと思います。


コマンド自体の文字列はExcelで作れるでしょうが、元のファイル名の取得やバッチファイルへの出力はExcel関数だけでは不可能です。

VBAを使用しないのであれば、dirコマンドでフォルダ内のファイル名一式を取得し、それをExcelに貼り付ける必要があります。

dir *.pdf >dir_list.txt

renameコマンドについてですが、構文は下の通りになります。上で既に貼り付けた元ファイル名をbefore.pdfに、変更先のファイル名をafter.pdfに置き換えるように文字列を作る事になります。

ren before.pdf update¥after.pdf

Excelの行番号は下の式で取得できます。
調整したい場合は関数のうしろに加減算をつければ実現できます。ご存知でしたらすみません。

=row() または、=row()-1など

これらと不足分の固定値を結合して、上述のrenameコマンドの文字列を作成してもらえれば、あとはテキストファイルに貼り付けます。
テキストファイルの拡張子を.batに書き換え、pdfファイルと同じ場所に置いたのち、ダブルクリックすればいけると思います。

文章にしたら長くなってしまいましたが、VBAよりはだいぶ簡単に実現できると思います。

一応調べていますが、バッチは暫く触っていなかったので不備がありましたら申し訳ありません。
    • good
    • 0

(決まった文字列1)


とありますが両端のカッコは説明上の為で、実際にはないと考えて良いでしょうか。
    • good
    • 0
この回答へのお礼

カッコは説明上の為で、実際にはありません。

お礼日時:2020/11/18 09:34

こんにちは



>これを機にスキルを磨いていきたいと考えております。
では、早速磨きましょう。

前回のご質問は見ておりませんが、方法の説明はいろいろと回答されているようなので、それを実現すればよさそう。
全部作ってもらって、コピペするのが「スキルを磨く」ことになるとは到底思えません。
    • good
    • 0
この回答へのお礼

そうですね。。仰る通りですよね。

お礼日時:2020/11/18 09:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています