Sub test()
Dim myDir$, x, myList(), i&, msg$
myDir = CreateObject("WScript.Shell").SpecialFolders("desktop") & "\ABSI"
x = SearchFiles(myDir, "* *.*", 0, myList, myDir)
If IsEmpty(x) Then MsgBox "No file found": Exit Sub
For i = 1 To UBound(x, 2)
If myList(1, i) <> myList(2, i) Then
If Not IsFileOpen(x(1, i)) Then
Call CheckFolder(x(2, i))
Name x(1, i) As x(2, i)
Else
msg = msg & vbLf & x(1, i)
End If
End If
Next
If Len(msg) Then MsgBox "Follwing file(s) is/are currently in use", vbInformation, "Try later"
End Sub
Function SearchFiles(fPath$, myFileName$, n&, myList(), myDir) As Variant
Dim fso As Object, myFolder As Object, myFile As Object
Set fso = CreateObject("Scripting.FileSystemObject")
For Each myFile In fso.GetFolder(fPath).Files
If (Not myFile.Name Like "~$*") * (myFile.Name <> ThisWorkbook.Name) _
* (myFile.Name Like myFileName) Then
n = n + 1
ReDim Preserve myList(1 To 2, 1 To n)
myList(1, n) = myFile.Path
myList(2, n) = Join(Array(myDir, "YEAR_" & Year(myFile.DateLastModified), _
Split(fso.GetBaseName(myFile.Name))(0), "EXTRACTION_" & _
Choose(Month(myFile.DateLastModified), _
"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", _
"DEC"), myFile.Name), "\")
End If
Next
For Each myFolder In fso.GetFolder(fPath).SubFolders
SearchFiles = SearchFiles(myFolder.Path, myFileName, n, myList, myDir)
Next
SearchFiles = myList
End Function
Function IsFileOpen(ByVal fName$) As Boolean
Dim ff&, errNum&
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
Function CheckFolder(ByVal x)
Dim i&, f$
x = Split(x, "\")
For i = 0 To UBound(x) - 1
f = f & IIf(f = "", "", "\") & x(i)
If Dir(f & "\", vbDirectory) = "" Then MkDir f
Next
End Function