Как сохранить лист Excel в документ Word с помощью VBA

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 Sub

4. Нажмите 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.zip139.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 Sub

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

Оцените статью
InternetDoc.ru
Добавить комментарий