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              129904 просмотров


В этой статье я хотел бы рассказать как средствами 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
ссылки
статистика

Задача состоит в том, чтобы скопировать определенный диапазон текущего листа, открыть другую книгу, и вставить эти скопированные данные в определенную ячейку, сохранить этот файл и закрыть. Ниже приведен код VBA.

Sub Название_Макроса()

'Выделить диапазон который необходимо скопировать
Range("A1:F52").Select
'Скопировать то, что выделено
Selection.Copy
ChDir "путь к папке где лежит файл в который необходимо скопировать"
Workbooks.Open Filename:= "Название файла, который находится в папке, путь к которой указан выше"
'Выделить начальную ячейку в которую необходимо вставить скопированные данные
Range("A6").Select
'Вставить данные
ActiveSheet.Paste
'сохранить текущую книгу
ActiveWorkbook.Save
'Закрыть книгу
ActiveWorkbook.Close
End Sub

Вариант 2: В открывшейся книге запускаем макрос, чтобы он открыл нужную нам книгу, скопировал от туда нужные нам данные и вставил в нашу открытую книгу, закрыв файл из которого эти данные были скопированы

Sub Название_Макроса2()
'Открываем файл с которого нужно скопировать данные
Workbooks.Open Filename:="C:Данные.xlsx"

'Скопировать нужный диапазон в открывшейся книге на листе 1
Workbooks("Данные.xlsx").Worksheets("Лист1").Range("A16:E16").Copy
'Активируем нужную нам книгу
Workbooks("Книга1.xlsm").Activate

'Выделяем и вставляем скопированные данные в ячейку А1
ActiveWorkbook.Worksheets("Лист1").Range("A1").Select
ActiveSheet.Paste

'Закрываем книгу откуда мы скопировали данные
Workbooks("Данные.xlsx").Close

End Sub

Еще пример — Скопировать диапазоны данных из активной открытой книги Excel нескольких листов (в нашем примере 3-х листов) в другую книгу, которая хранится в определенном месте. Данные будут вставлены как значения, плюс будут перенесены форматы ячеек.

Sub Копируем_листы_в_другую_книгу()
Dim bookconst As Workbook
Dim abook As Workbook
Set abook = ActiveWorkbook 'присваиваем перменную активной книге
Set bookconst = Workbooks.Open("C:UsersUserDesktop1.xlsx") 'присваиваем перменную книге куда необходимо копировать данные

'переходим в активную книгу откуда необходимо скопировать данные
abook.Worksheets("Лист1").Activate
Range("A1:I23").Copy 'копируем определенный диапазон листа, укажите свой диапазон
bookconst.Worksheets("Лист1").Activate 'активируем лист куда необходимо вставить данные
Range("A1:I23").Select 'встаем на ячейку А1
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'второй лист
abook.Worksheets("Лист2").Activate
Range("A1:I23").Copy
bookconst.Worksheets("Лист2").Activate
Range("A1:I23").Select 'выделяем диапазон
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'третий лист
abook.Worksheets("Лист3").Activate
Range("A1:I23").Copy
bookconst.Worksheets("Лист3").Activate
Range("A1:I23").Select 'выделяем диапазон
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'сохранить текущую книгу
bookconst.Save
'Закрыть книгу
bookconst.Close
abook.Activate

End Sub

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

Спасибо за внимание.

  • Excel VBA FileCopy

Excel VBA FileCopy

Есть много способов скопировать или переместить файл из одной папки в другую. Мы можем сделать это вручную, скопировав и вырезав значок файла и вставив его в папку назначения. Но когда дело доходит до автоматизации этого процесса копирования файла, мы можем сделать это и в VBA. Чтобы скопировать файл, у нас есть функция, доступная в VBA, которая называется «Копирование файла».

Синтаксис FileCopy в Excel VBA

Применить File Copy в VBA очень легко. Синтаксис File Copy выглядит так, как показано ниже.

File Copy имеет только два компонента для подачи. Которые:

  • Источник — Здесь мы разместим исходное местоположение, откуда нам нужно скопировать файл.
  • Назначение — и это будет папка назначения, в которую мы будем вставлять скопированный файл.

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

