Remkomplekty.ru

IT Новости из мира ПК
3 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Excel vba copy

Каков «правильный» способ копирования данных в VBA?

3 Rawrplus [2018-08-13 19:35:00]

Вопрос о большей теоретической цели:

Каков «правильный» способ копирования данных в vba/excel-vba?

Теперь, по крайней мере, насколько мне известно, эти три являются единственными доступными методами:

Теперь я сделал свое исследование, это плюсы и минусы метода .Copy([Destination]) и .Paste([Destination, Link]) , в наименьшей степени, о котором я могу думать:

  • позволяет нам вставлять данные в том же выражении, что и копирование (читаемость кода, я думаю. )
  • Ссылки на ячейки — это полное отсутствие!
  • Ваше форматирование и формулы могут быть испорчены
  • Если диапазон перекрывается, он будет отображать подсказку, эффективно останавливая макрос мертвых на своих дорожках (что огромный облом, особенно если вы пытаетесь что-то автоматизировать)
  • Хуже того, если вы нажмете » Cancel в приглашении, он выдает Error ** (если не обрабатывается)

С другой стороны монеты, .PasteSpecial()

  • PasteSpecial() позволяет вставлять определенную часть диапазона!
  • это позволяет нам указать, какой тип пасты мы хотим сделать
  • имеет встроенные функции skipBlanks и transpose
  • не «так» Error -prone .

и я изо всех сил пытался придумать, но:

  • бит больше символов, чтобы писать.

Теперь это заставляет меня поверить, что аргумент Destination метода .Copy() должен по существу игнорироваться, а PasteSpecial() всегда должен использоваться.

Есть ли когда-либо случай, когда использование этого может быть предпочтительнее .PasteSpecial() ? Или должен ли PasteSpecial() быть нормой для каждой операции копирования-вставки?

performance vba excel-vba copy-paste excel

1 ответ

8 Решение Mathieu Guindon [2018-08-13 20:29:00]

Это не о читаемости или о том, сколько символов вы печатаете. Это о том, чего вам нужно достичь.

Другими словами, это абсолютно не субъективно или основано на мнениях, а похожее на все остальное в программировании.

#Это зависит.

Если вы используете Excel и скопируйте ячейки вокруг, используете ли вы Ctrl + C и Ctrl + V или используете специальные вставки?

Зависит от того, что вам нужно делать.

Если вы хотите скопировать ячейку, ее значение, форматы, проверки данных, границы и т. Д.; то .Paste [Destination] — ваш лучший друг. То, что программный эквивалент Ctrl + C / Ctrl + V . эквивалентен PasteSpecial/All, который .Paste [Destination] с момента .Paste [Destination] уже делает все, что вам нужно, чтобы делать в этом случае.

Ссылки на ячейки — это полное отсутствие!

Абсолютно. Плохо закодированные ссылки на ячейки плохо. .Paste [Destination] не заставляет вас делать это в любом случае, так что точка спорная.

Если диапазон перекрывается, он будет отображать подсказку, эффективно останавливая макрос мертвых на своих дорожках

Диапазон копирования и вставки не может совпадать, период. Вы получите эту подсказку через .PasteSpecial .

Если вы имеете в виду, чтобы скопировать ячейки Value , но не свои форматы, проверку данных, границы и т.д.; то .PasteSpecial , безусловно, лучше, так что программный эквивалент собирается вставлять специальное/значение — кроме него, вероятно, более эффективными, чтобы просто присвоить ячейки Value с тем, что вы хотите (нет необходимости туда-обратно в/из буфера обмена); OTOH, если вы действительно хотите вставлять форматы, валидации данных или что-то еще, то это, вероятно, самый простой способ.

Paste не «испортит» форматы. Он делает именно то, что это значит. Paste и PasteSpecial не являются эквивалентами. Используйте правильный инструмент для работы. В буквальном смысле это программные эквиваленты «paste» и «paste special», соответственно — если вы находитесь в Excel и систематически «вставляете специальные», вы получите свои вещи. Но каждый раз, когда вы делаете это, чтобы «вставить все», вы работаете больше, чем вам нужно.

PasteSpecial выглядит как хороший молот, но не все это гвоздь. Когда вы можете избежать записи в буфер обмена, как правило, это хорошая идея, чтобы избежать этого. но опять же, если вы имеете дело с огромными наборами данных (думаю, ячейки 100K+), возможно, что он работает лучше, чем просто назначать ценности.

