
先日質問させていただきましたが、解決済みにしてしまったので再度質問としてあげさせていただきます。
前回回答していただいた方々の回答を参考にはさせていただきましたがまだ実現できておりません。
時間があればじっくりマクロ等勉強してしてわからないときに質問しようと思いましたがあまり時間がありません。
やりたいことは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コマンドの形式で文字列を組み立てて、
その文字列をファイルに出力して、バッチファイルとして実行するのが、一番簡単で安全確実な方法だと思います」
といった回答も頂いているのでこちらの方法をまずはやってみようと思っています。
そこで、具体的にどうすればこの処理を実現できるのかご教授頂きたく存じます。
内容としてはもっと突き詰めてから質問しろと思われるということは重々承知ですが、
経験上このようなスキルが全くといっていいほどなく、これを機にスキルを磨いていきたいと考えております。
何卒、宜しくお願い致します。

No.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
No.8
- 回答日時:
リネーム結果を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
いえ、もしE列に出力した方がベターということであれば手段の条件はありません。わざわざコードありがとうございます。試行してみます。助かります。
No.6
- 回答日時:
もし、添付図のようなセルの内容だとして、
決まった文字列1=STR1
決まった文字列2=STR2
決まった文字列3=STR3
の場合
1行目のデータに対応する
変更前のPDFファイル名=CCCDDDSTR3.pdf
変更後のPDFファイル名=STR2AAA-BBB_STR3_1_CCCDDD.pdf
であっていますか。

No.5
- 回答日時:
#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
を書き加えてください。
判り難いかも、、すみません。
No.4
- 回答日時:
こんばんは、
>その文字列をファイルに出力して、バッチファイルとして実行するのが、一番簡単で安全確実な方法だと思います」
そうかもしれませんが、
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
わざわざ具体例まで記載いただきありがとうございます。
正直ぱっと見処理内容は全くと言っていいほど理解できませんが、読み解けるよう調べて参考にさせていただきます。
学習に関しては仰る通りですよね。すみません。

No.3
- 回答日時:
先の質問が分からないため、これ!という回答が出来ませんが、ご了承下さい。
件のアドバイスについてですが、恐らくエクセル側で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よりはだいぶ簡単に実現できると思います。
一応調べていますが、バッチは暫く触っていなかったので不備がありましたら申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) tatsumaru77様 昨日回答して頂いたものです。 すみませんが、昨日の質問で1つ補足があります 1 2022/05/15 15:06
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける (再質問) 4 2022/09/14 22:51
- Visual Basic(VBA) 複数ファイルのデータの統合について 12 2022/05/14 12:03
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) VBA 「,」・空白・カタカナ等の複数条件のマクロ 2 2023/08/23 11:57
- フリーソフト フォルダ、ファイル名の一括変換について 3 2023/03/16 09:23
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Excel(エクセル) 名前と日付が一致する箇所にフラグを立てる関数が知りたいです 4 2022/08/11 02:24
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
テキストエディタで複数行にわ...
-
inputboxのことで質問です!
-
VBA2005 16進を2桁で表示したい。
-
VBAでの Replace関数で、ワイル...
-
エクセルで文字列の右から4文字...
-
テーブル展開について
-
パスワードを暗号化して保存
-
Excelで3E8を3.00E+8にしない方...
-
アドレスでの参照の仕方
-
文字列からカンマを取り除きたい
-
SQL の Update文(?) と ...
-
エクセルで文字列の最大値を抽...
-
ORCLEでの小数の表示方法の変更...
-
エクセルでセル内の文字列の最...
-
VBの「As String * 128」とは?
-
【Excel VBA】複数ある特定の文...
-
Msgboxの×が押されたとき
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
エクセルで文字列をtxtファイル...
-
【Excel VBA】複数ある特定の文...
-
エクセル 数値データを桁をそ...
-
Excelで3E8を3.00E+8にしない方...
-
VBA2005 16進を2桁で表示したい。
-
エクセルで文字列の最大値を抽...
-
同一セル内に関数と文字列を同...
-
Left関数とRight関数を合わせた...
-
Excelで指数表現しないようにす...
-
MS SQLServer のSQLで文字列の...
-
VBの「As String * 128」とは?
-
エクセルでセル内の文字列の最...
-
ORCLEでの小数の表示方法の変更...
-
bashスクリプトでの文字列から...
-
LEFT関数で文字数を指定しない...
-
アクセスで特定の数字以外(複...
おすすめ情報