Как скопировать файл в Excel VBA?

Теперь давайте попробуем с некоторыми примерами копирования файлов VBA в Excel.

Вы можете скачать этот VBA Скопировать файл Excel шаблон здесь — VBA Скопировать файл Excel шаблон

Пример № 1 — FileCopy в VBA

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

Для этого нам понадобится файл любого вида или расширения. Здесь мы рассматриваем файл Excel с расширением xlsx . Как мы видим, мы поместили этот файл Excel в папку, которая легко доступна и называется Test .

Теперь мы скопируем этот файл с помощью FileCopy в указанную ниже папку назначения.

Шаг 1: Для этого перейдите в VBA и откройте раскрывающийся список «Модуль из вставки», как показано ниже.

Шаг 2: Теперь в открытом модуле напишите подкатегорию VBA FileCopy или любое другое имя по вашему выбору.

Код:

 Sub VBA_Copy1 () End Sub 

Шаг 3: Теперь откройте функцию FileCopy, как показано ниже.

Код:

 Sub VBA_Copy1 () FileCopy (End Sub 

Шаг 4: Теперь в кавычках напишите адрес местоположения источника, а затем имя и расширение файла, как показано ниже.

Код:

 Sub VBA_Copy1 () FileCopy "D:  Test1  Hello.xlsx", End Sub 

Шаг 5: В качестве места назначения снова поместите путь в кавычки, затем файл и расширение.

Код:

 Sub VBA_Copy1 () FileCopy "D:  Test1  Hello.xlsx", "D:  VPB File  April Files  Hello.xlsx" End Sub 

Шаг 6: Теперь скомпилируйте код и запустите его, нажав на кнопку Play, которая находится под строкой меню. Мы увидим, что файл Excel с именем Test теперь копируется из исходного местоположения в местоположение назначения, как показано ниже. Поскольку в файле ничего не было, размер файла равен 0 КБ .

Пример №2 — FileCopy в VBA

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

Шаг 1: Теперь сначала откройте новый модуль и напишите подкатегорию VBA File Copy, как показано ниже.

Код:

 Sub VBA_Copy2 () End Sub 

Шаг 2: Сначала определите переменную, в которую мы будем помещать исходное местоположение файла того же файла Excel, который мы использовали в примере-1 в качестве String.

Код:

 Sub VBA_Copy2 () Dim FirstLocation As String End Sub 

Шаг 3: Аналогичным образом, нам понадобится еще одна переменная для места назначения.

Код:

 Sub VBA_Copy2 () Dim FirstLocation As String Dim SecondLocation As String End Sub 

Шаг 4: Теперь поместите местоположение в первую определенную переменную, которая является « FirstLocation » вместе с именем файла и его расширением.

Код:

 Sub VBA_Copy2 () Dim FirstLocation в виде строки Dim SecondLocation в виде строки FirstLocation = "D:  Test1  Hello.xlsx" End Sub 

Шаг 5: Аналогичным образом сделайте то же самое для местоположения пункта назначения, используя переменную « SecondLocation», которую мы определили выше.

Код:

 Sub VBA_Copy2 () Dim FirstLocation в виде строки Dim SecondLocation в виде строки FirstLocation = "D:  Test1  Hello.xlsx" SecondLocation = "D:  VPB File  April Files  Hello.xlsx" End Sub 

Шаг 6: Теперь пришло время использовать функцию FileCopy .

Код:

 Sub VBA_Copy2 () Dim FirstLocation в виде строки Dim SecondLocation в виде строки FirstLocation = "D:  Test1  Hello.xlsx" SecondLocation = "D:  VPB File  April Files  Hello.xlsx" FileCopy End Sub 

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

Шаг 7: Итак, здесь мы можем напрямую выбрать эти переменные. Сначала выберите переменную местоположения источника, которая является FirstLocation .

Код:

 Sub VBA_Copy2 () Dim FirstLocation в виде строки Dim SecondLocation в виде строки FirstLocation = "D:  Test1  Hello.xlsx" SecondLocation = "D:  VPB File  April Files  Hello.xlsx" FileCopy FirstLocation End Sub 

Шаг 8: Снова аналогичным образом выберите переменную места назначения, которая является SecondLocation, как показано ниже.

Код:

 Sub VBA_Copy2 () Dim FirstLocation в виде строки Dim SecondLocation в виде строки FirstLocation = "D:  Test1  Hello.xlsx" SecondLocation = "D:  VPB File  April Files  Hello.xlsx" FileCopy FirstLocation, SecondLocation End Sub 

Шаг 9: После этого мы скомпилируем код, нажав функциональную клавишу F8. И если ошибки не найдены, запустите код. Мы увидим, что файл из исходного местоположения копируется и вставляется в папку назначения, как показано ниже.

Мы можем попробовать другой путь. Для теста давайте рассмотрим другое местоположение источника, где у нас будет файл слова.

Как мы видим, в файле нет данных, поэтому размер снова отображается как 0 КБ.

И целевой папкой будет папка «Расположение вывода», которая находится в папке «Расположение ввода». Если мы видим внутри файла, нет доступных данных.

Теперь мы заменим источник и назначение в переменных FirstLocation и Second Location соответственно, за которыми следуют имя файла и его расширение.

Код:

 Sub VBA_Copy2 () Dim FirstLocation в виде строки Dim SecondLocation в виде строки FirstLocation = "D:  VPB File  April Files  New Excel  Test Case.docx" SecondLocation = "D:  VPB File  April Files  Final location  Test Case. docx "FileCopy FirstLocation, SecondLocation End Sub 

Теперь запустите код.

Мы увидим, что файл Test word теперь копируется из папки Input Location в папку Output location с тем же размером, который равен 0 КБ.

Плюсы FileCopy в VBA

  • Может использоваться для копирования более 1 файла за один снимок.
  • Для 10 файлов требуется примерно столько же времени, сколько для копирования одного файла.
  • Мы можем использовать любой тип файла расширения, который мы хотим скопировать.

То, что нужно запомнить

  • Всегда ставьте имя файла и его расширение в конце имени местоположения.
  • Заключите в кавычки ссылки места назначения и источника.
  • После этого сохраните код в макросе, чтобы Excel смог использовать и сохранить код для будущих целей.
  • Всегда предоставляйте разрешение на код, чтобы он мог скопировать файл из исходного расположения и вставить его в место назначения.

Рекомендуемые статьи

Это руководство по FileCopy в VBA. Здесь мы обсуждаем, как скопировать файл Excel с использованием кода VBA, а также с практическими примерами и загружаемым шаблоном Excel. Вы также можете просмотреть наши другие предлагаемые статьи —

  1. Работа с VBA Active Cell
  2. Удаление строки в VBA
  3. Как использовать Excel VBA Transpose?
  4. Как исправить ошибку 1004 с помощью VBA

Kassia

4 / 1 / 0

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

Сообщений: 108

1

10.02.2015, 15:58. Показов 24315. Ответов 23

Метки нет (Все метки)


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

Добрый день! Знаю тут много тем про копирование данных. Но я так и не нашла по теме. Вобщем мне надо из разных файлов собрть ин6формацию в один.
Я сделала это так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
iPath = ActiveWorkbook.Path
Workbooks.Open Filename:=iPath + "Иркутская.xlsx"
Workbooks("Иркутская.xlsx").Worksheets("Таблица1").Range("C331").Copy
Workbooks("Общая.xlsm").Activate
ActiveWorkbook.Worksheets("Лист1").Range("D3").Select
ActiveSheet.Paste
Workbooks("Иркутская.xlsx").Close
 
iPath = ActiveWorkbook.Path
Workbooks.Open Filename:=iPath + "Иркутская.xlsx"
Workbooks("Иркутская.xlsx").Worksheets("Таблица1").Range("C332").Copy
Workbooks("Общая.xlsm").Activate
ActiveWorkbook.Worksheets("Лист1").Range("E3").Select
ActiveSheet.Paste
Workbooks("Иркутская.xlsx").Close
 
iPath = ActiveWorkbook.Path
Workbooks.Open Filename:=iPath + "Иркутская.xlsx"
Workbooks("Иркутская.xlsx").Worksheets("Таблица1").Range("C333").Copy
Workbooks("Общая.xlsm").Activate
ActiveWorkbook.Worksheets("Лист1").Range("F3").Select
ActiveSheet.Paste
Workbooks("Иркутская.xlsx").Close

Вобщем каждый раз открываю и закрываю файл чтобы вытащить значение одной ячейки. Вот как сделать чтобы сразу вытаскивать эти все знаения и вставлять их в нужные ячейки. И вот интересно как сделать чтобы допустим из нужного файла по одному столбцу найти значение допустим а = 3407 и если нашлось то выбераем значение из столбца рядом напротив которого эта цифра и вставляем ее в общий файл в нужную ячейку. надеюсь понятно объяснила)



