Vba excel сохранить лист в word
Если вы хотите сохранить лист в виде текстового файла, вы можете использовать функцию Excel Save As, чтобы сохранить лист в виде текстового файла. Но если вы хотите сохранить каждый лист книги в виде отдельного текстового файла, шаги Save As могут вас раздражать. Здесь я познакомлю вас с несколькими интересными приемами, которые помогут вам быстро решить эту скучную задачу в Excel.
Сохраните каждый лист книги как отдельный текстовый файл с помощью Kutools for Excel
Сохранить текущий лист как текстовый файл с помощью VBA
Если вам не нравится использовать функцию «Сохранить как» для сохранения листа в виде текстового файла, вы можете использовать код VBA.
1. Активируйте лист, который хотите сохранить как текстовый файл.
2. Нажмите Alt + F11 ключи для отображения Microsoft Visual Basic для приложений окно.
3. Нажмите Вставить > Модули из окна, а затем вставьте ниже код VBA в модуль.
Sub SaveSheetToTxt() 'Updateby20150910 Dim xRet As Long Dim xFileName As Variant On Error GoTo ErrHandler: xFileName = Application.GetSaveAsFilename(ActiveSheet.Name, "TXT File (*.txt), *.txt", , "Kutools for Excel") If xFileName = False Then Exit Sub If Dir(xFileName) <> "" Then xRet = MsgBox("File '" "' exists. Overwrite?", vbYesNo + vbExclamation, "Kutools for Excel") If xRet <> vbYes Then Exit Sub Else Kill xFileName End If End If ActiveSheet.Copy ActiveWorkbook.SaveAs xFileName, xlUnicodeText If ActiveWorkbook.Name <> ThisWorkbook.Name Then ActiveWorkbook.Close False End If My_Exit: Exit Sub ErrHandler: MsgBox Err.Description, , "Kutools for Excel" End Sub4. Нажмите Run кнопку для выполнения кода, а затем в Kutools for Excel выберите папку, в которую будет помещен текстовый файл, и укажите имя текстового файла. Смотрите скриншот:

5. Нажмите Сохранено. Теперь активный лист сохраняется как текстовый файл.
Наконечник: С помощью VBA вы можете сохранить только один лист как текстовый файл за раз.
Сохраните каждый лист книги как отдельный текстовый файл с помощью Kutools for Excel
Если у вас есть большая книга с сотнями листов, которые необходимо сохранить в отдельные текстовые файлы, метод VBA также является напрасной тратой времени. В этом случае вы можете попробовать использовать Kutools for ExcelАвтора Разделить книгу справиться с этой работой, которая преподнесет вам неожиданный сюрприз.
Kutools for Excel предлагает более 300 расширенных функций для оптимизации сложных задач, повышения креативности и эффективности. Улучшено возможностями искусственного интеллектаKutools точно автоматизирует задачи, упрощая управление данными. Подробная информация о Kutools для Excel. Бесплатная пробная версия.
1. Включите книгу, листы которой вы хотите сохранить как независимые текстовые файлы, а затем щелкните Кутулс Плюс > Workbook > Разделить книгу. Смотрите скриншот:

2. в Разделить книгу выберите листы, которые вы хотите разделить и сохранить как текстовые файлы, по умолчанию все листы выбраны, а затем установите флажок Укажите формат сохраненияИ выберите Текст в Юникоде (*. Txt) из раскрывающегося списка снизу. Смотрите скриншот:

3. Нажмите Split, а затем выберите папку для размещения текстовых файлов из Просмотр папки диалог. Смотрите скриншот:

4. Нажмите OK. Теперь каждый лист книги сохраняется как отдельный текстовый файл в выбранной папке.
В Разделить книгу of Kutools for Excel, вы можете разделить книгу и сохранить их как отдельные файлы xls, файлы xlsx, файлы PDF или файлы CSV, нажмите здесь, чтобы узнать больше об этой утилите.
Kutools for Excel — Усильте Excel более чем 300 необходимыми инструментами. Наслаждайтесь постоянно бесплатными функциями ИИ! Get It Now
Экспортируйте выделенный лист в виде текстового файла с помощью Kutools for Excel
В Kutools for Excel, вы также можете экспортировать выбранный лист в виде текстового файла, используя его Диапазон экспорта в файл.
Kutools for Excel — Более 300 необходимых инструментов для Excel. Наслаждайтесь постоянно бесплатными функциями ИИ! Скачать сейчас!
1. Выберите диапазон или диапазоны, которые вы хотите сохранить как текстовый файл, и нажмите Кутулс Плюс > Импорт/Экспорт > Диапазон экспорта в файл. Смотрите скриншот:

