一、背景
工作中经常会遇到这种情况:
一批 PDF 文件需要统一修改名称
比如把
BYD批量改成TES文件一多,手动修改不仅慢,还容易出错
这种重复性操作,其实非常适合用 VBA 来解决。
二、工具说明

核心只需要填 3 个参数:
文件夹路径
旧字符串
新字符串
点击按钮,即可完成批量重命名。
执行结果会自动统计:
成功数量(Renamed)
跳过数量(Skipped)
失败数量(Failed)
Option ExplicitSub RefreshPDF_files()Dim folderPath As StringDim oldString As StringDim newString As StringDim fileName As StringDim newFileName As StringDim filePath As StringDim newFilePath As StringDim fso As ObjectDim folder As ObjectDim file As ObjectDim processCount As IntegerDim skipCount As IntegerDim failCount As IntegerDim wt As WorksheetDim errMsg As StringOn Error GoTo ErrorHandler' 设置工作表On Error Resume NextSet wt = ThisWorkbook.Worksheets("RenamePDF")On Error GoTo 0If wt Is Nothing ThenMsgBox "Worksheet 'RenamePDF' not found!", vbCritical, "Error"Exit SubEnd If' 读取参数folderPath = Trim(wt.Range("B2").Value)oldString = Trim(wt.Range("B4").Value)newString = Trim(wt.Range("B6").Value)' 检查新旧字符串相同If oldString = newString ThenMsgBox "Old and new strings are the same, no change needed.", vbInformation, "Notice"GoTo CleanUpEnd If' 检查文件夹路径Set fso = CreateObject("Scripting.FileSystemObject")If Not fso.folderExists(folderPath) ThenMsgBox "Folder does not exist, pls check!" & vbCrLf & "Path: " & folderPath, vbExclamation, "Error"GoTo CleanUpEnd If' 检查字符串为空If oldString = "" Or newString = "" ThenMsgBox "String is empty, pls check!", vbExclamation, "Error"GoTo CleanUpEnd If' 遍历处理PDF文件Set folder = fso.GetFolder(folderPath)processCount = 0skipCount = 0failCount = 0For Each file In folder.FilesfileName = file.NamefilePath = file.PathIf LCase(fso.GetExtensionName(fileName)) = "pdf" ThenIf InStr(fileName, oldString) > 0 ThennewFileName = Replace(fileName, oldString, newString)newFilePath = fso.BuildPath(folderPath, newFileName)If fso.FileExists(newFilePath) ThenskipCount = skipCount + 1Else' 重命名(带错误处理)On Error Resume Nextfso.MoveFile filePath, newFilePathIf Err.Number <> 0 ThenfailCount = failCount + 1errMsg = errMsg & fileName & ": " & Err.Description & vbCrLfErr.ClearElseprocessCount = processCount + 1End IfOn Error GoTo 0End IfEnd IfEnd IfNext file' 输出结果wt.Range("B10").Value = processCountwt.Range("B11").Value = skipCountwt.Range("B12").Value = failCountwt.Range("B13").Value = Now' 完成提示MsgBox "Done!" & vbCrLf & _"Renamed: " & processCount & " files" & vbCrLf & _"Skipped: " & skipCount & " files" & vbCrLf & _"Failed: " & failCount & " files" & IIf(errMsg <> "", vbCrLf & vbCrLf & "Failed details:" & vbCrLf & errMsg, ""), _vbInformation, "Complete"GoTo CleanUpErrorHandler:MsgBox "An error occurred: " & Err.Number & " - " & Err.Description, vbCritical, "Error"CleanUp:Set file = NothingSet folder = NothingSet fso = NothingSet wt = NothingEnd Sub
三、核心思路
这段代码本质就做了三件事:
1️⃣ 遍历文件夹
通过 FileSystemObject 获取目录下所有文件
2️⃣ 筛选 + 替换
只处理 PDF 文件,并对文件名进行字符串替换
3️⃣ 安全控制
已存在文件 → 跳过(防覆盖)
出错文件 → 记录原因
最终输出统计结果
四、两个实用细节
✔ 是否区分大小写
默认是区分的:
InStr(fileName, oldString)如果希望不区分大小写,可以改成:
InStr(1, fileName, oldString, vbTextCompare)✔ Replace 也要注意
Replace(fileName, oldString, newString)👉 默认也是区分大小写的
如果希望不区分大小写,可以改成:
Replace(fileName, oldString, newString, , , vbTextCompare)五、小结
这个小工具解决的是一个典型问题:
👉 用代码替代重复劳动
夜雨聆风