Макрос для копирования файла excel

Копирование и перемещение файлов в VBA Excel с помощью методов CopyFile и MoveFile объекта FileSystemObject. Синтаксис, параметры, примеры.

Копирование файлов

Метод CopyFile

CopyFile – это метод объекта FileSystemObject, который копирует один или несколько файлов из одного расположения в другое.

Синтаксис

object.CopyFile source, destination, [overwrite]

Параметры

Параметр Описание
object Переменная, возвращающая объект FileSystemObject. Обязательный параметр.
source Строковое выражение, задающее полное имя файла, который требуется скопировать в другое расположение. Для копирования нескольких файлов используются подстановочные знаки. Обязательный параметр.
destination Строковое выражение, задающее конечное расположение, куда требуется скопировать файл (файлы) из элемента source. Подстановочные знаки не допускаются. Обязательный параметр.
overwrite Логическое значение, которое указывает, требуется ли перезаписывать существующие файлы в конечном расположении. True – файлы будут перезаписаны, False – перезапись не выполняется. Необязательный параметр, по умолчанию – True.

Если копируемый файл с полным именем source не существует, будет сгенерирована ошибка.

При копировании одного файла методом CopyFile допустимо в параметре destination указать другое собственное имя файла, тогда скопированный файл будет сохранен под новым именем. В том числе, можно изменить и расширение файла.

Примеры

Пример 1
Копирование одного файла в другое расположение с проверкой его существования:

Sub Primer1()

Dim fso As Object

‘Присваиваем переменной fso ссылку

‘на новый экземпляр FileSystemObject

Set fso = CreateObject(«Scripting.FileSystemObject»)

    ‘Проверяем существование копируемого файла

    If Dir(«C:Папка 1test1.txt») <> «» Then

        ‘Если файл существует, копируем его в другую папку

        fso.CopyFile «C:Папка 1test1.txt», «C:Папка 2«

    End If

End Sub

Пример 2
Наглядный, но неправильный пример по копированию одного файла в другую папку со сменой собственного имени, включая расширение:

Sub Primer2()

Dim fso As Object

Set fso = CreateObject(«Scripting.FileSystemObject»)

    If Dir(«C:Папка 1test1.txt») <> «» Then

        ‘Копируем файл в другую папку со сменой имени, включая расширение

        fso.CopyFile «C:Папка 1test1.txt», «C:Папка 2test2.xlsx»

    End If

End Sub

Пример назван неправильным, так как у скопированного файла меняется только расширение с .txt на .xlsx без конвертации в другой формат. На самом деле файл так и остается текстовым, и открыть его программой Excel невозможно.

Перемещение файлов

Метод MoveFile

MoveFile – это метод объекта FileSystemObject, который перемещает один или несколько файлов из одного расположения в другое.

Синтаксис

object.MoveFile source, destination

Параметры

Параметр Описание
object Переменная, возвращающая объект FileSystemObject. Обязательный параметр.
source Строковое выражение, задающее полное имя файла, который требуется переместить в другое расположение. Для перемещения нескольких файлов используются подстановочные знаки. Обязательный параметр.
destination Строковое выражение, задающее конечное расположение, куда требуется переместить файл (файлы) из элемента source. Подстановочные знаки не допускаются. Обязательный параметр.

Если перемещаемый файл с полным именем source не существует, будет сгенерирована ошибка. Ошибка произойдет и в том случае, если одноименный файл в расположении destination уже имеется.

Примеры

Пример 3
Перемещение одного файла без проверки его существования:

Sub Primer3()

Dim fso As Object

‘Присваиваем переменной fso ссылку

‘на новый экземпляр FileSystemObject

Set fso = CreateObject(«Scripting.FileSystemObject»)

‘Завершаем программу, если произойдет ошибка

On Error Resume Next

‘Перемещаем файл в другую папку

fso.MoveFile «C:Папка 1Документ 1.docx», «C:Папка 2«

End Sub

Обработчик ошибок On Error Resume Next необходим для того, чтобы корректно завершить программу, если перемещаемый файл не существует, или он уже есть в папке назначения, в результате чего будет сгенерирована ошибка.

Пример 4
Перемещение нескольких файлов из одного расположения в другое:

Sub Primer4()

Dim fso As Object

Set fso = CreateObject(«Scripting.FileSystemObject»)

On Error Resume Next

‘Перемещаем файлы в другую папку

fso.MoveFile «C:Папка 1Документ*», «C:Папка 2«

End Sub

В результате работы этого кода VBA Excel в новое расположение будут перемещены все файлы начинающиеся с подстроки «Документ».

Знаки подстановки

  • Звездочка (*) – заменяет любое количество символов или ни одного.
  • Вопросительный знак (?) – заменяет один символ или ни одного.

Знаки подстановки позволяют создать шаблон, по которому можно скопировать или переместить сразу несколько файлов.

Примеры

Примеры шаблонов с подстановочными знаками:

Все файлы Word, включая файлы с расширениями .doc и .dot:
"C:Папка 1*.do??"

Файлы Word, кроме файлов с расширениями .dot, .dotx и .dotm:
"C:Папка 1*.doc?"

Все файлы с подстрокой «01.2020» в собственном имени:
"C:Папка 1*01.2020*"

Хитрости »

15 Август 2012              129964 просмотров


В этой статье я хотел бы рассказать как средствами VBA переименовать, переместить или скопировать файл. В принципе методы переименования, перемещения и копирования, так сказать, встроены в VBA. Это значит что можно без вызова сторонних объектов переименовать, переместить или копировать любой файл. Все это делается при помощи всего двух команд: FileCopy и Name [Исходный файл] As [Новый файл]. Притом команда FileCopy выполняет только копирование, а Name [Исходный файл] As [Новый файл] — как переименование, так и перемещение. Разница лишь в том, что при переименовании мы указываем только новое имя файла, а при перемещении — другую директорию(папку), в которую следует переместить файл. Плюс рассмотрим пример удаления файла.
Так же разберем методы копирования, перемещения, переименования и удаления файлов и папок через библиотеку FileSystemObject (FSO).

Работа с файлами встроенными командами VBA

  • Копирование файла
  • Перемещение файла
  • Переименование файла
  • Удаление файла

Работа с файлами через объект FileSystemObject (FSO)

  • Копирование файла
  • Перемещение файла
  • Переименование файла
  • Удаление файла

Работа с папками через объект FileSystemObject (FSO)

  • Копирование папки
  • Перемещение папки
  • Переименование папки
  • Удаление папки

