Макрос поиска текста для word

Цитата
Сообщение от Lupus
Посмотреть сообщение

что за объект такой Content и чем он отличается от Range ?

Вообще документ состоит из нескольких частей (я все не могу вспомнить):

  1. колонтитулы,
  2. сноски,
  3. надписи,
  4. собственно документ.

Content — это и есть собственно документ.

Что касается Range, то надо различать:

  1. свойство Range;
  2. метод Range.

Метод Range есть только у объекта Document (Activedocument) и Shapes (про Shapes не знаю, ни разу не использовал). С помощью метода можно задавать определённый диапазон, например:

Visual Basic
1
Activedocument.Range(Start:=0, End:=10)

что означает диапазон документа от начала и до десятого знака включительно. Если ничего не указано:

Visual Basic
1
Activedocument.Range

то означает — весь документ. Т.е. в данном случае Range, то же самое, что Content (хотя может разница и есть в чём-то).

В остальных случаях (когда Range не относится к Documents (Activedocument), Range является свойством и с помощью него узнают

порядковый номер символа

(но там путаница большая, если используются в документе кроме символов другие объекты (например, рисунки)) и

содержимое объекта

(например, абзаца):

Visual Basic
1
2
3
4
Sub P3()
'Определение номера символа, когда начинается абзац.
MsgBox ActiveDocument.Paragraphs(1).Range.Start
End Sub
Visual Basic
1
2
3
4
Sub P4()
'Получаем содержимое абзаца.
MsgBox ActiveDocument.Paragraphs(1).Range
End Sub

ВикиЧтение

VBA для чайников
Каммингс Стив

Поиск и замена текста с помощью VBA в Word

Хотя это звучит и несколько необычно, но Find — это объект Word VBA. Объекты Find принадлежат диапазонам и выделенным областям. Для обнаружения или форматирования текста с помощью объекта Find вам потребуется выполнить следующие действия.

1. Получите доступ к объекту Find для определенного диапазона или выделенной области. Если вам необходимо просмотреть целый документ, используйте свойство Content объекта Document для получения доступа к соответствующему диапазону, как показано ниже:

ActiveDocument.Content.Find

2. Определить свойства объекта Find в соответствии с тем, что же вы ищете и как именно вы хотите проводить поиск.

3. Вызвать метод Execute объекта Find. Соответствующий пример приведен ниже:

With OpenRange.Find

.Clear Formatting

.Text = «pogosticks»

.Execute

End With

Для свойств, значения которых явно вы задать не можете, объект Find выбирает параметры, использованные последними или те, которые в настоящий момент заданы в диалоговом окне Найти и заменить программы Word. Именно по этой причине вам всегда следует включать метод Clear Formatting перед началом нового поиска- он позволяет убрать все ранее определенные для проведения поиска параметры форматирования.

Работа с найденным текстом

Основная работа метода Execute — обнаружение первого экземпляра искомого текста или форматирования в указанном диапазоне или выделенной области. После выполнения этого метода вам прежде всего следует определить, было ли найдено то, что вы ищете. Для подобной проверки используйте свойство Found объекта Find совместно с инструкцией If…Then, как показано на примере следующей заготовки программного кода:

If .Found = True Then

(выполнение определенных действий с найденным текстом)

Else

(отображение соответствующего сообщения)

End If

Если метол Execute нашел необходимый текст, исходный диапазон или выделенная область переопределяются таким образом, чтобы содержать найденный текст. Это очень важный момент, поскольку это означает, что вы можете работать с найденным текстом посредством свойств и методов исходного объекта. В следующем примере, представляющем собой расширенный вариант первого фрагмента кода из настоящего раздела, инструкция .Parent. Italic = True обращается к родительскому объекту по отношению к объекту Find, т.е. диапазону OpenRange. При выполнении этой инструкции диапазон OpenRange теперь содержит только найденный фрагмент текста, так как только в нем предусмотрено форматирование курсивом:

With OpenRange.Find

.СlearFormatting

.Text = «pogosticks»

If .Found = True Then

.Parent.Italic = True

Else

MsgBox «No pogosticks found.»

End If

End with

Объект Reolacement принадлежит (а значит, является его свойством) объекту Find. При написании кода для операции поиска и замены вам следует задать свойства и выполнить методы объекта Replacement.

Следующий фрагмент кода заменяет все экземпляры фразы pogosticks словом skateboards. Выделенная область изменяется при выполнении критерия поиска, поскольку доступ к объекту Find осуществляется через объект Selection:

With ActiveDocument.Content.Find

.ClearFormatting

.Text = «pogosticks»

With .Replacement

.ClearFormatting

.Text == «skateboards»

End With

.Execute Replace := wdReplaceAll

End With

Обратите внимание на то, что метод Execute может использовать аргумент Replace, предназначенный для контроля за тем, будут ли заменены все обнаруженные экземпляры обнаруженного фрагмента текста, или только первый.

Читайте также

Поиск и замена данных

Поиск и замена данных
В программе HtmlPad реализована возможность быстрого поиска данных. Этот механизм полезно использовать при работе с большими программными кодами или с большими объемами данных, поскольку поиск требуемой информации вручную (например, путем просмотра

Поиск и замена данных

Поиск и замена данных
В программе Extra Hide Studio имеется удобный механизм для быстрого поиска и замены данных. Эта возможность особенно актуальна при работе с большими исходными кодами, поскольку поиск данных путем просмотра всего кода может занять слишком много времени, и к

Глава 2 Подготовка текста в Microsoft Word

Глава 2 Подготовка текста в Microsoft Word
• Общие сведения о Word 2007• Основные правила форматирования• Вставка стандартных блоков в документ• Нумерация страниц и колонтитулы• Проверка правописания, поиск синонимов, перевод слов• Сноски и закладки• Настройка параметров

3.1. Поиск и замена фрагментов

3.1. Поиск и замена фрагментов
Текстовый редактор успешно справляется с поиском и заменой текста в отдельном файле. Однако, если это же нужно сделать сразу в нескольких файлах, лучше воспользоваться специальными программами, с помощью которых можно заменить фрагменты

Поиск и замена текста

Поиск и замена текста
В текстовом редакторе Adobe InDesign можно воспользоваться полезнейшей функцией поиска и замены фрагментов текста. Причем, раз мы имеем дело с программой верстки, найденные фрагменты можно не только заменить другими, но и оформить каким-то образом –

Поиск и замена форматирования

Поиск и замена форматирования
Для поиска текста с определенным форматированием используйте свойства объекта Find, касающиеся форматирования. Они идентичны свойствам, используемым при работе с форматированием диапазона или выделенной области, как я уже отмечал в разделе

Автоматический поиск и замена данных

Автоматический поиск и замена данных
В процессе работы иногда возникает необходимость быстро найти те или иные данные (слово, текстовый фрагмент и т. д.) либо заменить одни данные на другие. Для решения такой задачи в Publisher 2007 реализован механизм автоматического поиска и

Поиск и замена

Поиск и замена
В новой версии Excel был полностью изменен пользовательский интерфейс и расширены функциональные возможности средства Найти и заменить. Теперь можно с помощью одной операции производить поиск и замену по всем листам книги, повторно выполнять запросы поиска

Поиск и замена символов

Поиск и замена символов
Иногда при подготовке электронных документов возникает задача поиска определенных текстовых фрагментов. Например, вы забыли номер чертежа, но помните, что в его названии или дополнительной информации, размещенной на чертеже, содержится

Глава 2 Подготовка текста в Microsoft Word

Глава 2
Подготовка текста в Microsoft Word
Microsoft Word – пожалуй, самая популярная на сегодняшний день программа, предназначенная для работы с текстами. Продукт компании Microsoft обладает всеми необходимыми возможностями, связанными с набором и правкой текстов любой сложности.

5.7. Поиск и замена

5.7. Поиск и замена
В документе можно производить автоматический поиск текста и замену его другим.Поиск и замена ведется по введенному образцу. Если в качестве образца указано слово «ход», то компьютер найдет и слово «пароход», если предварительно не поставить условие, что

13.3.4. Поиск и замена текста

13.3.4. Поиск и замена текста
Как вы уже догадались, окно Найти и заменить используется не только для перехода на нужную страницу. Вкладка Найти используется для поиска текста. Для быстрого доступа к этой вкладке нажмите Ctrl+F или выберите команду меню Правка, Найти. Нажмите

Поиск и замена

Поиск и замена
Для поиска в тексте документа нужного слова или сочетания символов служит окно поиска и замены (рис. 9.19), которое открывается нажатием Ctrl+F. Если надо, чтобы оно сразу открылось как окно замены, используйте сочетание Ctrl+H.

Рис. 9.19. Окно поиска и замены.Для

Поиск и замена фрагментов фильма

Поиск и замена фрагментов фильма
Очень часто бывает нужно найти в изображении или фильме Flash какой-либо текст и, возможно, заменить его на другой. Специально для этого Flash, как и многие другие программы, работающие с документами, предлагает богатые возможности по поиску и

Поиск и замена текста

Поиск и замена текста
Поиск определенного слова или фразы в большом документе является довольно непростой задачей, но ее можно значительно упростить, если воспользоваться командой Главная ? Редактирование ? Найти. В появившемся окне (рис. 5.20) введите искомый текст и

Поиск и замена данных

Поиск и замена данных
По современным меркам таблица с несколькими тысячами записей считается небольшой, но даже в такой таблице ручной поиск или отбор нужной информации может занять продолжительное время. С помощью средств поиска, сортировки и фильтрации нужные данные

Angry word helper

Возможно, у вас есть ощущение, что тема макросов в Ворде достаточно маргинальная. Кто ими может пользоваться-то вообще? Ну, малварь делают иногда… Да и пишутся они на давно забытом VBA (Visual Basic for Applications, он же несколько урезанный Visual Basic 6 в интерпретируемом виде), фу!

Но на самом деле у многих ведь возникает потребность то какой-нибудь отчётик в ворде написать, то курсовую оформить, то резюме перед отправкой в компанию вашей мечты подправить… А у некоторых работа напрямую связана с Word. Часто различные системы документации предлагают экспорт в форматы doc или docx, которые нужны вашим заказчикам. И бывает, что документы после экспорта выглядят фигово, приходится их исправлять.

Работа в ворде нередко подразумевает выполнение каких-то однообразных повторяющихся действий, которые иногда (но далеко не всегда!) решаются грамотной настройкой стилей и их применением, а также использованием шаблонов. Как же автоматизировать всё остальное? Тут-то нам на помощь приходят те самые макросы.

Что же в них такого хорошего? Ну, например, они автоматически и достаточно быстро выполняют за вас однообразные действия. Могут что-то подсчитать, переформатировать документ, пометить аннотациями подозрительные места, — словом, всё, что запрограммируете. Могут даже в режиме реального времени что-то исправлять и о чем-то предупреждать, пока вы пишете документ. VBA в Word позволяет автоматизировать практически все действия, которые вы можете выполнить с документом вручную.

Макросы можно прикрепить как к конкретному документу (в чём для нас мало пользы, а для писателей троянов это единственная опция), так и к самому ворду, что позволяет применять макросы к любому документу, с которым вы работаете.

Макросы работают в любой версии Word и требуют минимум правок при переносе с одной версии на другую (а чаще всего вообще не требуют). На макросах можно даже реализовать полноценный пользовательский интерфейс с формами!

Давайте же занырнём в Visual Basic и напишем что-нибудь полезное! В качестве первого примера я покажу, как сделать макрос, который заменит два и более последовательных перевода строки на единственный. Это часто требуется при исправлении документов после экспорта из систем документации, или если вы хотите удалить случайно проставленные лишние переводы строк в собственноручно написанном документе. Макрос сделаем добротный, с пользовательским интерфейсом и прогрессом выполнения операции.

Чтобы начать писать или использовать макросы, сначала требуется убедиться, что в Word’е отображается панель «Разработчик» («Developer»). Если она у вас не отображается, следует зайти после создания нового документа в меню «Файл» («File») -> «Параметры» («Options») -> «Настроить ленту» («Customize Ribbon»), после чего найти там и установить флажок «Разработчик» («Developer»).

Enable Word developer tab

После этого нужно зайти на вкладку «Разработчик» и выбрать меню «Visual Basic».

Word Visual Basic button

В открывшемся окне слева вы увидите два проекта: «Normal» и проект, относящийся к текущему открытому документу. Возможно, в проекте «Normal» у вас уже будет какой-то файл в каталоге «Modules». В любом случае, создайте новый модуль, кликнув правой кнопкой по проекту «Normal» и выбрав «Insert» -> «Module».

Word insert new module

Созданный модуль представляет из себя файл, куда мы и будем писать код макросов. Можно переименовать модуль (по умолчанию его имя будет «Module1») в окне «Properties» -> «Name». Я назову свой модуль «AllMacros». Теперь откроем код модуля, дважды кликнув по его имени, и приступим к созданию макроса. Напомню, что наша цель — заменить два и более последовательных перевода строки на единственный, произведя замены по всему документу. Очевидно, нам потребуется функция, которая осуществляет поиск по тексту, ведь мы хотим найти несколько последовательных переводов строки. В Word это эквивалентно началу нового параграфа. Вы могли бы осуществить поиск начала нового параграфа через обычное окно поиска, введя в поле поиска ^p, ^13 или ^013 (что соответствует ASCII-коду перевода строки). Функция поиска будет выглядеть так:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

Private Function FindNextText(text As String, useWildcards As Boolean)

    Selection.Find.ClearFormatting

    Selection.Find.Replacement.ClearFormatting

    With Selection.Find

        .Text = text

        .Forward = True

        .Format = False

        .MatchCase = False

        .MatchWholeWord = False

        .MatchKashida = False

        .MatchDiacritics = False

        .MatchAlefHamza = False

        .MatchControl = False

        .MatchWildcards = useWildcards

        .MatchSoundsLike = False

        .MatchAllWordForms = False

        .Wrap = wdFindStop

    End With

    Selection.Find.Execute

    FindNextText = Selection.Find.Found

End Function

Давайте разберём, что тут происходит. Мы объявляем функцию с двумя параметрами. Первый имеет тип String — это текст для поиска, а второй Boolean говорит о том, нужно ли использовать символы подстановки (wildcards). Про них я поговорю позже. В следующих двух строках 2 и 3 мы очищаем форматирование для строки поиска и строки замены, если оно было задано пользователем. Word позволяет задать форматирование строки поиска/замены, а для нашей задачи это не требуется. Далее мы задаём набор параметров для объекта Selection.Find: выставляем неинтересные нам параметры в False, параметр Text — это текст, который мы хотим найти, а параметр MatchWildcards указывает на использование символов подстановки. Параметр Wrap говорит о том, следует ли продолжать поиск, когда мы дошли до той точки, с которой поиск начали, и у нас его значение установлено в wdFindStop, так как мы хотим остановиться, когда дойдём до конца документа, и не зацикливать поиск.

Вообще, всё это обилие свойств и объектов из объектной модели Word, Excel и PowerPoint (да, там тоже есть макросы) хорошо описано в MSDN. Например, вот тут перечислены свойства и методы объекта Find. Есть русская документация (скажем, эта страница), но она выполнена совершенно кринжовым машинным переводом, невозможно читать:

Есть совершенно смехотворные страницы:

В общем, лучше читайте на английском. :D

Кроме того, все доступные объекты, их свойства и методы можно посмотреть прямо в редакторе VBA в самом Word’е. Для этого нужно нажать F2 или выбрать меню «View» -> «Object browser», что приведет к открытию браузера объектов (Object browser), в котором можно пролистать или поискать то, что вам доступно.

Word object browser

Но вернёмся к нашей функции. На строке 19 мы непосредственно выполняем поиск заданного текста с указанными параметрами. Строка 20 — эта конструкция, аналогичная return в си-подобных языках, указывает возвращаемое значение функции. Мы возвращаем булевое значение Selection.Find.Found, которое говорит о том, было ли что-то найдено.

Хочу заметить, что использование объекта Selection.Find и изменение его свойств заменит их значения и для пользователя. Например, если вы в Word искали что-то хитроумное с конкретно заданными параметрами, то выполнение макроса заменит ваши параметры поиска на те, которые мы задали в макросе. В идеале, их можно запомнить, а потом вернуть, но мы не будем так сильно заморачиваться, а просто всё за собой подчистим. Сделаем функцию, которая сбрасывает параметры в значения по умолчанию:

Private Sub ClearFindAndReplaceParameters()

    With Selection.Find

       .ClearFormatting

       .Replacement.ClearFormatting

       .Text = «»

       .Replacement.Text = «»

       .Forward = True

       .Wrap = wdFindStop

       .Format = False

       .MatchCase = False

       .MatchWholeWord = False

       .MatchWildcards = False

       .MatchSoundsLike = False

       .MatchAllWordForms = False

    End With

End Sub

Обратите внимание, что это уже Sub, а не Function, потому что мы не хотим из этой процедуры возвращать никакое значение. Это аналог функции void в си-подобных языках.

Теперь нужно определить, как нам найти два или более последовательных перевода строки. Для этого нам и потребуются упомянутые ранее wildcards. Word поддерживает символы подстановки при поиске, и по своей функциональности они напоминают регулярные выражения. Кстати, вы можете ими пользоваться и без макросов из окна расширенного поиска:

Word wildcards

Хорошее описание символов подстановки я нашел здесь, правда, на английском языке. Составим регулярное выражение для поиска двух и более последовательных переводов строки: [^013]{2,}. Это очень похоже на классическое регулярное выражение Perl или PCRE, но в квадратных скобках в уникальном стиле Word мы задаем символ перевода строки. Фигурные скобки указывают, что символов перевода подряд должно быть два или более. Тут, кстати, есть нюанс: не во всех версиях/локализациях Word такая регулярка заработает. В некоторых случаях вместо запятой потребуется указать точку с запятой (да, в Microsoft иногда делают крайне странные вещи). Чтобы сделать наш макрос более универсальным, напишем функцию, которая вернёт регулярное выражение, пригодное для поиска в той версии Word, в которой эту функцию запустили:

Private Function GetLineBreakSearchRegExp()

    On Error GoTo Err

    FindNextText «[^013]{2,}», True

    GetLineBreakSearchRegExp = «[^013]{2,}»

    Exit Function

Err:

    GetLineBreakSearchRegExp = «[^013]{2;}»

End Function

Здесь мы сначала пытаемся осуществить поиск с помощью wildcard’а [^013]{2,}. Если всё окей, то вернём из функции этот самый wildcard как рабочий (строка 4). В противном случае произойдёт ошибка, но мы готовы её обработать: мы установили обработчик всех ошибок в строке 2. Нас перекинет на метку Err, и тут мы вернём wildcard, который пригоден для других ревизий Word (в котором запятая внутри фигурных скобок заменена на точку с запятой).

Далее напишем функцию, которая будет заменять несколько последовательных переводов строки на единственный:

Private Sub RemoveNextEnters()

    Selection.MoveStart wdWord, 1

    If Selection.Range.Start <> Selection.Range.End Then Selection.Delete

End Sub

Эта функция подразумевает, что вызывать её будут тогда, когда объект Selection указывает на найденные несколько переводов строки. В строке 2 перемещаем начало выделения (а в выделены у нас будут все найденные последовательные переводы строки) на один символ вперед, а затем в строке 3, если начало выделения не совпадает с его концом, удаляем его содержимое. Таким образом, если было выделено три перевода строки, мы отступаем вперед на 1 символ (оставляя один перевод строки нетронутым), а затем удаляем оставшиеся два.

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

Sub RemoveExcessiveEnters()

    Dim lineBreakSearchRegExp As String

    lineBreakSearchRegExp = GetLineBreakSearchRegExp()

    Selection.HomeKey Unit:=wdStory

    While FindNextText(lineBreakSearchRegExp, True) = True

        RemoveNextEnters

    Wend

    ClearFindAndReplaceParameters

End Sub

Здесь мы оперируем ранее написанными функциями. Сначала получаем текст регулярного выражения (wildcard’а) для поиска нескольких переводов строки подряд, затем вызовом HomeKey в строке 5 переходим в самое начало документа (перемещаем туда курсор), а затем в цикле ищем все интересующие нас места и удаляем излишние переводы строки. В конце сбрасываем параметры поиска на значения по умолчанию.

Finished word macro

Вот и всё, макрос можно запускать! Обратите внимание, что все функции, кроме последней, мы пометили Private. Мы не хотим, чтобы их вызывали напрямую. Доступной для вызова снаружи будет только функция RemoveExcessiveEnters. Перед запуском макроса стоит убедиться, что макросы включены. Если вылазит такая панель, то нужно нажать «Включить содержимое» («Enable content»):

Word enable content

Если такой панели нет, то можно зайти в меню «Файл» («File») -> «Сведения» («Info») и включить макросы уже оттуда:

Word enable content from info menu

Вы можете включить макросы на время одного сеанса Word (это по умолчанию и происходит, если нажимаете «Включить содержимое»), так что после перезапуска Word макросы снова будут отключены. Для запуска макроса возвращаемся в Word на панель «Разработчик» и нажимаем кнопку «Макросы» («Macros»), выбираем наш макрос RemoveExcessiveEnters и нажимаем «Выполнить» («Run»). Разумеется, у вас должен быть открыт какой-нибудь подопытный документ, где имеются лишние переводы строк. В качестве бонуса наш макрос ещё и удалит пустые элементы списков, потому что они представляют из себя точно такие же несколько переводов строки подряд.

Word macro: before and after

Макрос выполняется достаточно быстро. Его действие можно отменить (каждый шаг независимо), открыв меню выполненных действий:

Undo Word macro

Макросы можно отлаживать через окно VBA, в котором мы писали макрос. Кликнув слева от строки кода, можно, как и в других средах разработки, поставить точку останова, а потом запустить макрос кнопкой «Run». Запустится та функция, на которой у вас находится курсор. Если вы поставите курсор на функцию с параметрами, то появится обычный запрос на выбор макроса для запуска, как при нажатии на кнопку «Макросы» в Word.

Debug Word macros

Думаю, что материала для одной статьи уже вполне достаточно. Я, конечно, пообещал горы функционала в виде интерфейса пользователя, отслеживания прогресса выполнения, и всё это обязательно будет, но в следующей публикации.

Код макроса можно скачать тут. Вы сможете его импортировать к себе в Word, кликнув правой кнопкой на «Normal» -> «Import file…» и выбрав загруженный файл.

P.S. Кстати, рекомендую создавать бэкапы своих макросов, экспортируя их куда-нибудь на диск. Даже лицензионный Word имеет свойство их иногда по какой-то причине удалять из шаблона Normal, в котором мы их создавали.

Sub Выделить_между()
    Dim MyRange As Range, rStart&, rEnd&
    Set MyRange = ActiveDocument.Content
    With MyRange
        With .Find
            .ClearFormatting
            .Text = "Структура активов"
            .Forward = True
            .Wrap = wdFindStop
            .Format = False
            .MatchCase = False
            .MatchWholeWord = True
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
            .Execute
            If .Found Then rStart = MyRange.End: rEnd = rStart
        End With
    End With
    Set MyRange = ActiveDocument.Content
    With MyRange
        With .Find
            .Text = "Внеоборотные активы"
            .Execute
            If .Found Then rEnd = MyRange.Start
        End With
    End With
    If rEnd > rStart Then
        ActiveDocument.Range(rStart, rEnd).Select
        Selection.Copy
    End If
End Sub
 
Sub Выделить_между2()
Dim r
Set r = ActiveDocument.Range
With r.Find
    .ClearFormatting
    .Text = "Структура активов*Внеоборотные активы"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchWildcards = True
    If .Execute Then
        ActiveDocument.Range(r.Start + 4, r.End - 4).Select
        Selection.Copy
    Else
        MsgBox "Текст не найден!", vbExclamation
    End If
End With
End Sub
Sub Макрос1()
'
' Макрос1 Макрос
 
For Each dd In ActiveDocument.Tables
    asq = asq + 1
    dd.Name
Next
 
End Sub

Поиск заданной фразы в документах Word

Sashagor1982

Дата: Суббота, 03.06.2017, 23:32 |
Сообщение № 1

Группа: Проверенные

Ранг: Обитатель

Сообщений: 275


Репутация:

-6

±

Замечаний:
0% ±


Excel 2007

Здравствуйте, подскажите, можно ли программным путем решить следующую задачу. В приложенном файле архив, в котором находится файл-пример и папка «2017 год» содержащая документы Word. Вопрос состоит с следующем, в столбце A файла примера определенные фразы и т.д., необходимо, что бы в той же строке в столбцах B, C и т.д. в результате выполнения программы значения равнялись именам файлов который содержит данную фразу (при этом таких файлов может быть много).

К сообщению приложен файл:

6226717.rar
(21.9 Kb)

 

Ответить

Michael_S

Дата: Воскресенье, 04.06.2017, 02:43 |
Сообщение № 2

Группа: Друзья

Ранг: Старожил

Сообщений: 2012


Репутация:

373

±

Замечаний:
0% ±


Excel2016

можно ли программным путем решить следующую задачу

Можно.

 

Ответить

Sashagor1982

Дата: Воскресенье, 04.06.2017, 09:35 |
Сообщение № 3

Группа: Проверенные

Ранг: Обитатель

Сообщений: 275


Репутация:

-6

±

Замечаний:
0% ±


Excel 2007

Каким образом?

 

Ответить

Michael_S

Дата: Воскресенье, 04.06.2017, 10:10 |
Сообщение № 4

Группа: Друзья

Ранг: Старожил

Сообщений: 2012


Репутация:

373

±

Замечаний:
0% ±


Excel2016

Из Excel открывать поочердно файлы Word, в каждом поиском проверять наличие нужных данных; нашли-отметили.

 

Ответить

Sashagor1982

Дата: Воскресенье, 04.06.2017, 11:35 |
Сообщение № 5

Группа: Проверенные

Ранг: Обитатель

Сообщений: 275


Репутация:

-6

±

Замечаний:
0% ±


Excel 2007

Другие варианты.

 

Ответить

Michael_S

Дата: Воскресенье, 04.06.2017, 11:51 |
Сообщение № 6

Группа: Друзья

Ранг: Старожил

Сообщений: 2012


Репутация:

373

±

Замечаний:
0% ±


Excel2016

Другой вариант — открывать файлы Word вручную, также вручную поиском искать нужное и отмечать, если найдено.

Я бы мог сделать нужный макрос, но на это нужно потратить не менее полноценного рабочего дня. Оно мне надо?
…может найдется кто, кому это интересно ради саморазвития…

Сообщение отредактировал Michael_SВоскресенье, 04.06.2017, 11:53

 

Ответить

Pelena

Дата: Воскресенье, 04.06.2017, 12:24 |
Сообщение № 7

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Michael_S, при всём моём уважении, зачем было заводить этот разговор, если помогать не собирались?


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

VSerg

Дата: Воскресенье, 04.06.2017, 14:08 |
Сообщение № 8

Группа: Пользователи

Ранг: Прохожий

Сообщений: 8


Репутация:

2

±

Замечаний:
0% ±


Excel 2013

Попробовал ради саморазвития. Уверен что можно упростить и оптимизировать, но так скажем, для начала, можно попробовать так:

И еще, я немного переформатировал ваш пример, добавив пробел, как разделитель между словами, иначе не знаю как использовать функцию Split. Возможно, нужно искать символ новой строки.

К сообщению приложен файл:

6226717.zip
(37.9 Kb)

Сообщение отредактировал VSergВоскресенье, 04.06.2017, 14:28

 

Ответить

Sashagor1982

Дата: Воскресенье, 04.06.2017, 15:00 |
Сообщение № 9

Группа: Проверенные

Ранг: Обитатель

Сообщений: 275


Репутация:

-6

±

Замечаний:
0% ±


Excel 2007

VSerg, выдает ошибку на строке:
[vba]

Код

Dim objWord As Word.Application

[/vba]

 

Ответить

Sashagor1982

Дата: Воскресенье, 04.06.2017, 15:08 |
Сообщение № 10

Группа: Проверенные

Ранг: Обитатель

Сообщений: 275


Репутация:

-6

±

Замечаний:
0% ±


Excel 2007

Я так же переработал пример, в документе Word эти слова будут разделены запятой.

К сообщению приложен файл:

4420224.rar
(23.3 Kb)

 

Ответить

VSerg

Дата: Воскресенье, 04.06.2017, 15:14 |
Сообщение № 11

Группа: Пользователи

Ранг: Прохожий

Сообщений: 8


Репутация:

2

±

Замечаний:
0% ±


Excel 2013


Лучше конечно указывать какую ошибку. Но рискну предположить, что нет ссылки на Microsoft Word Object Library. Нужно зайти в меню Инструменты => ссылки и установить галочку.
Если разделитель запятая, то попробуйте изменить строку[vba]

Код

s = Split(.Range.Text, «,»)

[/vba]

 

Ответить

buchlotnik

Дата: Воскресенье, 04.06.2017, 16:00 |
Сообщение № 12

Группа: Заблокированные

Ранг: Участник клуба

Сообщений: 3442


Репутация:

929

±

Замечаний:
20% ±


2010, 2013, 2016 RUS / ENG

VSerg, я думаю, что проблема состоит в том, что у вас 2013, а у ТС — 2007. У Экселя есть проблема обратной совместимости и ваш файл пытается найти у Sashagor1982 библиотеку 2013 Word, которой просто нет. Поскольку вы всё равно используете позднее связывание в области имён достаточно переписать [vba]

Код

Dim objWord As Object
Dim wrdDoc As Object

[/vba] и тогда ссылка на библиотеку вовсе не нужна

Сообщение отредактировал buchlotnikВоскресенье, 04.06.2017, 18:08

 

Ответить

Sashagor1982

Дата: Воскресенье, 04.06.2017, 19:52 |
Сообщение № 13

Группа: Проверенные

Ранг: Обитатель

Сообщений: 275


Репутация:

-6

±

Замечаний:
0% ±


Excel 2007

VSerg, buchlotnik, Спасибо, чуть доработал код, программа в принципе рабочая. Однако, есть ли другие варианты решения задачи? В этом варианте программа разбивает файлы на слова и каждое проверяет что при большом количестве файлов и данных в файлах очень долго, а достаточно просто знать содержит ли Word-файл данное значение или нет.

К сообщению приложен файл:

0674271.rar
(26.3 Kb)

 

Ответить

RAN

Дата: Воскресенье, 04.06.2017, 20:12 |
Сообщение № 14

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Писать с нуля и тестировать было лениво.
[vba]

Код

Sub SearchInMSWord()
    Dim FSO As Object
    Dim SourceFolder As Object
    Dim FileItem As Object
    Dim objWord As Object
    Dim wrdDoc As Object
    Dim i As Long
    Dim lLastRow As Long
    Dim myRange As Object

    lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
    Set FSO = CreateObject(«Scripting.FileSystemObject»)
    Set SourceFolder = FSO.getfolder(ThisWorkbook.Path & «/2017 год»)
    Set objWord = CreateObject(«Word.Application»)

    For Each FileItem In SourceFolder.Files
        Set wrdDoc = objWord.Documents.Open(FileItem.Path, , True)
        For i = 1 To lLastRow
            Set myRange = wrdDoc.Content
            myRange.Find.Execute Cells(i, 1).Value, , , , , , True
            If myRange.Find.Found Then Cells(i, Columns.Count).End(xlToLeft).Next = wrdDoc.Name
            Set myRange = Nothing
        Next
        wrdDoc.Close
    Next
    objWord.Quit
    Set wrdDoc = Nothing: Set objWord = Nothing: Set SourceFolder = Nothing: Set FSO = Nothing
End Sub

[/vba]
Протестировал, поправил


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RANВоскресенье, 04.06.2017, 20:52

 

Ответить

Sashagor1982

Дата: Понедельник, 05.06.2017, 13:23 |
Сообщение № 15

Группа: Проверенные

Ранг: Обитатель

Сообщений: 275


Репутация:

-6

±

Замечаний:
0% ±


Excel 2007

[vba]

Код

Set wrdDoc = objWord.Documents.Open(FileItem.Path, , True)

[/vba]
На данной строке выдает ошибку Файл поврежден.

Сообщение отредактировал Sashagor1982Вторник, 06.06.2017, 10:43

 

Ответить

Sashagor1982

Дата: Вторник, 06.06.2017, 10:44 |
Сообщение № 16

Группа: Проверенные

Ранг: Обитатель

Сообщений: 275


Репутация:

-6

±

Замечаний:
0% ±


Excel 2007

Программа видит скрытые файлы в этом и была проблема. Спасибо, задача решена.

 

Ответить

Leprotto

Дата: Пятница, 23.06.2017, 12:04 |
Сообщение № 17

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 139


Репутация:

1

±

Замечаний:
0% ±


Excel 2016

Всем привет!
А можно сделать то же самое, только чтобы поиск значения осуществлялся в конкретном месте файла ворд?
Например в таблице или пометить нужное место стилем «Заголовок/подзаголовок» ;)
Вышеизложенное решение уж больно долго работает в больших документах :(

 

Ответить

AndreTM

Дата: Пятница, 23.06.2017, 12:23 |
Сообщение № 18

Группа: Друзья

Ранг: Старожил

Сообщений: 1762


Репутация:

498

±

Замечаний:
0% ±


2003 & 2010

Можно.
И чтобы не менять оформление документов — пометьте нужные куски закладками, а затем вместо всего wrdDoc.Content ищите по коллекции wrdDoc.Bookmarks (Bookmarks(i).Range.Text -содержимое закладки).


Skype: andre.tm.007
Donate: Qiwi: 9517375010

 

Ответить

Leprotto

Дата: Понедельник, 26.06.2017, 12:50 |
Сообщение № 19

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 139


Репутация:

1

±

Замечаний:
0% ±


Excel 2016

AndreTM, СУПЕР, СПАСИБО!
Правда сначала помечал закладкой кусок текста и выяснилось, что при корректировке этого текста объем закладки меняется.
Поместил нужное в таблицу и пометил закладкой всю ячейку. Работает отлично :D

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Макрос поиска строки excel
  • Макрос пароль на книгу excel
  • Макрос объединить ячейки word
  • Макрос поиска решений в excel
  • Макрос очистки диапазона ячеек excel