0



Казанский

15136 / 6410 / 1730

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

Сообщений: 9,999

10.02.2015, 16:50

2

Цитата
Сообщение от Kassia
Посмотреть сообщение

Вобщем каждый раз открываю и закрываю файл чтобы вытащить значение одной ячейки

Интересно, а когда Вы вручную копируете ячейки из одного файла в другой, Вы тоже каждый раз файл закрываете? Ну хотя бы так:

Visual Basic
1
2
3
4
5
6
7
8
9
iPath = ActiveWorkbook.Path
Workbooks.Open Filename:=iPath + "Иркутская.xlsx"
Workbooks("Иркутская.xlsx").Worksheets("Таблица1").Range("C331").Copy _
    Workbooks("Общая.xlsm").Worksheets("Лист1").Range("D3")
Workbooks("Иркутская.xlsx").Worksheets("Таблица1").Range("C332").Copy _
    Workbooks("Общая.xlsm").Worksheets("Лист1").Range("E3")
Workbooks("Иркутская.xlsx").Worksheets("Таблица1").Range("C333").Copy _
    Workbooks("Общая.xlsm").Worksheets("Лист1").Range("F3")
Workbooks("Иркутская.xlsx").Close



1



Hugo121

6875 / 2807 / 533

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

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

10.02.2015, 17:39

