Сохранение листов книги как отдельных файлов
Про сборку листов из нескольких книг в одну текущую я уже писал здесь. Теперь разберем решение обратной задачи: есть одна книга Excel, которую нужно «разобрать», т.е. сохранить каждый лист как отдельный файл для дальнейшего использования.
Примеров подобного из реальной жизни можно привести массу. Например, файл-отчет с листами-филиалами нужно разделить на отдельные книги по листам, чтобы передать затем данные в каждый филиал и т.д.
Если делать эту процедуру вручную, то придется для каждого листа выполнить немаленькую цепочку действий (выбрать лист, правой кнопкой по ярлычку листа, выбрать Копировать, указать отдельный предварительно созданный пустой файл и т.д.) Гораздо проще использовать короткий макрос, автоматизирующий эти действия.
Способ 1. Простое разделение
Нажмите сочетание Alt+F11 или выберите в меню Сервис — Макрос — Редактор Visual Basic (Tools — Macro — Visual Basic Editor), вставьте новый модуль через меню Insert — Module и скопируйте туда текст этого макроса:
Sub SplitSheets1() Dim s As Worksheet For Each s In ActiveWorkbook.Worksheets 'проходим по всем листам в активной книге s.Copy 'копируем каждый лист в новый файл Next End Sub
Если теперь выйти из редактора Visual Basic и вернуться в Excel, а затем запустить наш макрос (Alt+F8), то все листы из текущей книги будут разбиты по отдельным новым созданным книгам.
Способ 2. Разделение с сохранением
При необходимости, можно созданные книги сразу же сохранять под именами листов. Для этого макрос придется немного изменить, добавив команду сохранения в цикл:
Sub SplitSheets2() Dim s As Worksheet Dim wb as Workbook Set wb = ActiveWorkbook For Each s In wb.Worksheets 'проходим во всем листам активной книги s.Copy 'сохраняем лист как новый файл ActiveWorkbook.SaveAs wb.Path & "" & s.Name & ".xlsx" 'сохраняем файл Next End Sub
Этот макрос сохраняет новые книги-листы в ту же папку, где лежал исходный файл. При необходимости сохранения в другое место, замените wb.Path на свой путь в кавычках, например «D:Отчеты2012» и т.п.
Если нужно сохранять файлы не в стандартном формате книги Excel (xlsx), а в других (xls, xlsm, xlsb, txt и т.д.), то кроме очевидного изменения расширения на нужное, потребуется добавить еще и уточнение формата файла — параметр FileFormat:
ActiveWorkbook.SaveAs wb.Path & "" & s.Name & ".xlsb", FileFormat:=50
Для основных типов файлов значения параметра FileFormat следующие:
- XLSX = 51
- XLSM = 52
- XLSB = 50
- XLS = 56
- TXT = 42
Полный список всех вариантов можно посмотреть в справке MSDN.
Способ 3. Сохранение в новые книги только выделенных листов
Если вы хотите раскидать по файлам не все листы в вашей книге, а только некоторые, то макрос придется немного изменить. Выделите нужные вам листы в книге, удерживая на клавиатуре клавишу Ctrl или Shift и запустите приведенный ниже макрос:
Sub SplitSheets3() Dim AW As Window Set AW = ActiveWindow For Each s In AW.SelectedSheets Set TempWindow = AW.NewWindow 'создаем отдельное временное окно s.Copy 'копируем туда лист из выделенного диапазона TempWindow.Close 'закрываем временное окно Next End Sub
Создавать новое окно и копировать через него, а не напрямую, приходится потому, что Excel не умеет копировать группу листов, если среди них есть листы с умными таблицами. Копирование через новое окно позволяет такую проблему обойти.
Способ 4. Сохранение только выделенных листов в новый файл
Во всех описанных выше способах каждый лист сохранялся в свой отдельный файл. Если же вы хотите сохранить в отдельный новый файл сразу группу выделенных предварительно листов, то нам потребуется слегка видоизменить наш макрос:
Sub SplitSheets4() Dim CurW As Window Dim TempW As Window Set CurW = ActiveWindow Set TempW = ActiveWorkbook.NewWindow CurW.SelectedSheets.Copy TempW.Close End Sub
Способ 5. Сохранение листов как отдельных PDF-файлов
Этот способ чем-то похож на второй, но листы сохраняются не как отдельные книги Excel, а в формате PDF, что часто требуется, если никто не должен менять документ и увидеть ваши формулы. Обратите внимание, что:
- для этого используется уже другой метод (ExportAsFixedFormat а не Copy)
- листы выводятся в PDF с параметрами печати, настроенными на вкладке Разметка страницы (Page Layout)
- книга должна быть сохранена на момент экспорта
Нужный нам код будет выглядеть следующим образом:
Sub SplitSheets5() Dim s As Worksheet For Each s In ActiveWorkbook.Worksheets s.ExportAsFixedFormat Filename:=ThisWorkbook.Path & "" & s.Name & ".pdf", Type:=xlTypePDF Next End Sub
Способ 6. Готовый макрос из надстройки PLEX
Если лень или нет времени внедрять все вышеописанное, то можно воспользоваться готовым макросом из моей надстройки PLEX:
Ссылки по теме
- Сборка листов из нескольких книг в одну
- Что такое макросы, куда вставлять код на Visual Basic, как их использовать.
- Создание файлов
- Листы Excel
- Книги Excel
Данный макрос позволяет упростить процедуру сохранения активного листа в книге Excel в отдельный файл.
Для использования этого макроса на любом листе в книге Excel создайте кнопку, и назначьте ей макрос СохранитьЛистВФайл.
При запуске макроса (нажатии кнопки) будет выведено диалоговое окно выбора имени для сохраняемого файла, после чего текущий лист будет сохранён под заданным именем в выбранной папке.
Сохранение производится в формате XLS (формат Excel 2003)
Если пользователь отказался от ввода имени файла (нажал клавишу ESC или кнопку «Отмена» в диалоговом окне),
то сохранения листа в файл не происходит.
Sub СохранитьЛистВФайл() On Error Resume Next ' название подпапки, в которую по-умолчанию будет предложено сохранить файл Const REPORTS_FOLDER = "Отчёты" ' создаём папку для файла, если её ещё нет MkDir ThisWorkbook.Path & "" & REPORTS_FOLDER ' выбираем стартовую папку ChDrive Left(ThisWorkbook.Path, 1): ChDir ThisWorkbook.Path & "" & REPORTS_FOLDER ' вывод диалогового окна для запроса имени сохраняемого файла Filename = Application.GetSaveAsFilename("отчёт.xls", "Отчёты Excel (*.xls),", , _ "Введите имя файла для сохраняемого отчёта", "Сохранить") ' если пользователь отказался от выбора имени файла - отменяем сохранение листа в файл If VarType(Filename) = vbBoolean Then Exit Sub ' копируем активный лист (при этом создаётся новая книга) Err.Clear: ActiveSheet.Copy: DoEvents If Err Then Exit Sub ' произошла какая-то ошибка при попытке копирования листа ' убеждаемся, что активной книгой является копия листа If ActiveWorkbook.Worksheets.Count = 1 And ActiveWorkbook.Path = "" Then ' сохраняем файл под заданным именем в формате Excel 2003 ActiveWorkbook.SaveAs Filename, xlWorkbookNormal ' закрываем сохранённый файл ' (удалите следующую строку, если закрывать созданный файл не требуется) ActiveWorkbook.Close False End If End Sub
PS: Кто-то может сказать, что для сохранения листа в файл в объектной модели Excel есть метод SaveAs, применимый к объекту Worksheet.
Но, как ни странно, выполнение кода ActiveSheet.SaveAs «<имя файла>» приводит к сохранению книги целиком, что равносильно использованию кода ActiveWorkbook.SaveAs «<имя файла>»
Почему этот метод сохранения работает так нелогично — лично мне не понятно (видимо, Microsoft что-то там перемудрил)
- 178177 просмотров
Не получается применить макрос? Не удаётся изменить код под свои нужды?
Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.
0 / 0 / 0 Регистрация: 23.01.2012 Сообщений: 6 |
|
1 |
|
23.01.2012, 17:07. Показов 77889. Ответов 82
Процедура по нажатию кнопки-сохранить к примеру лист3 из текущей книги как отдельный файл.xls с названием текущей даты в отдельную папку. А также если файл с таким названием уже существует, тогда перезаписать! Подскажите пожалуйста! Заранее спасибо!
0 |
Заблокирован |
|
23.01.2012, 21:55 |
2 |
Klim_ul, давай для начала с разделом определимся — это VB6 или VBA(Excel)?
по нажатию кнопки-сохранить Где такая кнопка есть — на форме, на листе, в тулбаре?
как отдельный файл.xls с названием текущей даты в отдельную папку. отдельную от чего? Конкретики маловато!
0 |
0 / 0 / 0 Регистрация: 23.01.2012 Сообщений: 6 |
|
24.01.2012, 10:10 [ТС] |
3 |
Отдельно от самой книги… например открыта Книга.xls состоящая из 3-х листов, далее на каждом из листов ввели какую либо информацию…. Мне нужно сохранить только лишь Лист3 из этой книги, как отдельный файл.xls название которого будет текущая дата. Добавлено через 2 минуты Добавлено через 40 секунд Добавлено через 43 секунды
0 |
Заблокирован |
||||
24.01.2012, 11:23 |
4 |
|||
3 |
KoGG 5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
||||
24.01.2012, 11:44 |
5 |
|||
Процедура для активного листа. Кнопку расположишь сам, там где тебе нужно, и привяшешь к процедуре:
3 |
Dragokas 17993 / 7619 / 890 Регистрация: 25.12.2011 Сообщений: 11,352 Записей в блоге: 17 |
||||||
24.01.2012, 11:45 |
6 |
|||||
Сообщение было отмечено как решение Решение
Вложения
7 |
0 / 0 / 0 Регистрация: 23.01.2012 Сообщений: 6 |
|
25.01.2012, 11:51 [ТС] |
7 |
Огромное Всем спасибо!!! Добавлено через 15 минут
0 |
17993 / 7619 / 890 Регистрация: 25.12.2011 Сообщений: 11,352 Записей в блоге: 17 |
|
25.01.2012, 17:35 |
8 |
Апострофф, p = ThisWorkbook.Path
2 |
0 / 0 / 0 Регистрация: 23.01.2012 Сообщений: 6 |
|
25.01.2012, 20:37 [ТС] |
9 |
Diskretor, Огромное спасибо и тысяча извинений, потому что у меня еще один вопрос… Теперь как сделать чтобы сохранение производилось в той папке где находится книга но в отдельную папку так чтобы это не влияло на первоначальный путь….. Простите я сам не понял что написал……
0 |
Заблокирован |
||||
25.01.2012, 21:42 |
10 |
|||
Сообщение было отмечено как решение Решение
Это поправка в код Diskretor`а на
Вопрос как этого избежать. Не по теме: Плохо, когда ноги с головой не дружат:D ThisWorkbook.Sheets(3).Copy Даже не догадывался, что подобная команда соэдает новую книгу с указанным листомО_о
4 |
Dragokas 17993 / 7619 / 890 Регистрация: 25.12.2011 Сообщений: 11,352 Записей в блоге: 17 |
||||||||
25.01.2012, 23:56 |
11 |
|||||||
Сообщение было отмечено как решение РешениеАпострофф, я Вам даже скажу больше:
P.S. ради интереса проверил. Можно подставлять и Integer массив с номерами листов. Эффект будет такой же:
5 |
DanAttess 0 / 0 / 0 Регистрация: 29.05.2012 Сообщений: 3 |
||||
29.05.2012, 10:55 |
12 |
|||
А как можно скопировать 2 вполне определенных листа.
?
0 |
Заблокирован |
||||
29.05.2012, 13:02 |
13 |
|||
DanAttess, а почитать, что Diskretor постом выше написал не судьба?
1 |
DanAttess 0 / 0 / 0 Регистрация: 29.05.2012 Сообщений: 3 |
||||
29.05.2012, 18:05 |
14 |
|||
Спасибо! Это мой первый опыт в VBA. Не судите строго! Добавлено через 49 минут
0 |
Заблокирован |
||||
29.05.2012, 18:29 |
15 |
|||
если использовать массивы не получается Не опускаем руки, делаем с массивами
1 |
0 / 0 / 0 Регистрация: 23.07.2012 Сообщений: 7 |
|
23.07.2012, 13:38 |
16 |
Здравствуйте. В экселе не шибко силен. Кто-нибудь может выложить файл с таким примером: чтобы при нажатии кнопки «сохранить» сохранялся допустим лист 2 (на котором будет таблица с формулами), но чтобы сохранялся лист не с формулами, а со значениями, стиль шрифта, размеры столбцов, границы таблицы желательно оставить неизменными. При этом чтобы можно было выбирать путь сохранения и имя файла (или второй вариант — фиксированный путь сохранения и имя файла, допустим сделать 2 кнопки с разными способами сохранения). Честно пытался разобраться с представленными здесь способами, но знаний маловато. Думаю по примеру было бы проще сообразить что к чему
0 |
1121 / 229 / 36 Регистрация: 15.03.2010 Сообщений: 698 |
|
23.07.2012, 15:13 |
17 |
Здравствуйте. В экселе не шибко силен. Кто-нибудь может выложить файл с таким примером: чтобы при нажатии кнопки «сохранить» сохранялся допустим лист 2 … Когда то очень давно писал что то похожее. Макрос копирует выделенные листы в новую книгу и удаляет все, что выходит за пределы печати. Также удаляет все скрытые строки и столбцы в страницах печати. Есть одна неприятность, если удаляемая ячейка объедененная, то теряется ее значение.
1 |
0 / 0 / 0 Регистрация: 23.07.2012 Сообщений: 7 |
|
24.07.2012, 07:55 |
18 |
Вот это почти похоже на правду. То что удаляет все за областью печати — это не страшно. При сохранении можно указать путь и имя, и что сохраняет значения, а не формулы — это все то что надо. Только как бы немного доработать, чтобы сохранялся не выделенный лист, а к примеру так: на первом листе будут какие-то расчеты и кнопка сохранить, а таблицы с результатами на втором и третьем листе. И вот при нажатии на кнопку сохранить, сохранялись бы второй и третий листы в отдельной книге. Добавлено через 2 часа 30 минут
0 |
Dragokas 17993 / 7619 / 890 Регистрация: 25.12.2011 Сообщений: 11,352 Записей в блоге: 17 |
||||
24.07.2012, 14:56 |
19 |
|||
Конечно можно было все это заменить копированием листов с исходной книги, предварительно заменив формулы значениями и закрыть исходный без сохранения. Но хотелось показать способ, чтобы не вносить никаких изменений в исходную книгу.
1 |
0 / 0 / 0 Регистрация: 23.07.2012 Сообщений: 7 |
|
24.07.2012, 15:58 |
20 |
Превосходно! Спасибо большое. Подскажите еще пожалуйста, что надо изменить, если этих листов листов не 2 а 20? И другой вопрос сразу: можно сделать так чтобы из этих 20 листов сохранялись не все, а выборочные — в зависимости от условий. К примеру если ячейка А1=0, то сохраняются листы 2-15, если А1=1, то листы 2-18, если А1=2, то лист 19, если А1=3, то листы 2-20. Понятно что слишком замудрено, но такое возможно или вообще никак?
0 |
Сохранить лист в отдельный файл. |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
In this guide, we’re going to show you how to save each sheet as CSV in Excel.
Download Workbook
Excel to CSV
Saving an Excel worksheet as a CSV file is an easy task. All you need to do is to use Save As section in File menu and select the CSV as the file type.
This action allows you to save the active worksheet as a CSV file. The downside of this approach is repetitiveness. You need to save as each worksheet manually.
Although a CSV file cannot preserve colors, formatting options or other stuff, Excel keeps them in the opened workbook as long as it remains open. Thus you can always save as an Excel file after creating CSV files.
The workaround is to use VBA to save each sheet as CSV like any other repetitive job in Excel. You can either record a macro while you are saving a worksheet as CSV and create a loop to repeat for each worksheet or use the following code.
VBA code for saving each sheet as CSV
Sub SaveAsCSV() Application.ScreenUpdating = False Dim wb As Workbook Dim ws As Worksheet Dim wbNew As Workbook Dim fullPath As String Dim counter As Integer Set wb = ActiveWorkbook ' loop through each worksheet For Each ws In wb.Worksheets ' run code only for visible sheets If ws.Visible = xlSheetVisible Then ' copy the worksheet to a new workbook ws.Copy ' select the new workbook Set wbNew = ActiveWorkbook ' generate a full path for the new file including CSV extension fullPath = wb.Path & "" & _ Left(wb.Name, InStrRev(wb.Name, ".") - 1) & _ "_" & ws.Name & ".csv" ' disable alerts in case of overwrite confirmation Application.DisplayAlerts = False ' save the new workbook as a CSV wbNew.SaveAs Filename:=fullPath, FileFormat:=xlCSV ' re-activate alerts Application.DisplayAlerts = True ' close the new workbook wbNew.Close SaveChanges:=False ' increase counter for the information message counter = counter + 1 End If Next ws ' pop an information message MsgBox counter _ & IIf(counter > 1, " worksheets", " worksheets") _ & " exported.", vbInformation, "Export Worksheets" Application.ScreenUpdating = True End Sub
Допустим, у меня есть файл, содержащий несколько листов. На листе есть таблица с формулами, макросами и т.д. Как средствами VBA сохранить лист этого файла отдельным новым файлом, чтобы вся информация сохранилась в виде значений с сохранением форматирования?
Приблизительно так
Sub SaveSheet()
Dim ActiveSht As Worksheet
Dim NewWb As Workbook
Set ActiveSht = ActiveSheet
Set NewWb = Workbooks.Add
ActiveSht.Copy Before:=Workbooks(NewWb.Name).Sheets(1)
With ActiveSheet.UsedRange
.Value = .Value
End With
ActiveWorkbook.SaveAs Filename:="C:" & ActiveSht.Name
MsgBox "Лист скопирован в новую книгу и сохранён!", , ""
End Sub
Разрабатываю макросы под заказ.
Email: MacrosForYou собака yandex точка ru
Павел, а возможно в данном макросе привязать имя файла к определенной ячейке листа?
ЗЫ: прошу не пинать, возможно подобный вопрос уже был, но поскольку полный профан в ВБА, поиск не поможет((
Цитата: Jammer от 19.12.2008, 11:15
Возможно в данном макросе привязать имя файла к определенной ячейке листа?
Элементарно поменяйте имя листа (ActiveSht.Name) на адрес ячейки:
ActiveWorkbook.SaveAs Filename:="C:" & [A1]
Знания недостаточно, необходимо применение. Желания недостаточно, необходимо действие. (с) Брюс Ли
очень помогли ваши советы, а не подскажите ли, как сделать тоже самое только копирование должно быть в ту же книгу на новый лист с присвоением ему имени из ячейки
Заменить:
ActiveSht.Copy Before:=Workbooks(NewWb.Name).Sheets(1)
На
ActiveSht.Copy Before:=ActiveWorkbook.Sheets(1)
и часть нижнего кода уже не нужна
ActiveWorkbook.SaveAs Filename:=»C:» & ActiveSht.Name
MsgBox «Лист скопирован в новую книгу и сохранён!», , «»
Благодарю за ответ,ток я cделал ошибку — не приложил фаил. Можно ещё разок,на моём примере. Лист «1» продублировать в книге с изменением его имени на имя из ячейки E2 допустим, дублирование осуществляется при нажатии на кнопку «нажать» на листе «1».Как это реализовать через макрос?
Цитата: Шпец Докапыч от 20.12.2008, 14:49
Цитата: Jammer от 19.12.2008, 11:15
Возможно в данном макросе привязать имя файла к определенной ячейке листа?Элементарно поменяйте имя листа (ActiveSht.Name) на адрес ячейки:
ActiveWorkbook.SaveAs Filename:="C:" & [A1]
подскажите пожалуйста если ячейке присвоено имя или диапазон ячеек, как в таком случае прописать, и чтобы еще в имени файла отображалась текущая дата
ActiveWorkbook.SaveAs Filename:=»C:» & [A1] & «_» & now()
Не торопись, и все успеешь намного быстрее
Замените Now() на Date & «.xls»
или другое расширение (xlsm, xlsb, …)
в Now() время записано через двоеточие — низззя
Скажи мне, кудесник, любимец ба’гов…
Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995
спасибо Борода, теперь буду знать, как в макросе текущая дата прописывается
Не торопись, и все успеешь намного быстрее
Цитата: _Boroda_ от 27.08.2010, 15:36
Замените Now() на Date & «.xls»
или другое расширение (xlsm, xlsb, …)
в Now() время записано через двоеточие — низззя
спасибо большое, только в имени файла не отображается значение из ячейки [BE3], и как можно прописать диапазон ячеек
Цитата: _Boroda_ от 27.08.2010, 16:03
У меня работаетActiveWorkbook.SaveAs Filename:="C:Documents and SettingsМои документыСтереть" & [c5] & "_" & Date & ".xls"
Что значит
Цитироватькак можно прописать диапазон ячеек
диапазону ячеек присвоила имя и его прописала
ActiveWorkbook.Names(«f12p3s1») чтобы в имени нового файла отображалось значение, все получилось
выдает ошибку
application-defined or object-defined error
не могу понять что изменить, помогите пожалуйста
Sub CommandButton11_Click()
Sheets(«Ф11(п)»).Select
Dim ActiveSht As Worksheet
Dim NewWb As Workbook
Set ActiveSht = ActiveSheet
Set NewWb = Workbooks.Add
ActiveSht.Copy Before:=Workbooks(NewWb.Name).Sheets(1)
With ActiveSheet.UsedRange
.Value = .Value
End With
ActiveWorkbook.SaveAs Filename:=»C:KartochkiФормыФ11ф11 » & ActiveSht.Name & Year(Date) & «.» & Month(Date) & «.» & Day(Date) & «_» & ActiveWorkbook.Names(«f11p3s2»).RefersToRange.Value & «.xls»
MsgBox «Лист скопирован в новую книгу и сохранён!», , «»
ActiveWorkbook.Close
Sheets(«Ф11»).Select
ActiveWorkbook.Close savechanges:=False
End Sub
мне необходимо скопировать лист книги и сохранить его в новой книге, в имени которой должно отображаться имя листа, текущая дата и ActiveWorkbook.Names(«f11p3s2»), т.е. значение ячейки, которой присвоено имя
дело в том, что данный макрос прописанный в трех листах (с другими именами ф12,ф3 и ф1) замечательно работает, а трех листах ф11,ф2 и ф4 выдает вот такую ошибку, хотя его копирую один в один, меняя лишь наименование листа и имя ячейки
Цитата: _Boroda_ от 15.09.2010, 15:48
Не очень понял, что должно делать
ActiveWorkbook.Names(«f11p3s2»).RefersToRange.Value
что это должно делать мне сложно сказать, мне подсказали на форуме так написать и оно сработало, извините за неграмотность
Here is one that will give you a visual file chooser to pick the folder you want to save the files to and also lets you choose the CSV delimiter (I use pipes ‘|’ because my fields contain commas and I don’t want to deal with quotes):
' ---------------------- Directory Choosing Helper Functions -----------------------
' Excel and VBA do not provide any convenient directory chooser or file chooser
' dialogs, but these functions will provide a reference to a system DLL
' with the necessary capabilities
Private Type BROWSEINFO ' used by the function GetFolderName
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" _
Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32.dll" _
Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
Function GetFolderName(Msg As String) As String
' returns the name of the folder selected by the user
Dim bInfo As BROWSEINFO, path As String, r As Long
Dim X As Long, pos As Integer
bInfo.pidlRoot = 0& ' Root folder = Desktop
If IsMissing(Msg) Then
bInfo.lpszTitle = "Select a folder."
' the dialog title
Else
bInfo.lpszTitle = Msg ' the dialog title
End If
bInfo.ulFlags = &H1 ' Type of directory to return
X = SHBrowseForFolder(bInfo) ' display the dialog
' Parse the result
path = Space$(512)
r = SHGetPathFromIDList(ByVal X, ByVal path)
If r Then
pos = InStr(path, Chr$(0))
GetFolderName = Left(path, pos - 1)
Else
GetFolderName = ""
End If
End Function
'---------------------- END Directory Chooser Helper Functions ----------------------
Public Sub DoTheExport()
Dim FName As Variant
Dim Sep As String
Dim wsSheet As Worksheet
Dim nFileNum As Integer
Dim csvPath As String
Sep = InputBox("Enter a single delimiter character (e.g., comma or semi-colon)", _
"Export To Text File")
'csvPath = InputBox("Enter the full path to export CSV files to: ")
csvPath = GetFolderName("Choose the folder to export CSV files to:")
If csvPath = "" Then
MsgBox ("You didn't choose an export directory. Nothing will be exported.")
Exit Sub
End If
For Each wsSheet In Worksheets
wsSheet.Activate
nFileNum = FreeFile
Open csvPath & "" & _
wsSheet.Name & ".csv" For Output As #nFileNum
ExportToTextFile CStr(nFileNum), Sep, False
Close nFileNum
Next wsSheet
End Sub
Public Sub ExportToTextFile(nFileNum As Integer, _
Sep As String, SelectionOnly As Boolean)
Dim WholeLine As String
Dim RowNdx As Long
Dim ColNdx As Integer
Dim StartRow As Long
Dim EndRow As Long
Dim StartCol As Integer
Dim EndCol As Integer
Dim CellValue As String
Application.ScreenUpdating = False
On Error GoTo EndMacro:
If SelectionOnly = True Then
With Selection
StartRow = .Cells(1).Row
StartCol = .Cells(1).Column
EndRow = .Cells(.Cells.Count).Row
EndCol = .Cells(.Cells.Count).Column
End With
Else
With ActiveSheet.UsedRange
StartRow = .Cells(1).Row
StartCol = .Cells(1).Column
EndRow = .Cells(.Cells.Count).Row
EndCol = .Cells(.Cells.Count).Column
End With
End If
For RowNdx = StartRow To EndRow
WholeLine = ""
For ColNdx = StartCol To EndCol
If Cells(RowNdx, ColNdx).Value = "" Then
CellValue = ""
Else
CellValue = Cells(RowNdx, ColNdx).Value
End If
WholeLine = WholeLine & CellValue & Sep
Next ColNdx
WholeLine = Left(WholeLine, Len(WholeLine) - Len(Sep))
Print #nFileNum, WholeLine
Next RowNdx
EndMacro:
On Error GoTo 0
Application.ScreenUpdating = True
End Sub