Макрос VBA для поиска PDF-файла и копирования в папку

#excel #vba

Вопрос:

В таблице Excel у меня есть 10 имен файлов, таких как:

тест1, тест2, тест3

Все файлы являются PDF-файлами. Затем мне нужно найти эти файлы в папке. Если бы я нашел test1 по пути C:UsersSOURCE затем я беру это и копирую в папку на рабочем столе C:UsersDestination.

Но ничего не происходит, он не копировал файлы из папки «источник» — > «назначение».

 Sub copyFile()
  Dim objFSO As Object
  Dim strFileToCopy, strOldPath As String, strNewPath As String
  
  strOldPath = "C:UsersSOURCE" 'Verzeichnis in dem die Datei liegt
  strNewPath = "C:UsersDestination" 'Verzeichnis in welches kopiert werden soll
  
  With ActiveSheet
    strFileToCopy = .Range("A1") 'Zelle mit dem Namen
    strFileToCopy = strFileToCopy amp; ".pdf" 'Suffix anhängen
    If Dir(strOldPath amp; strFileToCopy, vbNormal) <> "" Then
      Set objFSO = CreateObject("Scripting.FileSystemObject")
      objFSO.copyFile strOldPath amp; strFileToCopy, strNewPath amp; strFileToCopy
    End If
  End With
  
  Set objFSO = Nothing
End Sub
 

Я очень благодарен за каждую помощь. Большое спасибо!

Дополнительная информация: значение в A1 равно test1 файл pdf в исходном пути-test1.pdf

Комментарии:

1. Вы пробовали пройти через него, пока он работает, чтобы увидеть каждое принятое им решение? Является ли проблема If утверждением?

2. Вы проверили strOldPath amp; strFileToCopy , возвращает ли он правильный путь? похоже, у вас отсутствует косая черта, так что это должно быть strOldPath amp; "" amp; strFileToCopy

3. Уважаемый @Raymond Wu, значение в A1 = test1.pdf и имя файла в исходной папке также «test1.pdf». После того, как я изменил код на «strOldPath amp;» «amp; strFileToCopy», я получаю сообщение об ошибке «ошибка выполнения 53, файл не найден». Я проверил путь, это правильный путь.

4. @braX да, похоже, что код vba не выполняет эту строку кода: <код>Set objFSO = CreateObject(«Сценарии. FileSystemObject») objFSO.CopyFile strOldPath и strFileToCopy, strNewPath и strFileToCopy </код>

Ответ №1:

Не объединяйте путь вручную. Вместо этого используйте FileSystemObject (только для Windows) методы.

 Dim objFSO As Object, OldPath As String
...
Set objFSO = CreateObject("Scripting.FileSystemObject")
OldPath = objFSO.BuildPath(strOldPath, strFileToCopy)
If objFSO.FileExists(OldPath) Then
  objFSO.copyFile OldPath, objFSO.BuildPath(strNewPath, strFileToCopy)
End If
...
 

Комментарии:

1. большое вам спасибо за ваш подход!! Это решило именно мою проблему. Не могли бы вы немного объяснить мне, почему этот метод работает? Я хочу учиться и совершенствовать свои навыки VBA.

2. но если инструмент не нашел файл, как я могу сообщить excel, что он должен скопировать отсутствующие файлы на новую вкладку?

3. FileSystemObject.BuildPath метод всегда возвращает допустимый путь к файлу для указанной папки и пути. Также FileSystemObject.FileExists лучше, чем Dir для путей, отличных от ASCII. docs.microsoft.com/en-us/office/vba/language/reference/…

4. спасибо за вашу помощь. как я могу справиться с этим, если у меня много папок, в которых мне нужно искать?

5. Вы можете поместить список папок в массив или коллекцию и выполнять поиск в цикле