3

Если нужны только данные без попугаев/форматов, то думаю сработает так:

Visual Basic
1
2
3
4
5
6
    Dim wb As Object, a()
    iPath = ActiveWorkbook.Path
    Set wb = Workbooks.Open(iPath & "Иркутская.xlsx")
    a = wb.Worksheets("Таблица1").Range("C331:C333").Value
    wb.Close 0
    Workbooks("Общая.xlsm").Worksheets("Лист1").Range("D3:F3").Value = Application.Transpose(a)



1



4 / 1 / 0

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

Сообщений: 108

10.02.2015, 19:03

 [ТС]

4

Нет так я не могу D3:F3 вставить потому что там значения вставлять нужно через одну ячейку. Но спасибо за поомщь)
А вот еще вопрос как мне отобрать эти значения по поиску. то есть если допустим я не знаю конкретной ячейки или они меняются. но знаю код продукта?

код продукта (столбец С) количество (столбец В)
3408 56
4590 59
3470 5768
4546 5675
4654 9898
4456 232

вот как мне так записать : найди код такой то и вытащи значение из столбца В и вставь это значение в общий файл в нужную ячейку.

if kod = 3408 then … ?



0



6875 / 2807 / 533

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

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

10.02.2015, 20:21

5

Я обычно сперва загоняю все эти пары в словарь (код-значение или код-позиция_в_массиве_или_на_листе), затем просто извлекаю нужное из словаря, без всяких долгих поисков.
Но вообще конечно можно и искать — но покажите уже людям пример файла (лучше искусственный, но приближённо к оригиналу).



0



chumich

2079 / 1232 / 464

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

Сообщений: 3,237

10.02.2015, 20:42

6

Цитата
Сообщение от Kassia
Посмотреть сообщение