Во всех примерах работы с файлами встроенными функциями будет присутствовать проверка на наличие файла по указанному пути. Делать это будем при помощи встроенной функции Dir([PathName],[Attributes]).
PathName — указывается полный путь к файлу
Attributes — указывается признак свойств файла. Вообще их несколько(скрытый, архивный и т.п.), но нас для наших задач будет интересовать пока только один: 16(vbDirectory). Он отвечает за проверку папок и файлов без специальных свойств(т.е. не архивные, не скрытые и т.д.). Хотя по сути его можно вообще не указывать, и тогда будет по умолчанию применен атрибут 0(vbNormal) — проверка файлов без определенных свойств. Ни в том ни в другом случае ошибкой это не будет.

Sub Copy_File()
    Dim sFileName As String, sNewFileName As String
 
    sFileName = "C:WWW.xls"    'имя файла для копирования
    sNewFileName = "D:WWW.xls"    'имя копируемого файла. Директория(в данном случае диск D) должна существовать
    If Dir(sFileName, 16) = "" Then 
        MsgBox "Нет такого файла", vbCritical, "www.excel-vba.ru"
        Exit Sub
    End If
 
    FileCopy sFileName, sNewFileName 'копируем файл
    MsgBox "Файл скопирован", vbInformation, "www.excel-vba.ru"
End Sub
Sub Move_File()
    Dim sFileName As String, sNewFileName As String
 
    sFileName = "C:WWW.xls"    'имя исходного файла
    sNewFileName = "D:WWW.xls"    'имя файла для перемещения. Директория(в данном случае диск D) должна существовать
    If Dir(sFileName, 16) = "" Then 
        MsgBox "Нет такого файла", vbCritical, "www.excel-vba.ru"
        Exit Sub
    End If
 
    Name sFileName As sNewFileName 'перемещаем файл
    MsgBox "Файл перемещен", vbInformation, "www.excel-vba.ru"
End Sub
Sub Rename_File()
    Dim sFileName As String, sNewFileName As String
 
    sFileName = "C:WWW.xls"    'имя исходного файла
    sNewFileName = "C:WWW1.xls"    'имя файла для переименования
    If Dir(sFileName, 16) = "" Then 
        MsgBox "Нет такого файла", vbCritical, "www.excel-vba.ru"
        Exit Sub
    End If
 
    Name sFileName As sNewFileName 'переименовываем файл
 
    MsgBox "Файл переименован", vbInformation, "www.excel-vba.ru"
End Sub
Sub Delete_File()
    Dim sFileName As String
 
    sFileName = "C:WWW.xls"    'имя файла для удаления
 
    If Dir(sFileName, 16) = "" Then 
        MsgBox "Нет такого файла", vbCritical, "www.excel-vba.ru"
        Exit Sub
    End If
    Kill sFileName 'удаляем файл
    MsgBox "Файл удален", vbInformation, "www.excel-vba.ru"
End Sub

Как видно ничего сложного.


Так же можно проделать те же операции с файлами при помощи объекта FileSystemObject. Строк кода несколько больше и выполняться операции будут медленнее(хотя вряд ли это будет заметно на примере одного файла). Однако есть существенный плюс — при помощи FileSystemObject можно корректно производить операции с файлами и папками на сетевом диске. Хотя та же

Dir(sFileName, 16)

часто выдает ошибку при работе с сетевыми дисками.
Прежде всего следует, я думаю, пояснить что за зверь такой — FileSystemObject.

FileSystemObject (FSO)

— содержится в библиотеке типов Scripting, расположенной в файле библиотеки scrrun.dll. Объектная модель FSO дает возможность создавать, изменять, перемещать и удалять папки и файлы, собирать о них различную информацию: имена, атрибуты, даты создания или изменения и т.д. Чтобы работать с FSO необходимо создать переменную со ссылкой на объект библиотеки. Сделать это можно двумя способами: через ранее связывание и позднее. Я не буду сейчас вдаваться в подробности этих методов — тема довольно обширная и я опишу её в другой статье.

Ранее связывание:

для начала необходимо подключить библиотеку Microsoft Scripting Runtime. Делается это в редакторе VBA: References-находите там Microsoft Scripting Runtime и подключаете. Объявлять переменную FSO при раннем связывании следует так:

Dim objFSO As New FileSystemObject

Плюсы раннего связывания: с помощью Object Browser можно просмотреть список объектов, свойств, методов, событий и констант, включенных в FSO. Но есть значительный минус: если планируется использовать программу на нескольких компьютерах, то есть большая вероятность получить ошибку(читать подробнее).
Позднее связывание: ничего нигде не надо подключать, а просто используем метод CreateObject(именно этот способ используется мной в примерах ниже). Методы таким образом просмотреть не получится, но зато работать будет без проблем на любых компьютерах без дополнительных действий.

Sub Copy_File()
    Dim objFSO As Object, objFile As Object
    Dim sFileName As String, sNewFileName As String
 
    sFileName = "C:WWW.xls"    'имя исходного файла
    sNewFileName = "D:WWW.xls"    'имя файла для переименования
    'создаем объект FileSystemObject
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    'проверяем наличие файла по указанному пути
    If objFSO.FileExists(sFileName) = False Then 
        MsgBox "Нет такого файла", vbCritical, "www.excel-vba.ru"
        Exit Sub
    End If
    'копируем файл
    Set objFile = objFSO.GetFile(sFileName)
    objFile.Copy sNewFileName
 
    MsgBox "Файл скопирован", vbInformation, "www.excel-vba.ru"
End Sub
Sub Move_File()
    Dim objFSO As Object, objFile As Object
    Dim sFileName As String, sNewFileName As String
 
    sFileName = "C:WWW.xls"    'имя исходного файла
    sNewFileName = "D:WWW.xls"    'имя файла для переименования
    'создаем объект FileSystemObject    
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    'проверяем наличие файла по указанному пути
    If objFSO.FileExists(sFileName) = False Then 
        MsgBox "Нет такого файла", vbCritical, "www.excel-vba.ru"
        Exit Sub
    End If
    'перемещаем файл
    Set objFile = objFSO.GetFile(sFileName)
    objFile.Move sNewFileName
    MsgBox "Файл перемещен", vbInformation, "www.excel-vba.ru"
