Vba сохранить файл в формате csv
CSV is an abbreviation of Comma Separated Value. As the name suggests, it is clear that this file stores the tabular data in a format where data is separated by comma.
Interestingly, CSV is also a plain text file type. Here each line represents a row and each value separated by comma, resides in columns.
Important Note: Since comma is used as delimiter in CSV file – so what if your data itself has comma (,) as a value? To overcome this issue, CSV file format, stores such values within double quotes (” “) and then separated by comma(,).
Let’s get started then…
In this article, following are the methods which I am using to Export Excel data i CSV format.
1. Export ActiveWorkSheet as CSV file
2. VBA to export Excel Range to CSV File [Method 1]
3. VBA to export Excel Range to CSV File [Method 2]
4. VBA to Export Excel Table as CSV File
Before we go in to details, I would like to recommend you guys to go through following tutorials – this will help you in understanding the code better –
In following tutorial about interaction with text files through Excel VBA, we have talked a lot about creating new text files, exporting data from an Excel Range to Text file and so many other different topics.
VBA Guide to Interact with Text Files – Part – 1
VBA Guide to Interact with Text Files – Part – 2
Advantages of this method
1. This is a very simple and quickest method to export your Excel data to a CSV file.
2. No extra coding required in order to maintain the comma delimiter or double quotes etc. Excel does it by itself.
At the same time, this method has some short comings or challenges as well.
Drawbacks of this Method
1. In this method, data from ActiveSheet is saved as CSV file only. It ignores rest other sheets and its data.
2. You do not have control over data – which one to be exported or ignored. It will export every single data from the sheet to CSV format.
For example: If you have some blank rows at the beginning of the sheet etc., which you do not want to save it in CSV, it is not possible to ignore them. It will still save those lines as blank values in the CSV.
Best case when it should be used?
This is the best option, when your excel sheet has, the only data which you want to export it as a CSV file. That means it does not have any other data which you want to ignore while exporting it to csv.
VBA Code
Explanation of the Code
This method is simply using the SaveAs feature of ActiveSheet to CSV format. Rest is self explanatory.
Advantages of this method
This method overcomes both the challenges of the first Method.
1. Here you have full control over which all data you want to be part of your CSV file.
2. You can read data from random places and even from different sheets as well.
3. You can use your own delimiter – For example: instead of comma, you may use semicolon(;)
Drawbacks of this Method
1. The only shortcoming with this method, as compared to first method, is it has few more lines of code and execution time will be more because you are reading data for each row and column and putting them together in CSV file – separating them by comma.
Best case when it should be used?
1. When your data is scattered
2. You want to have control over data (Format check, some transformation logic etc.)
VBA Codes
Explanation of above Code
In above code, I am doing the following:
1. It is a simple for loop, using which I am concatenating each row and columns data separated by comma (,)
2. Print each rows data in csv file.
3. That’s all… your csv file is ready to use
If you want a specific range or Table to be exported as CSV from a Worksheet, which has lot more other data as well that you want to ignore, then this method should be used. Most importantly data is huge and chances are that your data might have comma (,) or double quotes (” “) as part of values.
How this method works?
Step 1: Copy the Range or Table data in to a New WorkSheetat Cell A1
Step 2: Now this new Worksheet has “the only data” which you want to save as CSV, therefore, apply method 1 and saveAs this WorkSheet as CSV file.
Best case when it should be used?
1. When you have a clear range of data which you want to export as csv
2. Data is large enough.
3. When there are chances that your data might have comma or double quotes as a value
VBA Code
VBA Code Explanation
Above VBA Code is doing the followings:
1. Copy the Range from your Excel Sheet – rngToSave
2. Create a new Excel Workbook
3. Paste the Copied range data in to the first sheet of the workbook from A1 cell – .Sheets(1).Range(“A1”).PasteSpecial xlPasteValues
4. SaveAs this new workbook as CSV file
5. You are done Now 🙂
This is the simplest method to save an excel table to CSV format. Most importantly – your data must NOT have comma (,) as part of values. In such case, you should use above method – 3.
VBA for saving Excel Table as CSV
Explanation about the VBA Code above
Above code is doing the following
1. Storing the whole content of your table into a two dimensional array – tblArr
2. For each row – extract the data in to one dimensional array rowArr
3. Join all the data of single dimensional array by using comma as delimiter and store it in to a variable – csvVal
4. Print this comma separated data in the csv file (which was created)
5. Repeat this process for each row of the table – For loop is used to do so
I have tried covering all possible methods to export your excel data to CSV format.
I would really appreciate, if you provide your feedback. Do let me know by writing your comment here in the comment section of this article.
Про сборку листов из нескольких книг в одну текущую я уже писал здесь. Теперь разберем решение обратной задачи: есть одна книга Excel, которую нужно "разобрать", т.е. сохранить каждый лист как отдельный файл для дальнейшего использования.
Примеров подобного из реальной жизни можно привести массу. Например, файл-отчет с листами-филиалами нужно разделить на отдельные книги по листам, чтобы передать затем данные в каждый филиал и т.д.
Если делать эту процедуру вручную, то придется для каждого листа выполнить немаленькую цепочку действий (выбрать лист, правой кнопкой по ярлычку листа, выбрать Копировать, указать отдельный предварительно созданный пустой файл и т.д.) Гораздо проще использовать короткий макрос, автоматизирующий эти действия.
Способ 1. Простое разделение
Нажмите сочетание Alt+F11 или выберите в меню Сервис - Макрос - Редактор Visual Basic (Tools - Macro - Visual Basic Editor) , вставьте новый модуль через меню Insert - Module и скопируйте туда текст этого макроса:
Если теперь выйти из редактора Visual Basic и вернуться в Excel, а затем запустить наш макрос (Alt+F8), то все листы из текущей книги будут разбиты по отдельным новым созданным книгам.
Способ 2. Разделение с сохранением
При необходимости, можно созданные книги сразу же сохранять под именами листов. Для этого макрос придется немного изменить, добавив команду сохранения в цикл:
Этот макрос сохраняет новые книги-листы в ту же папку, где лежал исходный файл. При необходимости сохранения в другое место, замените wb.Path на свой путь в кавычках, например "D:\Отчеты\2012" и т.п.
Если нужно сохранять файлы не в стандартном формате книги Excel (xlsx), а в других (xls, xlsm, xlsb, txt и т.д.), то кроме очевидного изменения расширения на нужное, потребуется добавить еще и уточнение формата файла - параметр FileFormat:
Для основных типов файлов значения параметра FileFormat следующие:
- XLSX = 51
- XLSM = 52
- XLSB = 50
- XLS = 56
- TXT = 42
Способ 3. Сохранение в новые книги только выделенных листов
Если вы хотите раскидать по файлам не все листы в вашей книге, а только некоторые, то макрос придется немного изменить. Выделите нужные вам листы в книге, удерживая на клавиатуре клавишу Ctrl или Shift и запустите приведенный ниже макрос:
Создавать новое окно и копировать через него, а не напрямую, приходится потому, что Excel не умеет копировать группу листов, если среди них есть листы с умными таблицами. Копирование через новое окно позволяет такую проблему обойти.
Способ 4. Сохранение только выделенных листов в новый файл
Во всех описанных выше способах каждый лист сохранялся в свой отдельный файл. Если же вы хотите сохранить в отдельный новый файл сразу группу выделенных предварительно листов, то нам потребуется слегка видоизменить наш макрос:
Способ 5. Сохранение листов как отдельных PDF-файлов
- для этого используется уже другой метод (ExportAsFixedFormat а не Copy)
- листы выводятся в PDF с параметрами печати, настроенными на вкладке Разметка страницы (Page Layout)
- книга должна быть сохранена на момент экспорта
Нужный нам код будет выглядеть следующим образом:
Способ 6. Готовый макрос из надстройки PLEX
Если лень или нет времени внедрять все вышеописанное, то можно воспользоваться готовым макросом из моей надстройки PLEX:
Добрый день!
Мне нужно выполнить в Access запрос и сохранить результаты его работы в файл CSV, средствами VBA.
Пока решил делать так:
1) создать таблицу с данными;
2) экспортировать ее в CSV.
Первую часть наверное сделаю так:
Подскажите как экспортировать tbl_1 в файл?
Или может быть это вообще надо делать как-то по другому?
Запросы делаю VBA потому, что такие выгрузки нужно будет делать часто. Общее количество файлов SCV будет порядка 50.
Добавлено через 3 часа 9 минут
Пока нашел как выгрузить запрос в Excel
Если вызывать процедуру с аргументом "Запрос2" то все работает.
Если вместо "Запрос2" передавать текст SQL-запроса, то возникает ошибка
Спасибо всем, кто поможет!
Сохранить результаты запроса (несколько млн. записей в csv)
Коллеги, здравствуйте! Подскажите ответ на данный вопрос. Мне нужно извлечь записи, количество.
Как сохранить результаты SQL-запроса в таблицу?
Как сохранить рез-ты SQL в таблицу? В SQL FoxPro для этого есть пишетс . Заранее спасибо.
Можно,ли сохранить результаты запроса(recordset) в переменной сеанса?
Можно,ли сохранить результаты запроса(recordset) в переменной сеанса
Как сохранить VBA-массив в CSV-файл без Excel
Как можно сохранить VBA-массив в CSV-файл без использования Excel? Сейчас я сначала вставляю.
Решение
CurrentDb.QueryDefs("Запрос2").SQL="SELECT TOP 25 FR2020.F0 FROM FR2020"
перезапишет запрос
там еще кооманда естьв DoCMD.
Добавлено через 8 минут
snipe, Спасибо еще раз!
В итоге у меня получился такой код:
1) Обработка нажатия кнопки на форме:
Изменение запроса SQL средствами VBA
Доброго всем времени суток. Знаю, что тема избитая, но тут либо я тупой, Толи лыжи не едут. .
Возможно ли средствами VBA узнать условия фильтра таблицы/запроса?
Добрый день! Кто-нибудь знает, возможно ли средствами VBA определить, по каким полям и какими.
Добавить возможность сохранить свои результаты в файлах, а также возможность получать результаты из файлов
Не работает программа. Ошибка: "Unreachable code". А сама программа без возможности сохранения.
Вывод на экран csv формат средствами с++
Здравствуйте! Подскажите как это реализовать? Заранее благодарен!
Конвертация csv в xml средствами php
Доброго времени. Подскажите как корректно сконвертировать файл CSV в формат XML. Есть файл на.
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Сохраняет изменения в книге в другой файл.
Параметры
Имя сохраняемого файла. Можно включить полный путь; если этого не сделать, Microsoft Office Excel сохранит файл в текущей папке.
Одно из значений XlFileFormat, указывающих формат файла для использования при сохранении файла. Для существующего файла используемым по умолчанию форматом является последний заданный для этого файла формат, для нового файла — формат используемой версии Excel.
Строка, для которой учитывается регистр, (длиной не более 15 символов) определяющая защитный пароль, который будет назначен файлу.
Пароль защиты от записи для данного файла. Если файл сохранен с паролем и при его открытии пароль не введен, этот файл открывается только для чтения.
Значение true для создания файла резервной копии.
Одно из значений перечисления XlSaveAsAccessMode.
Одно из значений перечисления XlSaveConflictResolution.
Значение true , чтобы добавить данную книгу в список недавно использовавшихся файлов. Значение по умолчанию — false .
Игнорируется для всех языков в Microsoft Excel.
Примечание. При сохранении книги в Excel в одном из форматов CSV-файла или текстовых форматов, указанных с помощью параметра FileFormat , он использует кодовую страницу, соответствующую языку используемого языка системы на текущем компьютере.
Игнорируется для всех языков в Microsoft Excel.
Примечание. При сохранении книги в Excel в одном из форматов CSV-файла или текстовых форматов, указанных с помощью параметра FileFormat , он сохраняет эти форматы в логической структуре. Если текст, направленный слева направо, внедряется в текст, направленный справа налево, в файле или наоборот, логическая структура сохраняет содержимое файла в правильном порядке чтения для всех языков в файле независимо от направления. Если приложение используется для открытия файла, символы в каждой последовательности символов отображаются в правильном направлении согласно диапазонам значений символов в пределах кодовой страницы. (Если файл не открыт в приложении, таком как отладчик или редактор, предназначенном для отображения точной структуры памяти файла.)
Значение true — сохранение файлов с языковыми настройками Excel (включая параметры панели управления). Значение false (по умолчанию) — сохранение файлов с языковыми настройками VBA.
Комментарии
Visual Studio не поддерживает сохранение книги в качестве общей книги.
Необязательные параметры
Дополнительные сведения о необязательных параметрах см. в разделе необязательные параметры в решениях Office.
I copy data into a spreadsheet, use VBA to format it, then save that sheet into a CSV file.
I use the following code:
ws is the worksheet that I saved.
This gives me a comma-delimited CSV file.
I would like to save that sheet into a semicolon-delimited file.
I found the following:
- Go to Start>Settings>Regional And Language Options
- Click on the Customize button
- Next to List Separator type in a semi-colon (;)
I followed the procedure above and changed my code to:
I still get a comma-delimited CSV file as output.
I am using Excel 2003 and my OS is Windows XP.
Thanks a lot for your suggestion. But I have encountered a problem when I tried to run your code. I have some value such as 1.0000000 in my spreadsheet and when it is convert to string by CStr(c.Value) , it is automatically rounded to 1 . Could you suggest how to deal with it? Thanks :)
6 Answers 6
i've just checked this because had same problem. Filename has no functionality in this case.
This is what worked for me:
I'm using Excel 2007 and only after call ".Close False" my CSV was saved using ";" as list separator. Thanks!
No need to declare all this variables, just add local:=true in the end of your SaveAs method, like so:
I ran into the same issue and after contemplating trying to change the "line separator" in Regional Settings using VBA code and Kernel calls I decided it would be way more of a pain, so instead I just found some examples of using the Scripting.FileSystemObject to accomplish my needs instead.
The following code will take an existing csv file and replace all the commas with the tilde "~" character.
You can then just call the commaReplace sub routine from your sub routine which is creating the csv file.
Hope it helps someone!
To use vbs script following construction succeded:
.SaveAs Filename, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
Last "1" in "SaveAs" function is equal to Local=True
Also, the semicolon must be defined as the list separator in OS regional settings (see answers above)
Читайте также: