Мы получаем файлы Word, содержащие трехбуквенный код страны ISO в виде строки в имени файла. Мы хотим переместить эти файлы из папки хранения в существующую папку для каждой страны, названную по имени страны.
Я ходил кругами, пытаясь заставить InStr
работать. InStr
предпочтительнее, так как положение строки в имени файла может меняться.
Может ли кто-нибудь посоветовать, что не так с моим кодом? Запускается, но ничего не делает.
Также есть много файлов стран (60+ кодов ISO). Есть ли более умный метод, чем For Each
и ElseIf
?
Большое спасибо!
Sub MoveFiles_SpecificFolders()
Dim SrepFSO As FileSystemObject
Dim Srep As File
Dim HldFolder As Folder
Dim HoldingFolder As String
Dim TargetFolder As String
Dim Fname As String
Fname = (HoldingFolder & "*.doc*")
HoldingFolder = "C:\Users\Temp\Test\"
TargetFolder = "C:\Users\DifferentPath\MSfolders\"
Set SrepFSO = New Scripting.FileSystemObject
Set HldFolder = SrepFSO.GetFolder(HoldingFolder)
For Each Srep In HldFolder.Files
If InStr(Fname, "ALB") <> 0 Then
SrepFSO.MoveFile Source:=SrepFSO.GetFile(Srep), _
Destination:=TargetFolder & "Albania\" & Srep.Name
ElseIf InStr(Fname, "AND") <> 0 Then
SrepFSO.MoveFile Source:=SrepFSO.GetFile(Srep), _
Destination:=DestinationFolder & "Andorra\" & Srep.Name
ElseIf InStr(Fname, "ARM") <> 0 Then
SrepFSO.MoveFile Source:=SrepFSO.GetFile(Srep), _
Destination:=DestinationFolder & "Armenia\" & Srep.Name
End If
Next Srep
End Sub
Я бы разбил на подзадачи. Создайте словарь, в котором трехбуквенный код будет ключом, а имя папки будет значением. Затем в одном цикле извлеките код, получите имя папки из словаря и переместите файл.
Спасибо @Kostas K, это должно быть следующим шагом, когда мой простой код работает!
Следуя вашему коду следующим образом:
Dim HoldingFolder As String
Dim TargetFolder As String
Dim Fname As String
Fname = (HoldingFolder & "*.doc*")
HoldingFolder = "C:\Users\Temp\Test\"
Переменная Fname
не содержит части HoldingFolder
. Переменная HoldingFolder
должна быть назначена до ссылки:
Dim HoldingFolder As String
Dim TargetFolder As String
Dim Fname As String
HoldingFolder = "C:\Users\Temp\Test\"
Fname = (HoldingFolder & "*.doc*")
Позже в цикле For-Each вы увидите здесь проблему:
If InStr(Fname, "ALB") <> 0 Then
-> Так и должно быть If InStr(Srep, "ALB") <> 0 Then
Но следующая проблема заключается в том, что Fname
никогда не изменяется и не используется после присваивания. ОП должен использовать Srep
.
@BigBen - нужно проверить, воспроизвести все это, но я думаю, вы правы. Во всяком случае, я вижу, что это используется здесь - If InStr(Fname, "ALB")
. И я думаю, что это должно быть Srep
вместо Fname
...
Супер спасибо ребята! Это работает с Srep
... когда я использую последовательный путь. Очень признателен!
Исправлен код с благодарностью @BigBen и @Vityata.
Sub MoveFiles_SpecificFolders()
Dim SrepFSO As FileSystemObject
Dim Srep As File
Dim fso As New FileSystemObject
Dim HldFolder As Folder
Dim HoldingFolder As String
Dim TargetFolder As String
HoldingFolder = "C:\Users\xyz\Test_docs\"
TargetFolder = "C:\Users\xyz\MSfolders\"
Set fso = CreateObject("Scripting.FileSystemObject")
Set SrepFSO = New Scripting.FileSystemObject
Set HldFolder = SrepFSO.GetFolder(HoldingFolder)
For Each Srep In HldFolder.Files
If InStr(Srep, "ALB") <> 0 Then
SrepFSO.MoveFile Source:=SrepFSO.GetFile(Srep), _
Destination:=TargetFolder & "Albania\" & Srep.Name
ElseIf InStr(Srep, "AND") <> 0 Then
SrepFSO.MoveFile Source:=SrepFSO.GetFile(Srep), _
Destination:=TargetFolder & "Andorra\" & Srep.Name
ElseIf InStr(Srep, "ARM") <> 0 Then
SrepFSO.MoveFile Source:=SrepFSO.GetFile(Srep), _
Destination:=TargetFolder & "Armenia\" & Srep.Name
ElseIf InStr(Srep, "GEO") <> 0 Then
SrepFSO.MoveFile Source:=SrepFSO.GetFile(Srep), _
Destination:=TargetFolder & "Georgia\" & Srep.Name
End If
Next Srep
End Sub
Доработанная версия макроса в ссылке . Макрос изменен, чтобы избежать использования нескольких операторов ElseIf
.
Fname = (HoldingFolder & "*.doc*")
- это просто означает, чтоFname
есть"*doc*"
- ни одна из вашихInStr
строк никогда не будет оценена как истина.