@ScottCraner Я действительно думал об этом, но это не совсем копирование, но более типичный указатель, ссылающийся, поэтому я решил не включать его в мой вопрос. Я не хотел открывать книгу для обсуждения «то, что считается копированием».

Это не правильно. .Range(foo).Value =.Range(bar).Value не является «типичным ссылкой указателя». Он буквально принимает значения foo в 2D-вариантный массив и выгружает этот 2D-массив вариантов на bar , перезаписывая ранее сохраненные значения. Таким образом, это абсолютно PasteSpecial буфера обмена — но вам нужно будет протестировать и сравнить с Copy + PasteSpecial чтобы убедиться, что это лучшее (/наиболее эффективное) решение для вашей ситуации:

How to duplicate sheet in Excel with VBA

by Svetlana Cheusheva | updated on March 16, 2020 16 Comments

The tutorial provides a collection of macros to duplicate sheets in Excel: copy and rename based on cell value, copy multiple sheets, copy an active worksheet to another file without opening it, and more.

Manually copying sheets in Excel is pretty quick and straightforward. if performed just once or twice. Duplicating multiple sheets multiple times is boring and time consuming. On this page, you will find a handful of useful macros to automate this task.

Excel VBA to copy sheet to new workbook

This simplest one-line macro does exactly what its name suggests — copies the active sheet to a new workbook.

Copy multiple sheets in Excel with VBA

If you’d like to copy several sheets from the active workbook to a new one, select all the worksheets of interest and run this macro:

Excel VBA to copy sheet to another workbook

Depending on where you want to insert the copied sheet, use one of the following macros.

Copy sheet to the beginning of another workbook

This macro copies the active sheet before all other worksheets in the destination file, Book1 in this example. To copy to another file, replace «Book1.xlsx» with the full name of your target workbook.

Copy sheet to the end of another workbook

This piece of code duplicates the active worksheet and places the copy to the end of Book1. Again, please remember to replace «Book1.xlsx» with the name of your destination workbook.

Copy sheet to a selected workbook

To be able to copy the current sheet to any open workbook, you can create a UserForm (named UserForm1) with a ListBox control (named ListBox1) and two buttons:

Next, double-click the form and paste the below code in the Code window:

With the UserForm in place, you can use one of the following macros to copy the active sheet to the workbook of your choosing.

Copy sheet to the beginning of the selected workbook:

Copy sheet to the end of the selected workbook:

When run in Excel, the macro will show you a list of all currently opened workbooks. You select the needed one and click OK:

Excel macro to copy sheet and rename

When you copy a sheet in Excel, the replica is given a name in the default format like Sheet1 (2). The following macros can spare you the trouble of changing the default name manually.

This code duplicates the active worksheet, names the copy as «Test Sheet» (you are free to replace it with any other name you like), and places the copied sheet at the end of the current workbook.

To allow the user to specify the name for the copied sheet, use this code:

Upon running, the macro displays the following input box, in which you type the desired name and press OK:

Excel macro to copy sheet and rename based on cell value

In some situations, it may be more convenient to name a copy with a specific cell value, for example, a column header. For this, you simply take the above code and supply the value of the currently selected cell to the input box automatically. As with the previous example, the copy will be placed at the end of the active workbook.

Читать еще:  Vba excel как закомментировать несколько строк

The trickiest part would be to have your users always select the correct cell before running the macro 🙂

Alternatively, you can hardcode the address of the cell by which the copy should be named, cell A1 in the below code. To name the copied worksheet based on another cell, replace A1 with an appropriate cell reference.

Macro to copy worksheet to a closed workbook

This macro copies the active sheet to the end of a closed workbook. The name of another workbook is not specified in the code — the macro will open the standard Windows Explorer window and allow you to choose any destination file:

After you select the file and click Open, the macro will copy the active sheet and close the target workbook automatically.

Excel VBA to copy sheet from another workbook without opening

This macro enables you to copy a worksheet from another Excel file without opening it. The copied sheet will be inserted at the end of the current workbook.

Just remember to make a couple of replacements in the code:

  • C:UsersXXXDocumentsTarget_Book.xlsx should be changed to the actual path and name of the workbook from which you want to copy a sheet.
  • Sheet1 should be replaced with the name of the sheet you want to copy.

Excel VBA to duplicate sheet multiple times

Sometimes, you may need to duplicate the same sheet more than once, for instance to test different formulas on the same data set. This can be easily done with the following macro.