End Sub
Sub Rename_File()
    Dim objFSO As Object, objFile As Object
    Dim sFileName As String, sNewFileName As String
 
    sFileName = "C:WWW.xls"    'имя исходного файла
    sNewFileName = "WWW1.xls"    'имя файла для переименования
    'создаем объект FileSystemObject    
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    'проверяем наличие файла по указанному пути
    If objFSO.FileExists(sFileName) = False Then 
        MsgBox "Нет такого файла", vbCritical, "www.excel-vba.ru"
        Exit Sub
    End If
    'переименовываем файл
    Set objFile = objFSO.GetFile(sFileName)
    objFile.Name = sNewFileName
    MsgBox "Файл переименован", vbInformation, "www.excel-vba.ru"
End Sub

Хочу обратить внимание, что при переименовании файла через FileSystemObject необходимо указать только имя нового файла — путь указывать не надо. Иначе получите ошибку.

Удаление файла

Sub Delete_File()
    Dim objFSO As Object, objFile As Object
    Dim sFileName As String
 
    sFileName = "C:WWW.xls"    'имя файла для удаления
    'создаем объект FileSystemObject    
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    'проверяем наличие файла по указанному пути
    If objFSO.FileExists(sFileName) = False Then 
        MsgBox "Нет такого файла", vbCritical, "www.excel-vba.ru"
        Exit Sub
    End If
    'удаляем файл
    Set objFile = objFSO.GetFile(sFileName)
    objFile.Delete
    MsgBox "Файл удален", vbInformation, "www.excel-vba.ru"
End Sub

 

Точно так же можно перемещать, копировать и удалять целые папки:

Копирование папки

Sub Copy_Folder()
    Dim objFSO As Object
    Dim sFolderName As String, sNewFolderName As String
 
    sFolderName = "C:test"        'имя исходной папки
    sNewFolderName = "D:tmp"     'имя папки, в которую копируем(нужен слеш на конце)
    'создаем объект FileSystemObject    
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    'проверяем наличие папки по указанному пути
    If objFSO.FolderExists(sFolderName) = False Then 
        MsgBox "Нет такой папки", vbCritical, "www.excel-vba.ru"
        Exit Sub
    End If
    'копируем папку
    objFSO.CopyFolder sFolderName, sNewFolderName
 
    MsgBox "Папка скопирована", vbInformation, "www.excel-vba.ru"
End Sub
Sub Move_Folder()
    Dim objFSO As Object
    Dim sFolderName As String, sNewFolderName As String
 
    sFolderName = "C:test"           'имя исходной папки
    sNewFolderName = "C:tmptest"   'имя папки, в которую перемещаем(нужен слеш на конце)
    'создаем объект FileSystemObject    
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    'проверяем наличие папки по указанному пути
    If objFSO.FolderExists(sFolderName) = False Then 
        MsgBox "Нет такой папки", vbCritical, "www.excel-vba.ru"
        Exit Sub
    End If
    'перемещаем папку
    objFSO.MoveFolder sFolderName, sNewFolderName
    MsgBox "Папка перемещена", vbInformation, "www.excel-vba.ru"
End Sub
Sub Rename_Folder()
    Dim objFSO As Object, objFolder As Object
    Dim sFolderName As String, sNewFolderName As String
 
    sFolderName = "C:test"            'имя исходной папки
    'имя папки для переименования(только имя, без полного пути)
    sNewFolderName = "new folder name"
    'создаем объект FileSystemObject    
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    'проверяем наличие папки по указанному пути
    If objFSO.FolderExists(sFolderName) = False Then 
        MsgBox "Нет такой папки", vbCritical, "www.excel-vba.ru"
        Exit Sub
    End If
    'переименовываем папку
    'получаем доступ к объекту Folder(папка)
    Set objFolder = objFSO.GetFolder(sFolderName)
    'назначаем новое имя
    objFolder.Name = sNewFolderName
    MsgBox "Папка переименована", vbInformation, "www.excel-vba.ru"
End Sub
Sub Delete_Folder()
    Dim objFSO As Object, objFolder As Object
    Dim sFolderName As String
 
    sFolderName = "C:test"    'имя папки для удаления
    'создаем объект FileSystemObject    
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    'проверяем наличие папки по указанному пути
    If objFSO.FolderExists(sFolderName) = False Then 
        MsgBox "Нет такой папки", vbCritical, "www.excel-vba.ru"
        Exit Sub
    End If
    'удаляем папку
    objFSO.DeleteFolder sFolderName
    MsgBox "Папка удалена", vbInformation, "www.excel-vba.ru"
End Sub

FSO, конечно, способен на большее — но цель данной статьи была показать основные операции с папками и файлами как стандартными методами, так и более продвинутыми.


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

 

ankulov

Пользователь

Сообщений: 6
Регистрация: 11.01.2017

Всем привет.
Долго искал ответ, но вокруг да около….. Может кто поможет..
Задача следующая:
Необходим макрос, при запуске которого копируется файл с одной папки в другую. Причем место хранения файла, который нужно скопировать, и его название не меняются, а вот место, куда необходимо сохранить скопированный файл, должно быть предложено выбрать перед сохранение. Т.е. я запускаю макрос и сразу появляется окно с возможностью выбора места для сохранения скопированного файла.
Все примеры, которые мне удалось найти, завязанным на том, что в коде прописывается директория хранения и путь куда надо скопировать файл, но надо именно выбрать путь для сохранения.
Заранее спасибо

 

Юрий М

Модератор

Сообщений: 60585
Регистрация: 14.09.2012

Контакты см. в профиле

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#3

12.01.2017 08:33:37

Цитата
ankulov написал:
надо именно выбрать путь для сохранения

Диалоговое окно выбора файлов/папки
Как средствами VBA переименовать/переместить/скопировать файл

В результате получится нечто вроде:

Код
Sub Copy_File()
    Dim sFileName As String, sNewFileName As String, sP as String
 
    sFileName = "C:WWW.xls"    'имя и путь файла для копирования
    If Dir(sFileName, 16) = "" Then MsgBox "Файл для копирования не обнаружен в папке", vbCritical, "Ошибка": Exit Sub
    
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Выбрать папку для сохранения"
        .ButtonName = "Выбрать папку"
        .Filters.Clear
        If oFD.Show = 0 Then Exit Sub
        sP = .SelectedItems(1)
    End With
    
    FileCopy sFileName, sP & "WWW.xls" 'копируем файл
    MsgBox "Файл скопирован", vbInformation, "www.excel-vba.ru"
End Sub

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

ankulov

Пользователь

Сообщений: 6
Регистрация: 11.01.2017

