VBA перемещает файлы на основе строки в имени файла

Мы получаем файлы 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
Fname = (HoldingFolder & "*.doc*") - это просто означает, что Fname есть "*doc*" - ни одна из ваших InStr строк никогда не будет оценена как истина.
BigBen 18.12.2020 16:46

Я бы разбил на подзадачи. Создайте словарь, в котором трехбуквенный код будет ключом, а имя папки будет значением. Затем в одном цикле извлеките код, получите имя папки из словаря и переместите файл.

Kostas K. 18.12.2020 16:57

Спасибо @Kostas K, это должно быть следующим шагом, когда мой простой код работает!

cdfj 18.12.2020 18:43
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
3
1 213
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Следуя вашему коду следующим образом:

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 18.12.2020 16:53

@BigBen - нужно проверить, воспроизвести все это, но я думаю, вы правы. Во всяком случае, я вижу, что это используется здесь - If InStr(Fname, "ALB"). И я думаю, что это должно быть Srep вместо Fname...

Vityata 18.12.2020 16:58

Супер спасибо ребята! Это работает с Srep... когда я использую последовательный путь. Очень признателен!

cdfj 18.12.2020 17:40
Ответ принят как подходящий

Исправлен код с благодарностью @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.

cdfj 23.12.2020 15:33

Другие вопросы по теме