вот как мне так записать : найди код такой то и вытащи значение из столбца В и вставь это значение в

Visual Basic
1
2
3
For i = 1 To ThisWorkbook.ActiveSheet.Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
If Cells (i,3) = "ваше значение" Then "место куда надо вставить" = Cells (i,2)
Next i



0



4 / 1 / 0

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

Сообщений: 108

11.02.2015, 16:36

 [ТС]

7

Вот прикрепляю два файла. Из файла Омская нужно вытащить значения в файл 1. Я думала по коду как то искать потому что ячейки могут меняться при загрузке обновленных файлов. так вот как записать: ищу по коду значение и беру значение напротив этого и вставляю в общий файл. в нужную ячейку.



0



6875 / 2807 / 533

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

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

11.02.2015, 17:35

8

Поясните каким образом «ячейки могут меняться» — потому что есть несколько вариантов действий, но думаю проще всего использовать ВПР() (можно в макросе).
Но в любом случае важно знать как они могут меняться — чтоб найти с гарантией и чтоб не городить лишнего.



0



4 / 1 / 0

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

Сообщений: 108

11.02.2015, 19:33

 [ТС]

9

Эти файлы по областям выгружаются из базы. и могут ячейки смещаться. то есть был доупстим топливо в ячейке C1 а стало в ячейке C2 так как может впереди добавиться допустим молоко, которого в прошлом месяце не было. поэтому мне и нужно чтоб наверняка сравнивать по коду товара как то) и нужен макрос. впр не пойдет(



0



6875 / 2807 / 533

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

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

11.02.2015, 22:11

10

Так как раз ВПР и пойдёт.



0



6875 / 2807 / 533

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

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

11.02.2015, 22:21

11

Вот, только имя файла поменять.
Можно эту формулу забить макросом, подставив имя из ячейки левее, затем сразу заменить на вытянутое значение.
Так не нужно открывать-закрывать файлы.

Ну а если коды известны — то конечно нужно искать по коду, чтоб например не спутать газовое топливо с газировкой Хотя вместо *газ* можно писать *газ*топливо*

Вложения

Тип файла: xlsx 1.xlsx (12.7 Кб, 37 просмотров)



0



4 / 1 / 0

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

Сообщений: 108

12.02.2015, 18:33

 [ТС]

12

Ох, не подходит мне ВПР. я же напсиала . мне нужно именно макросом а не функцией! Я же спрашиваю конкретно как прописать такой макрос))))) Мне не подходит ВПР! конечно это проще и им бы я и сама могла сделать.



0



6875 / 2807 / 533

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

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

12.02.2015, 18:59

13

Запишите рекордером простановку этой ВПР() и замену её на значение (с полными путями к файлу), подправьте по вкусу.
Но может будут и другие предложения, я предлагаю как проще и чтоб быстрее работало.



0



Alexander_LA

0 / 0 / 0

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

Сообщений: 8

04.08.2015, 10:32

14

Помогите пожалуйста найти ошибку:

Код открывает выбранный пользователем файл и копирует данные из него в заданное место. Но работало-работало и вдруг перестало, не могу понять в чем дело. Выдает то out of range, то error 1004.

P.S. Таких кнопок считывающих данные с других файлов 4, вставляют на 4 разных листа.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Sub Кнопка2_Щелчок() ' Загрузка предварительной заявки 
    MainName = ActiveWorkbook.Name
    If Cells(3, 3) <> Empty Then
    MsgBox "Очистите поле"
    Exit Sub
    Else
adres_svod_zayavka_rb = GetFilePath("Выберите файл Предварительной заявки", , "Документы Excel", "*.xlsx, *.xls") ' запрашиваем имя файла
    If adres_svod_zayavka_rb = "" Then Exit Sub    ' выход, если пользователь отказался от выбора файла
    Workbooks.Open Filename:=adres_svod_zayavka_rb
    Filename = ActiveWorkbook.Name
    Workbooks(Filename).Worksheets("Лист1").Range("A1:LA200").Copy
    With Workbooks(MainName)
        .Activate
        .Worksheets("Заявка РБ").Range("С2:LC201").PasteSpecial Paste:=xlPasteValues
    End With
    Application.CutCopyMode = False
    Workbooks(Filename).Close SaveChanges = False
    Cells(2, 2).Select
    End If