The_Prist, Не работает:(

Изменено: ankulov12.01.2017 16:55:22

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#5

12.01.2017 20:27:27

Ну вот хоть бы статью прочли — глядишь сами ошибку нашли бы…
Уберите oFD вообще(точку оставьте)

Код
If .Show = 0 Then Exit Sub

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Kayana

Пользователь

Сообщений: 18
Регистрация: 17.10.2016

Да вот мне бы без диалога…
Там строк порядка тысячи, диалог каждый раз — это пристрелиться(
Сейчас макрос (он же в примере) создает одну папку для всех файлов. По факту мне нужно, чтобы он создавал по папке под каждый итоговый файл и, если идентичная папка уже есть (т.е. какой то контрагент обрабатывается второй раз) просто добавлял его туда.
Что то мне подсказывает, что это решается заменой пары строк кода, но мозг немного протестует

Ссылки изучу, спасибо

 

Юрий М

Модератор

Сообщений: 60585
Регистрация: 14.09.2012

Контакты см. в профиле

#7

12.01.2017 20:41:06

Цитата
ankulov написал:
место, куда необходимо сохранить скопированный файл, должно быть предложено выбрать перед сохранение
Цитата
Kayana написал:
мне бы без диалога

Вы уж определитесь )

 

Kayana

Пользователь

Сообщений: 18
Регистрация: 17.10.2016

Забавно, но у нас темы просто почти идентичные :D
Я с соседней случайно перелезла))
Ему то все по теме

 

ankulov

Пользователь

Сообщений: 6
Регистрация: 11.01.2017

The_Prist,Спасибо большое!!! То, что надо!!!
+100 к карме:)))

 

Михаил И.

Пользователь

Сообщений: 18
Регистрация: 16.08.2018

#10

03.04.2020 08:43:04

‘Дубликатор. Если нужно скопировать не один файл, а несколько

Код
Function dupe()
Dim filesPathsArray() As String
Dim fd As FileDialog
Dim fName As String
Dim fExt As String
Dim mN As String
'------------------------------------
MsgBox "Выберите файлы для копирования"
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
    If .Show = -1 Then
        For Each FilePath In .SelectedItems
            nmbrOfFiles = nmbrOfFiles + 1
        Next
    End If
End With
i = 1
ReDim Preserve filesPathsArray(nmbrOfFiles)
With fd
    For Each FilePath In .SelectedItems
        filesPathsArray((nmbrOfFiles - (nmbrOfFiles - i))) = FilePath
        i = i + 1
    Next
End With
'--------------------------------------
MsgBox "Выберите куда копировать"
Set fp = Application.FileDialog(msoFileDialogFolderPicker)
With fp
    If .Show = -1 Then
        For Each FolderPath In .SelectedItems
            fName = FolderPath
        Next
    End If
End With
'---------------------------------------
For n = 1 To nmbrOfFiles
    Set fs = CreateObject("Scripting.FileSystemObject")
    mN = fs.GetParentFolderName(filesPathsArray(n))
    If Not fName = mN Then
        Set f = fs.getfile(filesPathsArray(n))
        f.Copy fName
    End If
        
    If fName = mN Then
        Set f = fs.getfile(filesPathsArray(n))
        fExt = fs.GetExtensionName(filesPathsArray(n))
        fName = filesPathsArray(n) + "_копия" + "." + fExt
        f.Copy fName
    End If
Next n
MsgBox "Файлы скопированы"
End Function

Прикрепленные файлы

  • dupe.xls (42.5 КБ)

Изменено: Михаил И.03.04.2020 11:59:09

 

Кирилл Л.

Пользователь

Сообщений: 1
Регистрация: 26.02.2022

Добрый день!
Подскажите пожалуйста, как можно доработать вышеуказанный макрос, чтобы выбранный файл раскладывать сразу по нескольким папкам, пути (ссылки) в которые сформированы в табличном виде, дабы каждый раз путь не указывать вручную?

Изменено: Кирилл Л.26.02.2022 11:13:34

 

Михаил И.

Пользователь

Сообщений: 18
Регистрация: 16.08.2018

#12

05.03.2022 11:53:17

Цитата
написал:
Добрый день!Подскажите пожалуйста, как можно доработать вышеуказанный макрос, чтобы выбранный файл раскладывать сразу по нескольким папкам, пути (ссылки) в которые сформированы в табличном виде, дабы каждый раз путь не указывать вручную?

Изменено: Кирилл Л.  — 26.02.2022 11:13:34

Если правильно понял задачу, то вот решение:

Код
Function filesCopyFunction()

Dim filesPathsArray() As String
Dim fd As FileDialog
Dim copyToFolder As String
'---------------------------------------------------------------------------
MsgBox "Выберите файлы для копирования"
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
    If .Show = -1 Then
        For Each FilePath In .SelectedItems
            nmbrOfFiles = nmbrOfFiles + 1
        Next
    End If
End With

'счётчик количества файлов для копирования
i = 1
ReDim Preserve filesPathsArray(nmbrOfFiles)
With fd
    For Each FilePath In .SelectedItems
        filesPathsArray(i) = FilePath
        i = i + 1
    Next
End With

Worksheets(1).Activate

'копирование
i = 1
For i = 1 To nmbrOfFiles
For n = 1 To 100 '(здесь 100 это количество строк листа № "1", в которых подряд содержатся пути для копирования)
    Set fs = CreateObject("Scripting.FileSystemObject")
        copyToFolder = Cells(n, 1).Value
        fs.CopyFile (filesPathsArray(i)), copyToFolder
Next n
Next i

MsgBox "Файлы скопированы"

End Function

I have an access file that I regularly need to copy to another directory, replacing the last version.
I would like to use an Excel macro to achieve this, and would also like to rename the file in the process.

   fileName = "X:DatabaseoldName.accdb"
   copyDestination = "Y:dbstore"
   newName = "newName.accdb"

Is there an easy way of doing this?

Christopher Oezbek's user avatar

asked Jun 5, 2013 at 14:48

harryg's user avatar

2

Use the appropriate methods in Scripting.FileSystemObject. Then your code will be more portable to VBScript and VB.net. To get you started, you’ll need to include:

Dim fso As Object
Set fso = VBA.CreateObject("Scripting.FileSystemObject")

Then you could use

Call fso.CopyFile(source, destination[, overwrite] )

where source and destination are the full names (including paths) of the file.

See https://learn.microsoft.com/en-us/office/vba/Language/Reference/user-interface-help/copyfile-method