Open the original sheet, run the macro, specify how many copies of the active sheet you want to make, and click OK:

How to duplicate sheets in Excel with VBA

To copy a sheet in Excel with one of the above macros, you can either insert the VBA code into your own book or run a macro from our sample workbook.

How to add a macro to your workbook

To insert the code in your workbook, perform these steps:

  1. Open the worksheet you want to copy.
  2. Press Alt + F11 to open the Visual Basic Editor.
  3. On the left pane, right-click ThisWorkbook, and then click Insert >Module.
  4. Paste the code in the Code window.
  5. Press F5 to run the macro.

For the detailed step-by-step instructions, please see How to insert VBA code in Excel.

How to run a macro from our sample workbook

Alternatively, you can download our sample workbook to Duplicate Excel Sheets and run the code from there.

The sample workbook contains the following macros:

CopySheetToNewWorkbook — copies the current worksheet to a new workbook.

CopySelectedSheets — copies multiple sheets that you select to a new workbook.

CopySheetToBeginningAnotherWorkbook — copies the active sheet to the beginning of another workbook.

CopySheetToEndAnotherWorkbook — copies the active sheet to the end of another Excel file.

CopySheetAndRename — duplicates the current sheet, renames it as specified by the user, and puts the copy after all other sheets in the current workbook.

CopySheetAndRenamePredefined — duplicates the active sheet, gives a hardcoded name to the copy and places it at the end of the current workbook.

CopySheetAndRenameByCell — makes a copy of the active sheet and renames it based on the selected cell value.

CopySheetAndRenameByCell2 — copies the active sheet and renames it based on the hardcoded cell address.

CopySheetToClosedWorkbook — allows you to copy sheet to a closed workbook.

CopySheetFromClosedWorkbook — enables you to copy a sheet from another Excel file without opening it.

DuplicateSheetMultipleTimes — lets you duplicate a sheet in Excel multiple times.

To run the macro in your Excel, just do the following:

  1. Open the downloaded workbook and enable the content if prompted.
  2. Open your own workbook and navigate to the sheet you want to copy.
  3. In your worksheet, press Alt + F8 , select the macro of interest, and click Run.

That’s how you can duplicate a sheet in Excel with VBA. I thank you for reading and hope to see you on our blog next week!

Как средствами 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 при раннем связывании следует так:

Читать еще:  Data mining excel

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

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

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

VBA .copy destination

LinkBack
Thread Tools
Rate This Thread
Display
  • Linear Mode
  • Switch to Hybrid Mode
  • Switch to Threaded Mode

VBA .copy destination

I have this code:

Worksheets(«Sheet1»).Range(«A1:D4»).Copy _
destination:=Worksheets(«Sheet2»).Range(«E5»)

doing it this way copies the formatting as well, is there a way to copy just the value over without the cell format?

Thanks in advance

Re: VBA .copy destination

dim RngToCopy as range
Dim DestCell as range