End Sub
 
Function GetFilePath(Optional ByVal Title As String = "Выберите файл для загрузки", _
                     Optional ByVal InitialPath As String = "c:", _
                     Optional ByVal FilterDescription As String = "Книги Excel", _
                     Optional ByVal FilterExtention As String = "*.xls*") As String
    ' функция выводит диалоговое окно выбора файла с заголовком Title,
    ' начиная обзор диска с папки InitialPath
    ' возвращает полный путь к выбранному файлу, или пустую строку в случае отказа от выбора
    ' для фильтра можно указать описание и расширение выбираемых файлов
    On Error Resume Next
    With Application.FileDialog(msoFileDialogOpen)
        .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
        .Filters.Clear: .Filters.Add FilterDescription, FilterExtention
        If .Show <> -1 Then Exit Function
        GetFilePath = .SelectedItems(1): PS = Application.PathSeparator
    End With
End Function



0



6875 / 2807 / 533

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

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

04.08.2015, 11:00

15

1. А нет ли MISSING в референсах ВБА?
2. Я бы не использовал переменную Filename
3. Код можно чуть подправить, избавиться от селектов, активаций и даже копи.



0



0 / 0 / 0

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

Сообщений: 8

04.08.2015, 11:01

16

Цитата
Сообщение от Hugo121
Посмотреть сообщение

MISSING в референсах

простите, а что это?

Цитата
Сообщение от Hugo121
Посмотреть сообщение

Код можно чуть подправить, избавиться от селектов, активаций и даже копи.

как?



0



Hugo121

6875 / 2807 / 533

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

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

04.08.2015, 11:09

17

Вроде где-то так (не проверял ессно…)

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub Кнопка2_Щелчок() ' Загрузка предварительной заявки
Dim wb As Object, a()
    If Cells(3, 3) <> Empty Then
    MsgBox "Очистите поле"
    Exit Sub
    Else
    adres_svod_zayavka_rb = GetFilePath("Выберите файл Предварительной заявки", , "Документы Excel", "*.xlsx, *.xls") ' запрашиваем имя файла
    If adres_svod_zayavka_rb = "" Then Exit Sub    ' выход, если пользователь отказался от выбора файла
    Set wb = Workbooks.Open(adres_svod_zayavka_rb)
    a = wb.Worksheets("Лист1").Range("A1:LA200").Value
    wb.Close 0
    Worksheets("Заявка РБ").Range("С2").Resize(UBound(a), UBound(a, 2)).Value = a
    End If
End Sub

Добавлено через 2 минуты

Цитата
Сообщение от Alexander_LA
Посмотреть сообщение

простите, а что это?

В редакторе VBA идёте Tools->References и смотрите — если есть, то снимаете галки или устанавливаете компоненты.



0



0 / 0 / 0

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

Сообщений: 8

04.08.2015, 11:28

18

С одним файлом сработало, а второй — снова выдал out of range.



0



6875 / 2807 / 533

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

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

04.08.2015, 11:31

19

Подозреваю что не те файлы открываете… *.xls нужно исключить, не уследил, виноват…



0



0 / 0 / 0

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

Сообщений: 8

04.08.2015, 11:44

20

Цитата
Сообщение от Hugo121
Посмотреть сообщение

*.xls нужно исключить, не уследил, виноват…

Да вроде уже открывает и *.xls. Чего с ним могут быть проблемы?

По моему помогло! Спасибо большое!

А может еще подскажете как втянуть строки из txt файла по этому же принципу?



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

Сообщений: 92,604

04.08.2015, 11:44

20

Понравилась статья? Поделить с друзьями:
  • Excel миф как скопировать лист в excel на другой лист
  • Excel месяц строка в дату если
  • Excel миф как обратиться к ячейке
  • Excel месяц с нулем
  • Excel миф как закрасить ячейку