Darren Bartrup-Cook's user avatar

answered Jun 5, 2013 at 14:54

Bathsheba's user avatar

BathshebaBathsheba

231k33 gold badges359 silver badges477 bronze badges

3

This method is even easier if you’re ok with fewer options:

FileCopy source, destination

Bathsheba's user avatar

Bathsheba

231k33 gold badges359 silver badges477 bronze badges

answered Mar 5, 2014 at 16:23

Jon's user avatar

JonJon

1,18911 silver badges17 bronze badges

1

Копирование файлов из одной папки в другую по условию

Anis625

Дата: Среда, 16.01.2019, 21:53 |
Сообщение № 1

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

И снова здравствуйте!

Пытаюсь макросом скопировать из папки «Откуда» (в т.ч. всех подпапках) в папку «Куда» файлы Excel по условию (наличию в названии символа, например «+»).

Нашел макрос который копирует все файлы Excel:
[vba]

Код

Sub cop()

Dim fso As Object, Folder As Object, iFile As Object, iPath$
iPath = «C:UsersМвидеоDesktopОткуда»
Set fso = CreateObject(«Scripting.FileSystemObject»)
Set Folder = fso.GetFolder(iPath)
For Each iFile In Folder.Files
If Right(iFile.Name, 5) = «.xlsx» Then iFile.Copy «C:UsersМвидеоDesktopКуда» & «» & iFile.Name
Next
Set iFile = Nothing
Set Folder = Nothing
Set fso = Nothing
End Sub

[/vba]

Но он не решает 2 вопроса:

1) Необходимо копирование файлов во всех подуровнях папки «Откда», т.е. пока берет верхний уровень только.

2) Необходимо копирование файлов Excel имя файлов которые содержат символ +

Первую часть даже не смог найти что-то подходящее как исправить.

Вторую часть попытался исправить 8 строку:
[vba]

Код

If fso.GetFileName(fil.Path) Like «*+*.xlsx*» Then iFile.Copy «C:UsersМвидеоDesktopКуда» & «» & iFile.Name

[/vba]
Не срабатывает.

Подскажите, пожалуйста, где нужно правильно допилить?

P.S. можете подсказать полезные ресурсы (на русском) со всеми кодами и их синтаксисами для обучения. Один нашел (ссылки на внешний ресурс нельзя выкладывать) но синтаксис выложен без примеров.

Сообщение отредактировал Anis625Среда, 16.01.2019, 21:54

 

Ответить

krosav4ig

Дата: Среда, 16.01.2019, 22:47 |
Сообщение № 2

Группа: Друзья

Ранг: Старожил

Сообщений: 2346


Репутация:

989

±

Замечаний:
0% ±


Excel 2007,2010,2013

Здравствуйте

fso.GetFileName(fil.Path)

For Each iFile In Folder.Files

[vba]

Код

If iFile.Name Like «*+*.xls*» Then iFile.Copy «C:UsersМвидеоDesktopКуда» & «» & iFile.Name

