Копирование текста из параграфов (абзацев) документа Word в ячейки рабочего листа Excel. Копирование абзацев по их порядковым номерам.
Копирование текста из Word в Excel
Автоматическое копирование текста будет особенно полезным при необходимости регулярного переноса большого количества данных из документов Word в ячейки рабочих листов Excel. Такая работа в ручном режиме может занять не один час и гарантированно привести к ошибкам.
В этой рубрике уже есть пример копирования части текста из документа Word в Excel, но здесь будет рассмотрен код для заполнения группы ячеек данными из параграфов (абзацев) документа с помощью цикла. А также представлен иной способ очистки копируемого текста от непечатаемых (невидимых) символов.
Подключение библиотеки Microsoft Word
По умолчанию Excel «не знает», что такое Word. Чтобы научить его работать с объектами Word, нам нужно подключить соответствующую библиотеку. Мы будем использовать «Раннее связывание» (Early Binding), так как оно удобнее для написания кода (подсказки IntelliSense работают сразу). Для «Позднего связывания» (Late Binding) библиотеку подключать не нужно.
- Откройте Excel и нажмите
Alt + F11, чтобы открыть редактор VBA. - В верхнем меню выберите
Tools (Инструменты) -> References (Ссылки). - В появившемся списке найдите и поставьте галочку напротив пункта
Microsoft Word XX.0 Object Library(где XX — ваша версия Office, например, 16.0). - Нажмите «OK».
Копируем текст по абзацам в ячейки
Чаще всего текст из Word нужно перенести в Excel не «сплошной массой» в одну ячейку, а разбить по строкам. Например, каждый абзац Word должен становиться новой строкой в столбце A на листе Excel.
Процедуры для копирования текста из Word
Вставьте следующий код в стандартный модуль (Insert -> Module):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
Sub CopyWordTextToExcel() ' Объявляем переменные Dim wdApp As Word.Application Dim wdDoc As Word.Document Dim wdPara As Word.Paragraph Dim ws As Worksheet Dim filePath As String Dim i As Long ' Задаем путь к файлу Word (ИЗМЕНИТЕ ПУТЬ НА СВОЙ!) filePath = "C:\Путь\К\Вашему\Файлу.docx" ' Задаем лист в Excel, куда будем выгружать данные Set ws = ThisWorkbook.Sheets("Лист1") ' Очищаем предыдущие данные в столбце A (опционально) ws.Columns("A").ClearContents ' Создаем невидимый экземпляр Word On Error Resume Next ' На случай, если Word уже открыт с ошибками Set wdApp = New Word.Application On Error GoTo 0 ' Открываем документ (если документ уже открыт, код зависнет на этой строке) Set wdDoc = wdApp.Documents.Open(filePath) i = 1 ' Счетчик строк в Excel ' Проходим по каждому абзацу в документе Word For Each wdPara In wdDoc.Paragraphs ' Записываем текст в ячейку, очищая его от скрытых символов ws.Cells(i, 1).Value = CleanWordText(wdPara.Range.Text) i = i + 1 Next wdPara ' Закрываем документ без сохранения и закрываем Word wdDoc.Close SaveChanges:=False wdApp.Quit ' Очищаем память Set wdDoc = Nothing Set wdApp = Nothing MsgBox "Текст успешно перенесен в Excel!", vbInformation, "Готово" End Sub ' Вспомогательная функция для очистки текста от невидимых символов Word Function CleanWordText(txt As String) As String ' Удаляем символы переноса абзаца (Chr(13) и Chr(7)) CleanWordText = Replace(Replace(txt, vbCr, ""), Chr(7), "") ' Убираем лишние пробелы по краям CleanWordText = Trim(CleanWordText) End Function |
Пояснения по представленным процедурам
Давайте посмотрим, как это работает:
Set wdApp = New Word.Application— мы запускаем фоновый процесс Word. По умолчанию параметрVisible = False, что делает Word невидимым для пользователя (лишние окна не мелькают).wdDoc.Documents.Open— открываем конкретный файл по указанному пути.For Each wdPara In wdDoc.Paragraphs— это основа макроса. Мы не просто берем весь текст, а проходимся по каждому абзацу. Это позволяет контролировать структуру данных — каждый следующий абзац копируется в новую ячейку.CleanWordText— важный нюанс! В Word каждый абзац заканчивается скрытым символом переноса строки (Chr(13)). Если скопировать его в Excel «как есть», в ячейке появятся некрасивые квадратики или разрывы строк. ФункцияCleanWordTextубирает этот мусор.wdApp.QuitиSet ... = Nothing— очень важный блок! Если вы не закроете Word и не очистите переменные, в диспетчере задач останутся «висеть» скрытые процессыWINWORD.EXE, которые будут съедать оперативную память.
Копирование одного абзаца
Здесь будем использовать «Позднее связывание» (Late Binding) и копировать из приложения Word в Excel текст только одного (двадцатого) абзаца. Полное имя файла Word и имя листа Excel замените на свои.
Двадцатый абзац берём из следующего файла:

Код процедуры для копирования одного абзаца:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub CopyParagraphWordToExcel() ' Объявляем объектные переменные Dim wdApp As Object, wdDoc As Object ' Открываем приложение Word Set wdApp = CreateObject("Word.Application") ' Открываем документ Word Set wdDoc = wdApp.Documents.Open(fileName:="C:\DATA\Личная\Рецепты готовых блюд\Шарлотка на кефире с яблоками.docx") ' Копируем текст 20 абзаца в ячейку "A1" на листе "Время в городе" этой книги ThisWorkbook.Worksheets("Время в городе").Range("A1") = wdDoc.Paragraphs(20).Range ' Закрываем документ Word без сохранения изменений wdDoc.Close SaveChanges:=False ' Закрываем приложение Word wdApp.Quit ' Очищаем объектные переменные Set wdDoc = Nothing Set wdApp = Nothing End Sub |
Результат работы кода:

Обратите внимание, что пустые строки являются отдельными абзацами. Нумерация параграфов начинается с единицы.