Необходимо разобрать текст из Word в Sheets
Макропод
Модератор в отставке
- #2
Код VBA:
Sub GetWordData() 'Примечание: этот код требует ссылки на объектную модель Word. См. Инструменты VBE | Ссылки. Application.ScreenUpdating = Ложь Dim wdApp As New Word.Application, wdDoc As Word.Document, c As Long, r As Long Dim strFolder как строка, strFile как строка, WkBk как рабочая книга, WkSht как рабочий лист strFolder = GetFolder: Если strFolder = "" Then GoTo ErrExit Установите WkBk = ActiveWorkbook strFile = Dir(strFolder & "\*.Как закодировано, макрос предполагает, что первый рабочий лист вашей книги отформатирован с требуемым макетом и содержит только первые четыре строки, которые должны отображаться на всех рабочих листах.13" .Замена.Текст = "" .Вперед = Истина .Wrap = вдфиндстоп .MatchWildcards = Истина .Выполнять Конец с Делать, пока .Find.Found г = г + 1 'Разобрать и записать текст в Excel Для с = от 1 до 4 WkSht.Cells(r, c).Value = Trim(Split(Split(.Text, vbCr)(c - 1), ":")(1)) Следующий .Collapse wdCollapseEnd .Найти.Выполнить Петля Конец с .Закрыть SaveChanges:=False Конец с стрФайл = Каталог() Венд ОшибкаВыход: wdApp.Quit Установить wdDoc = Ничего: Установить wdApp = Ничего: Установить WkSht = Ничего: Установить WkBk = Ничего Application.ScreenUpdating = Истина Конец сабвуфера Функция GetFolder() как строка Dim oFolder как объект ПолучитьПапку = "" Set oFolder = CreateObject("Shell.Application").BrowseForFolder(0, "Выберите папку", 0) Если (Not oFolder равно Nothing) Then GetFolder = oFolder.Items.Item.Path Установить папку = Ничего Завершить функцию
Голосовать за 0
Джмайо
Новый член
- #3
- Какие изменения в вашем коде мне нужно внести, чтобы адаптировать его для поиска документов Word, на которые есть ссылки? Куда мне нужно вставить путь к файлу/каталогу к указанным файлам? Извините, что я такой новичок в этом.
Вот что я пробовал до сих пор:
- Скопировал код в редактор рабочей книги.
- Зашел в Инструменты/Ссылки и выбрал/добавил библиотеку объектов Microsoft Word 16.0
- Изменена/назначена папка для файлов путем изменения GetFolder = «»
- Функция GetFolder() как строка
Dim oFolder как объект
GetFolder = « мой путь к файлу/каталогу »
- Функция GetFolder() как строка
- Перешел в режим отладки и начал выполнять код. Получил эту ошибку «Ошибка времени выполнения« 429 »: компонент ActiveX не может создать объект» при попытке выполнить Set oFolder = CreateObject («Shell.Application»). BrowseForFolder (0, «Выберите папку», 0)
Еще раз, мои глубочайшие извинения за то, что я такой зеленый, но я ценю ваш опыт. Я знаю достаточно, чтобы понять, что это можно сделать только с помощью VBA, но у меня нет навыков, чтобы осуществить это. 0023
Голосовать за 0
Макропод
Модератор в отставке
- #4
Вы не должны были возиться с функцией GetFolder. Функция существует, чтобы позволить вам выбрать исходную папку при запуске макроса. Если вы хотите жестко закодировать путь, вы можете полностью удалить функцию и изменить:
strFolder = GetFolder: If strFolder = «» Then GoTo ErrExit
to:
strFolder = « мой путь к файлу/каталогу »
Голосовать за 0
Джмайо
Новый член
- #5
РЕКЛАМА
К сожалению, эти изменения также не позволили запустить макрос. Я попытался вставить макрос, как написано, а затем выполнить функцию, однако браузер не открыл папку, в которой находятся файлы Word. Вместо этого я получил сообщение об ошибке, в котором говорилось, что «компонент ActiveX не может создать объект». Итак, я попытался жестко закодировать путь. Очевидно, это сработало нормально, поскольку появилось всплывающее окно, в котором говорилось, что я должен предоставить разрешение на доступ к файлу (что я и сделал). Я продолжал пошагово выполнять макрос, но множество шагов было пропущено, поскольку подсветка перешла от While strFile <> «» непосредственно к wdApp.Quit. Итак, не зная, как должен вести себя макрос, я снова сделал шаг, и Word запустился, а на этот раз появилось еще одно сообщение об ошибке, говорящее «недостаточно памяти».Я уверен, что многие из этих проблем возникают, потому что все это делается на Mac, и я пытаюсь включить документ Word. Итак, с вашего позволения, я хотел бы предложить небольшое изменение моего подхода. Я также работаю через удаленный рабочий стол Windows, и в приложение встроен Excel 2013 с VBE. Я уже перенес на него большую часть проекта и попробовал ваш код, написанный на новом листе. Работала функция поиска папки — РЕШЕНО. Самым большим изменением является формат файла. Я буду сохранять документы на удаленном рабочем столе в виде текстовых файлов (.txt), а для их чтения доступно приложение «Блокнот». Будет ли слишком сложно модифицировать код с этими изменениями?
Спасибо за терпение и помощь.
Голосовать за 0
Макропод
Модератор в отставке
- #6
Тот факт, что вы используете Mac, имеет принципиальное значение. Вы должны были сказать это в самом начале. Код, который я предоставил, предназначен для ПК с Windows; это не будет работать на Mac.Джмайо сказал:
Я уверен, что многие из этих проблем возникают из-за того, что все это делается на Mac, и я пытаюсь включить документ Word.
Нажмите, чтобы развернуть…
Там код должен работать нормально.Джмайо сказал:
Итак, с вашего позволения, я хотел бы предложить небольшое изменение моего подхода. Я также работаю через удаленный рабочий стол Windows, и в приложение встроен Excel 2013 с VBE.
Нажмите, чтобы развернуть…
Еще одно важное изменение. Блокнот не может быть автоматизирован таким образом. Почему, если вы используете файлы .txt, вы предоставили файлы .docx для тестирования? Однако обработка все еще может быть выполнена с помощью Word. Просто измените:Джмайо сказал:
Я уже перенес на него большую часть проекта и попробовал ваш код, написанный на новом рабочем листе. Работала функция поиска папки — РЕШЕНО. Самым большим изменением является формат файла. Я буду сохранять документы на удаленном рабочем столе в виде текстовых файлов (.
txt), а для их чтения доступно приложение «Блокнот». Будет ли слишком сложно модифицировать код с этими изменениями?Нажмите, чтобы развернуть…
strFile = Dir(strFolder & «\*.docx», vbNormal)
на:
strFile = Dir(strFolder & «\*.txt», vbNormal)
и измените:
WkSht.Name = Split(strFile , «.doc»)(0)
to:
WkSht.Name = Split(strFile, «.txt»)(0)
Голосовать за 0
Макропод
Модератор в отставке
- #7
Изменение:
Код VBA:
Установить WkSht = WkBk.Sheets.Add: r = 4 WkSht.Name = Разделить (strFile, ".doc") (0) WkBk.Sheets(1).Range.Copy ВкШт.Паста WkSht.Range("A2").Value = WkSht.Nameдо:
Код VBA:
С WkBk Установите WkSht = .Sheets.Add .Листы("Лист1").UsedRange.Copy Конец с С ВкШт .Вставить .Name = Разделить (strFile, ".doc") (0) .Range("A2").Value = WkSht.Name Для c = от 1 до 5 .Столбцы(c).ColumnWidth = Рабочие листы("Лист1").Столбцы(c).ColumnWidth Следующий Для г = от 1 до 4 .Rows(r).RowHeight = Рабочие листы("Лист1").Rows(r).RowHeight Следующий Конец с r = 4Имейте в виду, что, учитывая количество данных, которые необходимо обработать в ваших примерах, вы должны ожидать, что код займет 20-30 секунд на файл.