[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

 

Ответить

Anis625

Дата: Среда, 16.01.2019, 22:59 |
Сообщение № 3

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

krosav4ig,

1 и 3 рекомендацию учел. Во 2-й не нашел отличий от своего варианта.

Запускаю макрос: Object required
=(

Сообщение отредактировал Anis625Среда, 16.01.2019, 22:59

 

Ответить

krosav4ig

Дата: Среда, 16.01.2019, 23:15 |
Сообщение № 4

Группа: Друзья

Ранг: Старожил

Сообщений: 2346


Репутация:

989

±

Замечаний:
0% ±


Excel 2007,2010,2013

это были не рекомендации, а цитаты из серии «найди 2 отличия» :)
у вас в коде [vba]

Код

For Each iFile In Folder.Files

[/vba] задана переменная iFile, а внутри цикла почему-то пишете fil (видимо, не заметили при копировании из другого макроса)
вам нужно было просто заменить в вашем макросе 8 строку на ту, что я написал

[vba]

Код

If iFile.Name Like «*+*.xls*» Then iFile.Copy «C:UsersМвидеоDesktopКуда» & «» & iFile.Name

[/vba]

[p.s.]Получение списка файлов в папке и подпапках средствами VBA


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4igСреда, 16.01.2019, 23:18

 

Ответить

Anis625

Дата: Среда, 16.01.2019, 23:25 |
Сообщение № 5

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

krosav4ig,

Крутяк. С «+» скопировал как надо. Я пока чайник по макросам. Пока не очень могу читать правильно макросы. Спасибо за правку.

Только макрос срабатывает на указанную папку. Внутри в подпапках не ищет макрос. Уровней может много.

Можете подсказать? В интернете подходящее не нашел

 

Ответить

Anis625

Дата: Среда, 16.01.2019, 23:25 |
Сообщение № 6

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

krosav4ig,

Упс не заметил вашу ссылку

 

Ответить

Anis625

Дата: Среда, 16.01.2019, 23:33 |
Сообщение № 7

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

krosav4ig,

Круууууто. Вот эту часть
[vba]

Код

Dim coll As Collection, ПутьКПапке$, МаскаПоиска$, ГлубинаПоиска%

    ПутьКПапке$ = [c1]    ‘ берём из ячейки c1
    МаскаПоиска$ = [c2]    ‘ берём из ячейки c2
    ГлубинаПоиска% = Val([c3])    ‘ берём из ячейки c3
    If ГлубинаПоиска% = 0 Then ГлубинаПоиска% = 999    ‘ без ограничения по глубине

    ‘ считываем в колекцию coll нужные имена файлов
    Set coll = FilenamesCollection(ПутьКПапке$, МаскаПоиска$, ГлубинаПоиска%)

[/vba]

если добавить в свою задачу было бы супер но сам поженить два макроса не смогу =(

Сообщение отредактировал Anis625Среда, 16.01.2019, 23:34

 

Ответить

sboy

Дата: Четверг, 17.01.2019, 09:56 |
Сообщение № 8

Группа: Друзья

Ранг: Участник клуба

Сообщений: 2566


Репутация:

724

±

Замечаний:
0% ±


Excel 2010

Вот еще ссылка там второй код со всеми подпапками, замените действие с файлом на свое


Яндекс: 410016850021169

 

Ответить

Anis625

Дата: Четверг, 17.01.2019, 10:10 |
Сообщение № 9

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

sboy,

Спасибо Вам большое. Буду попробовать =)

 

Ответить

Anis625

Дата: Четверг, 17.01.2019, 19:09 |
Сообщение № 10

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

=(

Перепробовал разные варианты. Последний вариант sboy, даже на проверке макроса как есть без изменения у меня долго макрос отрабатывал мигая и потом завис Excel

 

Ответить

Anis625

Дата: Четверг, 17.01.2019, 19:11 |
Сообщение № 11

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

Очередная попытка
[vba]

Код

Sub cop2()

Dim fso As Object, Folder As Object, iFile As Object, iPath$
iPath = «D:PQКопирование между папкамиОткуда»
Dim sFolder As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    sFolder = sFolder & IIf(Right(sFolder, 2) = Application.PathSeparator, «», Application.PathSeparator)
    Application.ScreenUpdating = False
Set fso = CreateObject(«Scripting.FileSystemObject»)
Set Folder = fso.GetFolder(iPath)
For Each iFile In Folder.Files
If iFile.Name Like «*+*.xls*» Then iFile.Copy «D:PQКопирование между папкамиКуда» & «» & iFile.Name
Next
Set iFile = Nothing
Set Folder = Nothing
Set fso = Nothing
End Sub

[/vba]

=( не срабатывает

 

Ответить

Anis625

Дата: Четверг, 17.01.2019, 19:26 |
Сообщение № 12

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

Добавил строки:

[vba]

Код

Sub cop3()

Dim fso As Object, Folder As Object, iFile As Object, iPath$
iPath = «D:PQКопирование между папкамиОткуда»
Set fso = CreateObject(«Scripting.FileSystemObject»)
Set Folder = fso.GetFolder(iPath)
For Each SubFolder In Folder.SubFolders
    WScript.Echo SubFolder.Name
If iFile.Name Like «*+*.xls*» Then iFile.Copy «D:PQКопирование между папкамиКуда» & «» & iFile.Name
Next
Set iFile = Nothing
Set Folder = Nothing
Set fso = Nothing
End Sub

[/vba]

Запускаю макрос: Object required
=(

Сообщение отредактировал Anis625Четверг, 17.01.2019, 19:26

 

Ответить

Hugo

Дата: Четверг, 17.01.2019, 21:21 |
Сообщение № 13

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

iFile — это кто?


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

Anis625

Дата: Четверг, 17.01.2019, 22:20 |
Сообщение № 14

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

Hugo,
В интернете нашел: iFile — это название файла — донора
Я думаю Вы лучше меня знаете.
Не силен в написании макросов. Стараюсь найти подходящие макросы и адаптировать под свои вопросы. Когда захожу в тупик обращаюсь за помощью. Я по формулам Excel пока только.

 

Ответить

Hugo

Дата: Четверг, 17.01.2019, 23:36 |
Сообщение № 15

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

Судя по коду — iFile As Object, и это всё. Что за объект, ничего Вы не указали. И то, что Вам явно пишут: Object required ни на что не намекает?
А ведь всего лишь одним постом выше всё есть… Внимательнее, тщательнее нужно.


excel@nxt.ru
webmoney: R418926282008 Z422237915069

Сообщение отредактировал HugoЧетверг, 17.01.2019, 23:38

 

Ответить

RAN

Дата: Четверг, 17.01.2019, 23:40 |
Сообщение № 16

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Тыкать вас носом в одно и то-же в пределах одной темы — это перебор. Нет? (№№2 и 4)
Для того, чтобы у файла было имя, которое может иметь, или не иметь что-то, неплохо бы иметь и сам файл. Не находите?


Быть или не быть, вот в чем загвоздка!

 

Ответить

Anis625

Дата: Четверг, 17.01.2019, 23:59 |
Сообщение № 17

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

RAN,

неплохо бы иметь и сам файл. Не находите?

В соответствии с правилами наверно нужно было. Но в данному случае не выкладывал, т.к. у меня чистый файл Excel с кнопкой вызова макроса (который выложил).

Но правила есть правила =) Добавил.

К сообщению приложен файл:

__.xlsb
(15.0 Kb)

Сообщение отредактировал Anis625Пятница, 18.01.2019, 00:02

 

Ответить

Anis625

Дата: Пятница, 18.01.2019, 00:05 |
Сообщение № 18

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

RAN,

Тыкать вас носом в одно и то-же в пределах одной темы — это перебор. Нет? (№№2 и 4)

Согласен, что это перебор когда в этом хорошо разбираться. Учусь.
А Вы когда первый сели за руль велосипеда, автомобиля у вас сразу хорошо получилось ехать? Или вам тоже говорили >1 раза как правильно нужно это делать?

 

Ответить

krosav4ig

Дата: Пятница, 18.01.2019, 00:08 |
Сообщение № 19

Группа: Друзья

Ранг: Старожил

Сообщений: 2346


Репутация:

989

±

Замечаний:
0% ±


Excel 2007,2010,2013

[vba]

Код

Option Explicit
Sub test()
    Dim sInPath$, sOutPath$, oFSO As Object

        sInPath = «C:UsersМвидеоDesktopОткуда»
    sOutPath = «C:UsersМвидеоDesktopКуда»

        Set oFSO = CreateObject(«scripting.filesystemobject»)

        CopyRecursive oFSO, sInPath, sOutPath, «*.xls*»

            Set oFSO = Nothing
End Sub
Private Sub CopyRecursive(ByRef oFSO As Object, sCopyFrom$, sCopyTo$, sMask$)
    Dim oFile As Object, oFolder As Object
    Set oFolder = oFSO.GetFolder(sCopyFrom)
    For Each oFile In oFolder.Files
        If oFile.Name Like «*+*.xls*» Then oFile.Copy sCopyTo & «» & oFile.Name
    Next
    For Each oFolder In oFolder.SubFolders
        CopyRecursive oFSO, oFolder.Path, sCopyTo, sMask
    Next
    Set oFile = Nothing
    Set oFolder = Nothing
End Sub

[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

 

Ответить

Anis625

Дата: Пятница, 18.01.2019, 00:14 |
Сообщение № 20

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

Hugo,

Судя по коду — iFile As Object, и это всё. Что за объект, ничего Вы не указали. И то, что Вам явно пишут: Object required ни на что не намекает?

Ребяты, но ведь этот код в таком виде (с учетом правки krosav4ig, ):
Sub cop3()
[vba]

Код

Dim fso As Object, Folder As Object, iFile As Object, iPath$
iPath = «D:PQКопирование между папкамиОткуда»
Set fso = CreateObject(«Scripting.FileSystemObject»)
Set Folder = fso.GetFolder(iPath)
If iFile.Name Like «*+*.xls*» Then iFile.Copy «D:PQКопирование между папкамиКуда» & «» & iFile.Name
Next
Set iFile = Nothing
Set Folder = Nothing
Set fso = Nothing
End Sub

[/vba]
Работает же. Он только берет папку без учета подпапок в ней. Попросил помочь. Дали рекомендации. Не получилось. Покопался в интернете еще раз. Нашел как применять SubFolders. Добавил две строки:
[vba]

Код

For Each SubFolder In Folder.SubFolders
    WScript.Echo SubFolder.Name

[/vba]
Не работает. Обратился еще раз за помощью.

RAN, Hugo, Вы чего с двух сторон сразу. Что я не так сделал?

 

Ответить

2 / 1 / 1

Регистрация: 25.05.2013

Сообщений: 216

1

05.06.2013, 17:10. Показов 24966. Ответов 57


Студворк — интернет-сервис помощи студентам

Здравствуйте!

Нужен макрос, который будет находить файлы в заданной папке с подпапками и копировать в заданную папку.

Допустим заданная папка, назовем ее «А», содержит папки(подпапки) «А1», «А2», «Аn», которые в свою очередь содержат по 3 файла в формате *.pdf.

Задача выбрать из всех «подпапок» :
1. файлы с названием *ЗУ*.pdf и поместить их в заданную папку, подпапку «Межевые планы»

2. файлы с названием МО-*.pdf AND 50_*.pdf и поместить их в заданную папку, подпапку «Кадастровые паспорта»

3. файлы с названием 50-*.pdf и поместить их в заданную папку, подпапку «Заявления»
Подпапки создаются автоматически в заданной папке.

Заранее спасибо!

Добавлено через 3 часа 48 минут
вверх



0



26 / 26 / 12

Регистрация: 04.02.2013

Сообщений: 250

06.06.2013, 10:26

2

Вот хороший пример. Можно подделать для себя. По моему с сайти planetaexcel.ru



0



2 / 1 / 1

Регистрация: 25.05.2013

Сообщений: 216

06.06.2013, 15:37

 [ТС]

3

Спасибо,
Roman_rc, у меня не хватит знаний, что бы переделать этот макрос.
Господа форумчане, помогите пожалуйста с написанием макроса!



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

06.06.2013, 15:47

4

2 вопроса (делать не спешу…):
1. что такое «поместить»? Или верим названию темы? Тогда дело усложняется…
2. чьё VBA предпочитаете? Или может vbs/wsh?



0



2 / 1 / 1

Регистрация: 25.05.2013

Сообщений: 216

06.06.2013, 15:49

 [ТС]

5

«поместить» — копировать,
Второго вопроса не понял, но работать думаю в excel 2003 или 2007



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

06.06.2013, 15:57

6

Sorry, в названии ведь упоминается Эксель…



0



2 / 1 / 1

Регистрация: 25.05.2013

Сообщений: 216

06.06.2013, 15:59

 [ТС]

7

Вы работаете в 2010?



0



26 / 26 / 12

Регистрация: 04.02.2013

Сообщений: 250

06.06.2013, 16:31

9

Вот накидал быстро. Попробуй как-то так)
Только не забудь подключить библиотеку Microsoft scripting runtime

Как работает указываешь формат файла, который хочешь найти.
Находишь
Указываешь папу куда копировать файл
Копируешь



1



2 / 1 / 1

Регистрация: 25.05.2013

Сообщений: 216

06.06.2013, 16:45

 [ТС]

10

Roman_rc, Вы ошибочно прикрепили исходный файл с макросом.



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

06.06.2013, 17:06

11

То что нужно копировать — усложняет практическую реализацию. Что делать, если такой файл уже есть? В случае переноса ясно — новый файл это другой файл, в случае повтора новый нужно переименовать (или затереть старый).
В случае копирования непонятно… Переименовывать нельзя — может это те файлы, которые уже вчера/позавчера/утром копировались… Затирать? Лишняя работа. Составлять список существующих и сверяться — тоже работа.
Да и вообще такое сочинять лениво, много букв…

Если переносить — просто цикл по всем папкам-подпапкам, все файлы по маске переносим по папкам. Если уже есть — игнорируем/затираем. Или переименовываем, дописывая датавремя.



1



2 / 1 / 1

Регистрация: 25.05.2013

Сообщений: 216

06.06.2013, 17:13

 [ТС]

12

Hugo121, Дело в том, что повтор файлов исключается, у каждого объекта свои номера.
Так что можно смело копировать. Если уж и встретится единичный случай повтора, его легко отследить.
Т.е. количество файлов в папках «Межевые планы», «Кадастровые паспорта», «Заявления» должно получиться одинаковым. Если нет, значит был повтор…опечатка, заведомо ложные сведения.



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

06.06.2013, 17:17

13

Хорошо, скопировали. Что будет в следующий раз?



1



2 / 1 / 1

Регистрация: 25.05.2013

Сообщений: 216

06.06.2013, 17:24

 [ТС]

14

Папка «А» содержит подпапки
ID_1
ID_2
ID_3
ID_n
Каждая подпапка содержит по 3 файла, я их нахожу через тотал коммандер
1. файлы с названием *ЗУ*.pdf и поместить их в заданную папку, подпапку «Межевые планы»
2. файлы с названием МО-*.pdf AND 50_*.pdf и поместить их в заданную папку, подпапку «Кадастровые паспорта»
3. файлы с названием 50-*.pdf и поместить их в заданную папку, подпапку «Заявления»
Подпапки создаются автоматически в заданной папке.
Задача найти файлы по условиям и скопировать в автоматически созданные папки

Добавлено через 1 минуту
«Заданная папка» создается один раз, как назвать определяет пользователь
Можно ее назвать также, как и папку для анализа данных



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

06.06.2013, 17:31

15

Это уже понятно.
Что делать в случае повтора? А повторы будут регулярно и много при каждом запуске. Если конечно кто-то не будет убирать ранее скопированное с одной или другой стороны. Но вероятно не будет — раз Вы об этом не говорите.
Так что делать?



1



2 / 1 / 1

Регистрация: 25.05.2013

Сообщений: 216

06.06.2013, 17:39

 [ТС]

16

Есть папка для анализа данных, есть папка с обработанными данными, они задается через диалоговое окно.
Т.е. папки будут при каждом запросе разные.
Что делать, если будут повторы — заменять



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

06.06.2013, 17:44

17

Т.е. у Вас уже есть код с запросом у пользователя выбрать папку (два запроса)? И если он ткнёт не туда — ну и бог с ним? Не найдём — ещё раз скопируем…



1



Виктор83

2 / 1 / 1

Регистрация: 25.05.2013

Сообщений: 216

06.06.2013, 17:48

 [ТС]

18

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Задать_папку_Click()
 
   Set FSO = CreateObject("Scripting.FileSystemObject")
    Set WshShell = CreateObject("Shell.Application") 'New Shell32.Shell
    Set WshFolder = WshShell.BrowseForFolder(0, "Анализируемая папка", 1&)
    Set KudFolder = WshShell.BrowseForFolder(0, "Папка приёма результата", 1&)
    PATH = WshFolder.self.PATH
    PATH_p = KudFolder.self.PATH
    N = False
    Search FSO.GetFolder(PATH)
    MsgBox "OK", 64, ""
 End Sub

Добавлено через 1 минуту
Полученный результат будет анализироваться по количеству файлов в папках. Количество мне известно



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

06.06.2013, 18:05

19

Я к чему это тут всё расспрашиваю —
1. хочу предельной ясности
2. вижу что возможна ерунда при работе
3. раз ерунда — жаль тратить время впустую

Вот если бы файлы переносились из одной определённой папки, куда система скидывает файлы, в другие определённые папки — никакой ерунды, всё прозрачно.
Файлы или там, или тут. И если имена уникальны — то и конфликтов никогда не будет.
И запускать можно в любое время — хоть раз в минуту, хоть раз в год.

Единственное — проще когда эти папки лежат рядом, а не одна в другой. Хотя можно и вложить — но много букв… Лучше рядом

Добавлено через 5 минут
Код выбора папок понятен, можно использовать. Только N лишнее, search предстоит кому-то написать… Но всё же хотите копировать куда ткнёт пользователь?



0



2 / 1 / 1

Регистрация: 25.05.2013

Сообщений: 216

06.06.2013, 18:20

 [ТС]

20

search, это макрос, который должен получиться.
Файлы уникальны, одинаковость только в
*ЗУ*.pdf
МО-*.pdf AND 50_*.pdf
50-*.pdf

Добавлено через 1 минуту
папок может быть сколько угодно много, поэтому я их обозначил буквой N

Добавлено через 39 секунд
хочу копировать куда ткнёт пользователь



0



You can easily copy sheets in Excel manually with a few simple mouse clicks. On the other hand, you need a macro if you want to automate this process. In this guide, we’re going to show you how to copy sheets in Excel with VBA.

Download Workbook

Before you start

If you are new to VBA and macro concept, VBA is a programming language for Office products. Microsoft allows users to automate tasks or modify properties of Office software. A macro, on the other hand, is a set of VBA code which you tell the machine what needs to be done.

Macros, or codes, should be written in modules, which are text areas in VBA’s dedicated user interface. Also, the file should be saved as Excel Macro Enabled Workbook in XLSM format to keep the codes.

You can find detailed instructions in our How to create a macro in Excel guide.

New Workbook

Copy active sheet to a new workbook

The first code is the simplest and shortest one which performs the action the title suggests:

Public Sub CopyActiveSheetToNewWorkbook()

  ActiveSheet.Copy

End Sub

As you can figure out ActiveSheet selector indicates the active sheet in the user window. Once the code run successfully, you will see the copy in a new workbook.

Copy a specific sheet to a new workbook

The following code copies “SUMIFS” sheet into a new workbook, regardless of sheet’s active status.

Public Sub CopySpecificSheetToNewWorkbook()

  Sheets("SUMIFS").Copy

End Sub

Copy selected sheets to a new workbook

If you need to copy selected sheets into a new workbook, use ActiveWindow.SelectedSheets selector.

Public Sub CopyActiveSheetsToNewWorkbook()

  ActiveWindow.SelectedSheets.Copy

End Sub

Copy active sheet to a specific position in the same workbook

If you specify a position in the code, VBA duplicates the sheet in a specific position of in the workbook. To do this placement, you can use Before and After arguments with Copy command. With these arguments, you can place the new sheet before or after an existing worksheet.

You can use either sheet names or their indexes to indicate the existing sheet. Here are a few samples:

Public Sub CopyActiveSheetAfterSheet_Name()

  'Copies the active sheet after "Types" sheet

  ActiveSheet.Copy After:=Sheets("Types")

End Sub

    

Public Sub CopyActiveSheetAfterSheet_Index()

  'Copies after 2nd sheet

  ActiveSheet.Copy After:=Sheets(2)

End Sub

    

Public Sub CopyActiveSheetAfterLastSheet()

  'Copies the active sheet after the last sheet

  'Sheets.Count command returns the number of the sheets in the workbook

  ActiveSheet.Copy After:=Sheets(Sheets.Count)

End Sub

    

Public Sub CopyActiveSheetBeforeSheet_Name()

  'Copies the active sheet before "Types" sheet

  ActiveSheet.Copy Before:=Sheets("Types")

End Sub

    

Public Sub CopyActiveSheetBeforeSheet_Index()

  'Copies the active sheet before 2nd sheet

  ActiveSheet.Copy Before:=Sheets(2)

End Sub

    

Public Sub CopyActiveSheetBeforeFirstSheet()

  'Copies the active sheet before the first sheet

  ActiveSheet.Copy Before:=Sheets(1)

End Sub

Copy active sheet to an existing workbook

To copy anything to an existing workbook, there are 2 perquisites:

  1. Target workbook should be open as well
  2. You need to specify the target workbooks by name
Sub CopySpecificSheetToExistingWorkbook()

  ' define a workbook variable and assign target workbook

  ' thus, we can use variable multiple times instead of workbook reference

  Dim targetSheet As Workbook

  Set targetSheet = Workbooks("Target Workbook.xlsx")

  'copies "Names" sheet to the last position in the target workbook

  Sheets("Names").Copy After:=targetSheet.Sheets(targetSheet.Worksheets.Count)

End Sub

Note: To copy to a closed workbook is possible. However, the target workbook should be opened and preferably closed after copying via VBA as well.

Понравилась статья? Поделить с друзьями:
  • Макрос для копирования только значений в excel
  • Макрос для копирования текста word
  • Макрос для копирования строки в excel
  • Макрос для консолидации данных в excel
  • Макрос для конкретной ячейки в excel