Хитрости »
Основные понятия (23)
Сводные таблицы и анализ данных (9)
Графики и диаграммы (5)
Работа с VB проектом (12)
Power BI и Power Query (14)
Условное форматирование (5)
Списки и диапазоны (5)
Макросы(VBA процедуры) (63)
Разное (38)
Баги и глюки Excel (2)

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

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

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

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, "Ошибка": Exit Sub
 
    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, "Ошибка": Exit Sub
 
    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, "Ошибка": Exit Sub
 
    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, "Ошибка": Exit Sub
 
    Kill sFileName 'удаляем файл
    MsgBox "Файл удален", vbInformation, "www.excel-vba.ru"
End Sub

Вот так. Вроде ничего сложного.


Так же я хотел бы описать как можно проделать те же операции с файлами при помощи объекта FileSystemObject. Строк кода несколько больше и выполняться операции будут медленнее(хотя вряд ли это будет заметно на примере одного файла). Но раз начал разбирать эту тему - решил показать и эти методы. Прежде всего следует, я думаю, пояснить что за зверь такой - 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"    'имя файла для переименования
    If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
 
    'копируем файл
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    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"    'имя файла для переименования
    If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
 
    'перемещаем файл
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    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"    'имя файла для переименования
    If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
 
    'переименовываем файл
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    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"    'имя файла для удаления
 
    If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
 
    'удаляем файл
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.GetFile(sFileName)
    objFile.Delete
    MsgBox "Файл удален", vbInformation, "www.excel-vba.ru"
End Sub

Вот теперь вроде бы все.


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

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

Access apple watch Multex Outlook Power Query и Power BI VBA работа в редакторе VBA управление кодами Бесплатные надстройки Дата и время Диаграммы и графики Записки Защита данных Интернет Картинки и объекты Листы и книги Макросы и VBA Надстройки Настройка Печать Поиск данных Политика Конфиденциальности Почта Программы Работа с приложениями Работа с файлами Разработка приложений Сводные таблицы Списки Тренинги и вебинары Финансовые Форматирование Формулы и функции Функции Excel Функции VBA Ячейки и диапазоны акции MulTEx анализ данных баги и глюки в Excel ссылки
Обсуждение: 9 комментариев
  1. VasYa:

    Добрый день. Подскажите, пожалуйста, что в Dir(sFileName, 16) означает число 16?

  2. 16 означает константу vbDirectory. Чтобы лучше понять советую почитать справку VBA по методу Dir, там все написано подробно.

  3. VasYa:

    Спасибо. Почитаю

  4. Игорь:

    Дмитрий, большое спасибо за статью!
    Насколько я понимаю, данные коды работают только с одним файлом?
    А нельзя переделать код так, чтобы он искал файлы (несколько) в определенной директории по названию(вернее не по полному имени файла а по слову(словам) встречающемуся в названии и затем уже все названные файлы помещал в указанную папку.
    Несколько запутанно изложил мысль...
    Попробую по другому.
    Сейчас для копирования я пользуюсь стандартным поисковиком оффиса, который ищет файлы на общесетевом диске, затем я эти файлы копирую в определенную папку и дальше с ними работаю. Можно ли это сделать средствами VBA?

  5. Игорь, прочитайте статью: Просмотреть все файлы в папке
    Если грамотно объединить ту и эту статьи - получите желаемое.

  6. Игорь:

    Спасибо, Дмитрий! Я видно пропустил данную статью. Попробую объединить оба метода.
    Еще раз спасибо!

  7. Николай:

    Здравствуйте, Дмитрий! У меня подсвечивается строка FileCopy sFileName, sNewFileName
    Может ли это быть связано с тем, что я копирую в папку user, на которой нарисован замок?
    Вот мой путь:
    sNewFileName = "С:\Пользователи\user\OneDrive\День_1.1.xlsm"

  8. Кирилл:

    Здравствуйте, Дмитрий! Подскажите пожалуйста если при копировании файла я меняю путь и имя файла на
    sFileName = Range("a1")
    sNewFileName = Range("b1")
    Возможно ли это применить ко всем строкам (заполненным в таблице) Заранее спасибо.

    • алекс:

      Правильно писать
      sFileName = Range("a1").value
      sNewFileName = Range("b1").value
      но лучше
      r=1
      do
      sFileName = cells(r,1).value
      sNewFileName = cells(r,2).value
      if sFileName="" then
      exit do
      endif
      FileCopy sFileName, sNewFileName
      r=r+1
      loop

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

Поделитесь своим мнением

Комментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме - добро пожаловать на Форум


Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Тренинги

Заказать
Юридическая информация

Использование материалов сайта

Политика Конфиденциальности

ИП Щербаков Дмитрий Валентинович
ОГРНИП: 318502700083307
ИНН: 504013350772

Наши партнеры

Перейти
Перейти

Счетчики

Рейтинг@Mail.ru Яндекс.Метрика
© 2018 Excel для всех   Войти