2. Затем в появившемся диалоговом окне отметьте Текст Юникода вариант под Формат файла раздел, затем перейдите к Параметры текста раздел, чтобы выбрать нужный вариант, а затем выберите место для сохранения.

3. Нажмите Ok. Теперь назовите экспортируемый текстовый файл во всплывающем окне. Диапазон экспорта в файл диалоговое окно и щелкните OK .

Пока выбор был экспортирован в отдельный текстовый файл.
Kutools for Excel — Усильте Excel более чем 300 необходимыми инструментами. Наслаждайтесь постоянно бесплатными функциями ИИ! Get It Now
Макрос создания документов Word по данным таблицы Excel
![]()
При нажатии кнопки запуска макрос на основе шаблона dot создаёт очередной файл, и в этом документе производит замену текста ("кода поля") из первой строки файла Excel на значение поля (из очередной строки с данными файла Excel)
Папка для сформированных документов создаётся автоматически, и содержит в имени текущую дату и время (например, созданная папка будет называться Договоры, сформированные 01-05-2011 в 15-03-24)
Имена создаваемых файлов формируются объединением полей фамилия, имя и отчество, с добавлением расширения doc
PS: Макрос был написан достаточно давно, когда я только начинал изучать VBA, — так что код недостаточно универсален.
Но, в качестве примера, пожалуй, подойдёт (если вам нужен более функциональный макрос, воспользуйтесь универсальной надстройкой (см. ниже))
Ознакомьтесь также с универсальной надстройкой формирования документов по шаблонам, которая может делать всё тоже самое, что и эта программа, только в качестве шаблонов могут выступать, помимо документов Word, ещё текстовые файлы, и книги Excel.
В надстройке — много возможностей, и полезных дополнений: склонение ФИО в родительный и дательный падежи, автоматический вывод на печать (с заданным количеством копий), размещение созданных файлов в разных папках, создание и рассылка писем со вложениями, и множество других полезных функций.
По вышеприведённой ссылке программа заполнения документов Word из Excel доступна для бесплатного скачивания.
Внимание: просьбы о доработке макроса, описанного в этой статье, не принимаются.
Есть новая (универсальная) версия, — в которой уже есть практически всё, что может понадобиться.
Вложения:
| CreateWordDocuments2.zip | 139.71 КБ |
- 209895 просмотров
Антон, 17 Сен 2013 — 06:12. #1
Спасибо, за макрос, не могли бы подсказать что в нем изменить что бы обрабатывалась только та строка в которой выделенная ячейка?
Гость, 10 Июл 2013 — 11:28. #2
Спасибо за макрос. Очень помог в работе.
Игорь (администратор сайта), 6 Июн 2013 — 21:01. #3
Этот макрос уже не поддерживается. Используйте новую (расширенную) версию программы, — там все работает без ошибок.
User, 6 Июн 2013 — 17:22. #4
Макрос выдает ошибку (Type mismatch (Error 13)) при обработке ячейки с формулой, подскажите пожалуйста как решить эту проблему?
Игорь (администратор сайта), 29 Май 2013 — 22:58. #5
User, 29 Май 2013 — 08:15. #6
Здравствуйте. Спасибо вам за этот макрос, который помог мне в работе. Не могли бы вы еще подсказать как сделать чтоб в шаблон Word прописывались данные из нескольких (разных) строк Excel? Заранее спасибо.
Гость, 6 Дек 2012 — 22:39. #7
Подскажите. а можно сделать чтобы макрос обрабатывал только те строки в которых стоит номер договора, а если пусто пропускал?
Eugeny, 6 Дек 2012 — 19:03. #8
Ознакомился с программой. Серьезный труд. Снимаю шляпу. Но мне понравился именно этот макрос. С колонтитулами я разобрался — оказалось ничего сложного, да и сам макрос оброс уже кучей доработок. Затянуло, знаете ли ))
Игорь (администратор сайта), 28 Ноя 2012 — 15:29. #9
Евгений, воспользуйтесь универсальной программой для заполнения документов Word — там реализована подстановка значений в колонтитулы
Eugeny, 28 Ноя 2012 — 13:59. #10
Добрый день! Макрос очень помог в работе. Доделал его немного под свои нужды: вывод в разные шаблоны документов word при разных значениях в excel. Остался один вопрос — в сам документ word текст вставляется отлично, а вот в колнтитулы — нет 🙁 Подскажите, пожалуйста, как это исправить?
Игорь (администратор сайта), 24 Авг 2012 — 11:11. #11
Вова, если нет денег на заказ, есть только 2 варианта: 1) разобраться в этих макросах, и сделать самому (благо, примеров подобных макросов в интернете предостаточно) 2) обратиться за помощью на любой из форумов по Excel (но, опять же, если с вашей стороны никаких наработок нет, вряд ли кто сделает всю работу за вас)
Вова, 24 Авг 2012 — 10:29. #12
А если в етом макросе сделать так чтоби он заменял дание сначла с строки активной ячейки а потом если одна из ячеек следующей строки = ячейке из предедущей строкии снова вставлял в ворд документ заменяемие поля и снова делел замену, и так до момента когда одна из ячеек не будеть раван ячеике из следуищей, строки тогад макрос по ектому условию не вставляет заменяемие поля а просто сохраняет ворд документ. То есь допустим мне нужно создать документ ворд по одному из людей дание по которому есть в нескольких строках. Пожалста помогите очень нужно, просто нет денег на заказ.
Игорь (администратор сайта), 23 Авг 2012 — 21:23. #13
Вова, в этом случае универсальное решение сделать не получится — уж слишком много возможных вариантов расположения данных в Excel, и способов заполнения документов Word. Оформляйте заказ на сайте — сделаю для вас макрос под ваши требования.
Вова, 23 Авг 2012 — 20:13. #14
Подскажите пожалуйста, как сделать так, чтобы макрос формировал один документ ворд на основании данных из нескольких строк Excel?
Михаил, 17 Май 2012 — 10:05. #15
А как реализовать те же возможности, только используя функцию слияния в Word. Чтобы каждый новый раз не формировался новый документ а запись делалась на новой странице?
Игорь (администратор сайта), 19 Апр 2012 — 09:09. #16
Теперь доступна новая версия универсальной программы формирования документов по шаблонам.
Программа очень удобна для быстрого создания договоров и приказов, заполнения актов и инструкций, печати писем и соглашений, заполнения путевых листов и извещений, распечатки протоколов и соглашений, подстановки данных в шаблоны заявлений и доверенностей.
Количество файлов-шаблонов (Word, Excel, TXT) неограничено.
Бесплатно скачать и протестировать программу можно по этой ссылке: http://excelvba.ru/programmes/FillDocuments
Serg, 23 Мар 2012 — 13:41. #17
Замечательно. Я, долгое время искал нечто подобное. Но к счасливой случайности вышел на Ваш сайт. Установил панели для VBA. И ещё коу-что. Практически разобрался в работе данного макроса.
В VBA я, недавно. Но поставил перед собой задачу изучить его. Для этого я, решил составить программу для заполнения бланков аттестатов о среднем образовании и бланков дипломов об окончании ПТУ. До этого они заполнялись вручную. Задачу в Excel, я, программно решил, не безВашего в ней участия, некоторые фрагменты кода.
У меня база заполняется посредством форм в виде развёрнутого аттестата. А, вот транспортировка данных в Word с листов — разворот и последняя страница. Как-то чуть-чуть не вяжется с общим видом программы. Нельзя-ли макрос транспортировки "засунуть" под форму? Если можно, то не смогли бы Вы посоветовать мне как это сделать.
Делаю эту программу потому, что на Украине все мучаются с авторизованым заполнением бланков об окончании учебных заведений. А, так я бы мог бесплатно, это моё безусловное кредо, предоставить программу желающим. Заранее Вам благодарен. Помогая мне Вы помогаете и до того замордованым классным руководителям школ Украины.
Гость, 16 Мар 2012 — 15:21. #18
можно ли по каждой записи сформировать 2 документа word?
Как из Excel обратиться к другому приложению
Иногда бывает необходимо перенести что-то из Excel в другое приложение. Я возьму для примера Word. Например скопировать ячейки и вставить. Обычно мы это так и делаем — скопировали в Excel, открыли Word — вставили. Но сделать это при помощи кода чуть сложнее, хотя если разобраться никаких сложностей нет.
Ниже приведен пример кода, который открывает Word, открывает в нем определенный документ, копирует данные из Excel и вставляет в открытый документ Word.
В файле-примере, приложенном к данной статье, в комментариях к коду есть несколько добавлений. Например, как вставить текст из ячеек в определенные закладки Word-а и как добавить новый документ, а не открывать уже имеющийся. Так же так есть код проверки — открыто ли приложение Word в данный момент. Порой это тоже может пригодиться, чтобы работать с запущенным приложением Word, а не создавать новое:
Sub Check_OpenWord() Dim objWrdApp As Object On Error Resume Next 'пытаемся подключится к объекту Word Set objWrdApp = GetObject(, "Word.Application") If objWrdApp Is Nothing Then 'если приложение закрыто - создаем новый экземпляр Set objWrdApp = CreateObject("Word.Application") 'делаем приложение видимым. По умолчанию открывается в скрытом режиме objWrdApp.Visible = True Else 'приложение открыто - выдаем сообщение MsgBox "Приложение Word уже открыто", vbInformation, "Check_OpenWord" End If End SubSub Check_OpenWord() Dim objWrdApp As Object On Error Resume Next ‘пытаемся подключится к объекту Word Set objWrdApp = GetObject(, "Word.Application") If objWrdApp Is Nothing Then ‘если приложение закрыто — создаем новый экземпляр Set objWrdApp = CreateObject("Word.Application") ‘делаем приложение видимым. По умолчанию открывается в скрытом режиме objWrdApp.Visible = True Else ‘приложение открыто — выдаем сообщение MsgBox "Приложение Word уже открыто", vbInformation, "Check_OpenWord" End If End Sub
В принципе, активировать или вызвать(если закрыто) другое приложение Офиса можно одной строкой:
Sub Open_AnotherApp() Application.ActivateMicrosoftApp xlMicrosoftWord End Sub
Sub Open_AnotherApp() Application.ActivateMicrosoftApp xlMicrosoftWord End Sub
но данный метод может пригодиться только в том случае, если Вам необходимо действительно лишь активировать другое приложение, но дальше обращаться к этому приложению Вы уже не сможете.
По сути, методами CreateObject и GetObject можно обратиться к любому стороннему приложению(например Internet Explorer). Куда важнее при обращении к этим объектам знать объектную модель того приложения, к которому обращаетесь. Чтобы увидеть свойства и методы объектной модели приложения, можно в редакторе VBA подключить необходимую библиотеку, объявить переменную, назначив ей тип приложения. Покажу на примере того же Word-а. Для начала открываем меню Tools — References : Подключаем библиотеку: Затем объявляем переменную и присваиваем ей тип нужного приложения:
Sub OpenWord() Dim objWrdApp As Word.Application Set objWrdApp = New Word.Application objWrdApp.Visible = True End Sub
Sub OpenWord() Dim objWrdApp As Word.Application Set objWrdApp = New Word.Application objWrdApp.Visible = True End Sub
Если теперь в редакторе, внутри этой процедуры в любом месте ниже объявления переменной набрать objWrdApp и точку, то сразу после ввода точки выпадет меню, в котором будут перечислены все доступные методы и свойства этого приложения. Так же можно нажать F2 и через поиск найти Word и просмотреть все методы и свойства данного приложения.
Метод установки ссылки на библиотеку приложения через Tools-References называют еще ранним связыванием. Подобный метод позволяет создать ссылку на приложение быстрее и, как описано выше, предоставляет разработчику доступ к визуальному отображению свойств и методов объекта.
Но есть существенный минус: если в своем коде Вы установите ссылку на Word 12 Object Libbary(Word 2007), то на ПК с установленным Word 2003 получите ошибку MISSING, т.к. Word 2003 относится к библиотеке Word 11 Object Libbary. Подробнее можно прочитать в статье Ошибка — Cant find project or library. Метод же CreateObject еще называется методом позднего связывания.
Применяя его не возникнет проблем с MISSING, очень часто возникающих при раннем связывании. Поэтому я рекомендовал бы при разработке использовать раннее связывание для удобства использования свойств и методов(если Вы их не знаете), а перед распространением приложения в коде заменить все именованные константы(типа wdLine) на числовые константы(для wdLine это 5) и применить позднее связывание.
Посмотреть числовое значение константы можно просто записав её в коде, начать выполнение кода через F8 и навести курсор мыши на эту константу. Всплывающая подсказка покажет числовое значение.
Так же можно отобразить окно Immediate(View -Immediate Window или сочетание клавиш Ctrl + G ), записать вопросительный знак и вставить эту константу и нажать Enter : ?wdLine ниже будет выведено числовое представление этой константы. А заменять эти константы их числовыми значениями в случае с поздним связыванием необходимо, т.к. Excel не знает их значений.
Попробую пояснить поподробнее про эти константы и почему их надо заменять какими-то числами: при подключении библиотеки Wordа(Word 12 Object Libbary) мы так же подключаем и все свойства, методы и константы, которые доступны из Wordа. И их использование напрямую становится доступно из Excel и мы можем смело написать что-то вроде wbLine и Excel поймет эту константу. При позднем же связывании мы уже не подключаем библиотеки Word(во избежание ошибок совместимости) и как следствие — методы, свойства и константы Wordа для Excel становятся чем-то неизвестным и не документированным и мы получим ошибку "Variable not defined"(если включена директива Option Explicit) при попытке назначить свойство через wdLine. Если же Option Explicit не включена — то хоть ошибки не будет, но и код будет работать неверно, т.к. для неизвестной для Excel переменной wbLine будет назначено значение 0(Empty). Поэтому и надо все константы другого приложения заменять их числовыми значениями.
Главная ошибка новичка И хочу так же упомянуть про ошибку, которую очень часто совершают при обращении к одному приложению из другого. Допустим, необходимо скопировать из Word все данные в Excel. Часто начинающие делают это так:
На строке Range.Copy обязательно получите ошибку от VBA, указывающую, что нужен аргумент для объекта. Можно попробовать добавить этот аргумент: Range(1).Copy. Но все равно получим ошибку. Можно, конечно, указать даже ячейки: Range("A1").Copy. Но это приведет к тому, что скопирована будет ячейка А1 активного листа Excel. Все дело в том, что мы хотим скопировать данные из Word-а, выполняя при этом код из Excel.
А у Excel тоже есть объект Range с другими аргументами. И если не указать какому приложению, листу или документу принадлежит Range, то по умолчанию он будет отнесен к тому приложению, из которого выполняется код. Т.е. к Excel. Если совсем кратко об этом — всегда надо указывать какому приложению или объекту принадлежит используемый объект или свойство. Правильно код должен выглядеть так:
Вместо Range ту же ошибку делают и с Selection(потому что Selection часто присутствует в записанных макрорекордером макросах), т.к. этот объект есть и в Excel и в Word и без явного указания приложения будет относится к приложению, в котором записано.
В приложенном файле код немного отличается от представленных выше — в нем можно посмотреть как вставить текст из ячеек в определенные(созданные заранее) закладки Word-а. Это удобно для создания бланков в Word и заполнения их через Excel Скачать пример:
'считываем фамилию с инициалами sWDDocName = .Cells(lr, 1).Value
‘считываем фамилию с инициалами sWDDocName = .Cells(lr, 1).Value
В общем-то, если хоть чуть-чуть разбираетесь, то поменять можно многое. А для тех, кто не разбирается достаточно будет просто создавать метки в файле Word и обозначать ими столбца в таблице Excel. Количество столбцов и строк в таблице код определяет автоматически и при изменении размеров таблицы ничего изменять не надо. Главное, чтобы метки находились в первой строке, вторая строка — заголовок(необязательно), а с третьей строки начинаются данные, которые и используются для наполнения шаблонов. Скачать пример:
65 комментариев
Иброхим :
Мне нужно было из таблицы в excel составит письмо в word. В таблице сотни организации и каждому нужно отдельное письмо нужно написать и сохранить в wordе. Думаю мне это поможет. Благодарю автора!
Alex23 :
Добрый день, Дмитрий! Очень полезный пример заполнения, прямо то что искал. В принципе это полностью подходит для решения моих задач, однако хотелось бы оптимизировать код. В моем случае я не перебираю циклом строки для заполнения, а иду последовательно попутно проверяя значения из листа анкеты и планомерно заполняю шаблон.
Поэтому хотелось ту часть макроса которая находит/заменяет значения в шаблоне сделать в виде функции и по мере необходимости просто подставлять значение для поиска и замены. Перенес эту часть в функцию: Public Function Repl(sFindVal As String, sReplaceVal As String) Dim objWrdApp As Object, objWrdDoc As Object, wdRange As Object ‘ Dim sFindVal As String, sReplaceVal As String Set wdRange = objWrdDoc.Range ‘çàìåíÿåì ìåòêè íà òåêñò èç ÿ÷ååê wdRange.Find.ClearFormatting wdRange.Find.Replacement.ClearFormatting With wdRange.Find .Text = sFindVal .Replacement.Text = sReplaceVal .Forward = True .Wrap = 1 ‘wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With wdRange.Find.Execute Replace:=2 ‘wdReplaceAll End Function а в макросе просто задаю значения и вызываю функцию sFindVal = .Cells(2, 1).Value sReplaceVal = .Cells(2, 3).Text Call Repl(sFindVal, sReplaceVal) В итоге макрос ошибок не выдает но и ничего не делает. Подскажите пожалуйста, на что обратить внимание, куда копать и возможно ли так сделать?
Дмитрий :
Alex23, как минимум обратить внимание на то, что в моем коде переменным objWrdApp и objWrdDoc задаются значения: приложение Word и документ соответственно. В Вашей функции они просто объявлены внутри самой функции, но никаких значений им не присваивается. Следовательно они равны Nothing. Возможно, назначение идет в родительской процедуре — но тогда надо и их передавать в качестве аргументов, а не объявлять новые переменные внутри функции. А ошибок не получаете потому что где-то в родительской процедуре есть строка On Error Resume Next.
Alex23 :
Спасибо большое за помощь, функция заработа благодаря Вашим подсказкам: Public Function Repl(sFindVal As String, sReplaceVal As String, wdRange As Object) ‘çàìåíÿåì ìåòêè íà òåêñò èç ÿ÷ååê wdRange.Find.ClearFormatting wdRange.Find.Replacement.ClearFormatting With wdRange.Find .Text = sFindVal .Replacement.Text = sReplaceVal .Forward = True .Wrap = 1 ‘wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With wdRange.Find.Execute Replace:=2 ‘wdReplaceAll Думал ну все, теперь все легко, однако столкнулся со следующей проблемой. Кодом собираю с листа достаточно большой кусок для замены, однако не срабатывает Dim PorType, PorPreambula As String PorType = .Cells(18, 3).Value тут Select и далее Case Is = "ИП" PorPreambula = .Cells(17, 3).Value , действующий на основании " ", номер ОГРНИП " _ ", (паспорт гражданина РФ серия " (ДО ЭТОГО МОМЕНТА РАБОТАЕТ, А ПОСЛЕ НИЧЕГО НЕ МЕНЯЕТ) " № " ", выданный " ", " " г., код подразделения " ", СНИЛС " ", ИНН " "), именуемый в дальнейшем Поручитель" sFindVal = "" sReplaceVal = PorPreambula Call Repl(sFindVal, sReplaceVal, objWrdDoc.Range) Причем дело не в ячейке 27-3, пробовал просто добавлять текст, тоже в итоге ничего не заменяет. Вроде переменная String позволяет хранить достаточно много символов. не могу понять в чем затык
Alex23 :
Попробовал вручную присвоить переменной PorPreambula рандомный текст (абзац строк на 7) — тот же результат. Такое впечатление что если переменная длиннее какого-то количества символов то происходит ошибка и функция просто не срабатывает
Дмитрий :
Из VBA есть ограничение: значение для поиска и для замены не должно превышать 255 символов. Поэтому для корректной работы с длинными текстами надо изобретать обходные пути.