set rngtocopy = worksheets(«Sheet1».range(«a1:d4»)
set destcell = worksheets(«sheet2»).range(«E5»)

destcell.resize(rngtocopy.rows.count,rngtocopy.columns.count).value _
= rngtocopy.value

========
Another way is to just copy|paste special|values

dim RngToCopy as range
Dim DestCell as range

set rngtocopy = worksheets(«Sheet1».range(«a1:d4»)
set destcell = worksheets(«sheet2»).range(«E5»)

rngtcopy.copy
destcell.pastespecial paste:=xlpastevalues

jerredjohnson wrote:
>
> I have this code:
>
> Worksheets(«Sheet1»).Range(«A1:D4»).Copy _
> destination:=Worksheets(«Sheet2»).Range(«E5»)
>
> doing it this way copies the formatting as well, is there a way to copy
> just the value over without the cell format?
>
> Thanks in advance
>
> —
> jerredjohnson
> ————————————————————————
> jerredjohnson’s Profile: http://www.excelforum.com/member.php. o&userid=32236
> View this thread: http://www.excelforum.com/showthread. hreadid=562642

Re: VBA .copy destination

to copy just the values you don’t need to copy. try
Worksheets(«Sheet2»).Range(«E5:h9»).value= _
Worksheets(«Sheet1»).Range(«A1:D4»).value
ranges must be the same size

Don Guillett
SalesAid Software
dguillett1@austin.rr.com
«jerredjohnson»
wrote in message
news:jerredjohnson.2b5uch_1153258508.578@excelforum-nospam.com.
>
> I have this code:
>
> Worksheets(«Sheet1»).Range(«A1:D4»).Copy _
> destination:=Worksheets(«Sheet2»).Range(«E5»)
>
> doing it this way copies the formatting as well, is there a way to copy
> just the value over without the cell format?
>
> Thanks in advance
>
>
> —
> jerredjohnson
> ————————————————————————
> jerredjohnson’s Profile:
> http://www.excelforum.com/member.php. o&userid=32236
> View this thread: http://www.excelforum.com/showthread. hreadid=562642
>

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

VBA Copy a file with FSO CopyFile

The VBA Tutorials Blog

Intro to VBA FSO CopyFile

The FSO CopyFile method is a quick VBA way to copy a file from one location to another. Use the VBA CopyFile FileSystemObject (FSO) to copy a file to another folder. The FSO is part of Windows Script Host which provides scripting abilities like batch files.

If you haven’t already done so, check out our Introduction to the VBA FileSystemObject for a general introduction to the FSO and all its functions.

Even though copying a file sounds easy enough, there are surprisingly many potential pitfalls associated with it. For this reason, it should be emphasized right from the outset that you should always incorporate error handling into your code when you’re accessing a computer’s file system.

In this tutorial we’ll first present the basic setup for copying a file with the FSO CopyFile function and then we’ll show you exactly how to invoke this function. After this, to help you avoid the potential pitfalls, we’ll also present a more sophisticated procedure which includes error handling. This will ensure that you don’t make mistakes when you’re handling your own files.

With this in mind, let’s start with the basic setup!

Basic setup — VBA FSO CopyFile

Note, before you run the code below, you must first make sure that “Microsoft Scripting Runtime” is ticked under Options > Tools > References… in the Visual Basic Editor.

Next, insert the code below into a standard code module:

VBA Copy a File Macro

Make powerful macros with our free VBA Developer Kit

It’s easy to copy and paste a macro like this, but it’s harder make one on your own. To help you make macros like this, we built a free VBA Developer Kit full of pre-built macros so you can master file I/O, arrays, strings and more — grab a copy below.

CAUTION: The procedure above contains no safeguards (error handling) and it is not recommended to use the functions of the FileSystemObject this way, unless you know exactly what you’re doing! Later in this tutorial, we’ll show you an augmented CopyFile procedure which incorporates error handling.

You invoke the procedure like this:

The first parameter, “C:MyFilesTest.xlsm” is the source file to be copied. Note, you must specify the full path to the file, starting with the drive name.

The second parameter, “C:MyBackup», is the path to the destination folder. Notice the backslash at the end of the path. Without it, the procedure will copy the file to the preceding folder in the specified destination path, in this case the root of the C-drive, but the copied file will not have any extension!

The third parameter, False is a Boolean type variable which specifies whether or not you want to overwrite any existing file by the same name in the destination folder. If set to False, it means you don’t want to overwrite. When set to True, it means you do. This is very nifty, if you regularly backup the same file to a particular folder.

If you set this parameter to False and a file by the same name already exists in the destination folder, a run-time error will occur when you run the procedure, unless you incorporate error handling into your code.

One beauty of the FSO CopyFile function is that you can simultaneously copy a file and rename it in the new destination. You can use this basic macro to copy a file from one location to another while renaming it in the final destination folder by calling the CopyFile macro like this:

Читать еще:  Вырезать музыку из видео онлайн ютуб

In the next section, we’ll show you how to deal with all kinds of error handling contingencies!

FSO CopyFile Safeguards

It should be clear by now that you’re asking for trouble if you haphazardly try to use the FSO functions without safeguards or error handling. To discourage you from doing so, here’s a quick rundown of the problems you may encounter.

The following errors will throw an exception at run-time and cause the CopyFileWithFSOBasic procedure to halt:

  • If you fail to specify the entire path to the source file correctly.
  • If you attempt to copy the file to a destination folder that doesn’t already exist.
  • If you attempt to copy a file by the same name as a file which already exists in the destination folder without setting the Overwrite parameter to True.
  • If you try to overwrite a file in the destination folder which is open in another program or by another user on a shared network drive. In this case you’ll get a “Run-time error 70 permission denied” message, regardless of whether the Overwrite parameter was set to True or False.

Moreover, a forgotten backslash at the end of the destination path will create a file with no extension in the previous component of the destination path. This is not a run-time error, but it’s also not exactly the result you expected! In many ways, this is worse than a run-time error because you may think the program ran to completion, completely oblivious to the fact that it didn’t copy the file where you wanted it.

With this in mind, let’s introduce a new, more advanced, procedure which includes handling of all the above-mentioned errors.

Advanced FSO CopyFile Macro

When you execute the procedure above, you’ll either get a success message or an error message, depending on whether or not you specified the parameters to the procedure correctly. One limitation of the advanced CopyFileWithFSO macro is that you can’t rename the file when copying it, like you can with the CopyFileWithFSOBasic macro presented at the top of this tutorial. That’s just a byproduct of the error handling logic, but you can change it if you like!

If you did everything correctly, a reassuring message like this will appear:


VBA CopyFile Success Message

CopyFile FSO Error Handling

However, if you didn’t get the success message, another message box was displayed to you explaining what went wrong. Let’s go through these error messages and explain the additional FSO functions we sprinkled into the CopyFileWithFSO procedure to detect potential errors in the parameters passed to it.

  • Does the source file exist?
    • We use the FSO .FileExists function to test this. Next, we check if the root drive was specified in the file path. If not, we use the .BuildPath function to create a complete path and then prompt the user if they’ll accept the new path before moving on. If the user doesn’t accept this suggestion, the procedure terminates with an error message explaining why it terminated.
  • Does the destination folder already exist?
    • We use the FSO .FolderExists function to test this. If the folder doesn’t exist, we prompt the user if they want to create it. If they click OK, we use the FSO .CreateFolder function to create the folder and proceed to the error check. If the user clicks Cancel, the procedure terminates with an error message explaining why it terminated.
  • Does the file already exist in the destination folder?
    • Again, we use the .FileExists FSO function for testing, but we then move on to test if the OverWrite parameter of the procedure was set to True or False . If a file by the same name as the source file already exists in the destination folder and the parameter was set to False (i.e. “don’t overwrite”), the procedure terminates with an error message explaining why it terminated.
  • Given a file by the same name as the source file already exists in the destination folder, is this file locked for editing by another application or user?
    • This is only relevant if the OverWrite parameter has been set to True . Unfortunately, neither the standard Excel functions, the FSO nor any other intuitive object library includes a function for determining whether a file is already open. Thus, the easiest way to check this is to wrap the FSO .FileCopy function with On Error Resume Next and On Error Goto 0 . If the file in the destination folder we’re trying to overwrite is locked for editing, it cannot be overwritten and attempting to do so will normally cause an error at run-time. However, with the On Error Resume Next statement, we tell Excel to ignore errors and we collect the description of any error we encounter with the Err.Description property of the Err object. Again, if the procedure encounters an error, it terminates with an error message explaining why it terminated. On a final note, it should be mentioned that source files that are locked for editing can be copied!

Next, let’s discuss some intriguing and powerful applications of the CopyFile function and the CopyFileWithFSO procedure!

CopyFile VBA Ideas

There are two common purposes for using the CopyFile function:

  • Backup of files. Perhaps you want to automatically back up files that meet your specified criteria without manually accessing their containing folders yourself? No problem! Even if you want to back up several files in one batch, you can now easily write a procedure which specifies your source files and then calls the CopyFile function repeatedly.
  • Collection of data. For instance, suppose you want to distribute an Excel Workbook to your coworkers with the purpose of collecting data from them to be stored on a shared network drive. To this end, you could write a procedure with a file picker dialog box that lets the user specify the files you’ve requested. After parsing the specified files, you could then copy them to the appropriate network destination folders.

Look forward future tutorials where you’ll learn about other specific applications of the FSO and how to incorporate safeguards into them!

If you haven’t already done so, please subscribe to my free wellsrPRO VBA Training Program using the form below. It’s worth it!

Oh, and if you have a question, post it in our VBA Q&A community.

The best free VBA training on the web
I see people struggling with Excel every day and I want to help. That’s why I’m giving away my 90-days to Master VBA eCourse and my entire personal macro library for free.

Over 2 million people use our VBA tutorials each year to help automate their work. Are you ready to reclaim your time, too? Grab our VBA Cheat Sheets and you’ll be writing macros like a professional. With over 180 tips and 135 macro examples, they include everything you need to know to become a great VBA programmer.

This article was written by Michael H. Sorensen, a contributing writer for The VBA Tutorials Blog.

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector
×
×