我尝试重命名“Joe BLOGGS_3052023.pdf”或“Joe BLOGGS_31052023.pdf”形式的一组 pdf 文件名(因此“FirstName SURNAME_dmmyy”或“FirstName SURNAME_ddmmyy”)失败。因此,如果日期是单个数字,则它比两位数字日期少一个字符。我需要文件名的输出为:
乔 BLOGGS_20230503.pdf 或乔 BLOGGS_20230531.pdf
我就是听不懂。我觉得我还是有一些问题!
任何人都可以帮助解决该模式,甚至是他们喜欢的完整代码吗?
干杯, 瓦兹
Sub test()
Dim myDir As String
myDir = "e:\Test\"
If Dir(myDir, vbDirectory) = "" Then
MsgBox "Folder not found"
Exit Sub
End If
SeachFiles myDir, "*.pdf"
End Sub
Private Sub SeachFiles(myDir, fn)
Dim fso As Object, myFolder As Object, myFile As Object
Dim temp As String, m As Object, NewName As String, OldName As String
Set fso = CreateObject("Scripting.FileSystemObject")
With CreateObject("VBScript.RegExp")
.Pattern = "(?:\D)(\d{1,2})(\d{1,2})(\d{4})(?:\D)"
.ignorecase = True
For Each myFile In fso.getfolder(myDir).Files
If myFile.Name Like fn Then
If .test(myFile.Name) Then
If Not IsFileOpen(myDir & "\" & myFile.Name) Then
Set m = .Execute(myFile.Name)(0)
temp = Format$(DateValue(m.submatches(2) & "/" & _
m.submatches(0) & "/" & m.submatches(1)), "yyyymmdd")
NewName = myDir & "\" & Application.Replace(myFile.Name, _
m.firstindex + 2, m.Length - 1, temp)
OldName = myDir & "\" & myFile.Name
Name OldName As NewName
Else
MsgBox "Can not process " & myFile.Name & _
vbLf & "Currently open"
End If
End If
End If
Next
For Each myFolder In fso.getfolder(myDir).subfolders
SeachFiles myFolder.Path, fn
Next
End With
End Sub
Function IsFileOpen(fName As String) As Boolean
Dim ff As Integer, errNum As Integer
On Error Resume Next
ff = FreeFile
Open fName For Input Lock Read As #ff
Close ff
errNum = Err
On Error GoTo 0
IsFileOpen = (errNum <> 0)
End Function
在提高您的 VBA 技能的同时,我可以暂时建议一下,该任务更适合像这样的批处理文件
@echo off
cd /d "e:\test"
SETLOCAL ENABLEDELAYEDEXPANSION
for %%f in (*.pdf) do (
set "$OldName=%%f"
set "$y=!$OldName:~-8,-4!"
set "test=!$OldName:~-12,-11!"
if !test!==_ (
set "$mmdd=0!$OldName:~-9,-8!!$OldName:~-11,-9!"
) else (
set "$mmdd=!$OldName:~-10,-8!!$OldName:~-12,-10!"
)
echo ren "%%f" "!$OldName:~0,-12!_!$y!!$mmdd!.pdf"
)
cd /d %~dp0