На чтение 10 мин Просмотров 11.8к.
Обновлено 07.03.2023
В статье подробно разбираем метод find() в Python: описание, синтаксис, применение.
Содержание
- Описание метода find()
- Синтаксис
- Поиск символа или подстроки в строке
- Поиск символа в подстроке со start и end
- Проверка есть ли символ в строке
- Метод rfind()
- Вывод
Описание метода find()
Функция find() в языке python (питон) используется для поиска первого вхождения символа или подстроки во всей строке, либо только в ее отрезке.
Примечательно, что если в качестве аргумента, который необходимо найти, отправить подстроку, то ошибка не вернется. Вместо этого функция решит найти подстроку в строке python. Конечно, сначала будет казаться, что лучше бы возвращался и начальный и конечный элемент, но в таком случае тогда придется создавать список.
Да и к тому же, если разработчик будет знать размер искомой строки, индекс первого элемента, то он может получить и индекс последнего элемента, прибавив размер подстроки и отняв.
1. Метод find работает только со строками, для списков и словарей используются совсем другие методы.
Если же нужная подстрока или буква не были найдены внутри строки, то возвращается значение -1.
Кстати, если вы уже думаете сделать конструкцию, в которой с помощью функции find определяется индекс, а после сразу происходит вывод по этому индексу, то это плохая идея. Если буква не будет найдена, то будет возвращено значение -1 (как мы уже говорили).
Если обратиться к минус первому элементу, то питон вернет самый последний элемент (например, в слово «сайт» элемент с индексом -1 – это «т»). Дело в том, что когда в качестве индекса указывается отрицательное число, то минус исчезает, но отсчет начинается с конца.
Следственно, при работе с find стоит дополнительно использовать условия (о них читайте в предыдущих статьях).
Пройдите обучение “Программирование на Python”, нажимите на ссылку Топ Академии, чтобы записаться.
Учебная программа “Программирование на Python” создана для тех, кто хочет с нуля освоить 3й по популярности язык в мире, и создавать на нем от простых приложений до высоконагруженных web-сервисов.
В основе программы лежат реальные требования IT-рынка. Методисты и преподаватели постоянно работают над ее улучшением и обновлением, чтобы выпускники Академии Top могли достойно показать себя перед работодателем.
- Введение в веб-технологий. Структура HTML. Форматирование текста с помощью HTML
- Форматирование с помощью CSS. Списки. Отступы и поля
- Графика в веб-дизайне. Оптимизация графики. Гиперссылки. Принципы навигации сайта
- Таблицы. Формы. Фреймы
- И многое другое
Синтаксис
Find не является самостоятельной функцией, а только методом для объекта типа string.
То есть для начала необходимо создать переменную строкового типа, а после обратиться через него к нужной функции.
Сам синтаксис функции выглядит следующим образом:
s.find(str, start, end)
Вместо «string» необходимо указать строку, в которой происходит поиск, вместо char подставляем букву или подстроку, которые нужно найти. Последние два аргумента необходимы для установки начального и конечного значения, но об этом немного позже. Разберемся на конкретном примере.
Поиск символа или подстроки в строке
У нас есть последовательность букв английского алфавита, но только в этой последовательности не все буквы, а потому вручную указать индекс не получится. Необходимо по введенной букве, определить ее индекс и вывести все буквы после этого индекса. И так, как будет выглядеть решение:
alphabet = "abcdfghjmnopqrsuvwxz" # алфавит с пробелами
symbol_for_find = input("Введите начальный символ:")
index_of_symbol = alphabet.find(symbol_for_find) # поиск индекса символа
if (index_of_symbol >= 0): # если метод find нашел символ, а потому не вернул отрицательное число
print(alphabet[index_of_symbol:]) # вывод строки от введенного индекса и до конца
else:
print("Простите, но в нашем псевдоалфавите нет введенной буквы")
Готово. Если бы не find, тогда разработчику пришлось бы создавать цикл while с счетчиком, сверять каждый элемент с введенным пользователем, а после, если символ был найден, выводить его индекс, который находился в счетчике. Не совсем удобно, потому рекомендуем пользоваться только готовой функцией.
А если вспомнить, что с помощью циклов будет проблематично проверить подстроку, то это еще сильнее повышает любовь к встроенным функциям типа этой.
Читайте здесь про методы split и str.rsplit в языке Python.
Кстати, давайте попробуем искать не по символу, а по подстроке. Сразу пример из жизни: вспомните школьные года, когда на некоторых предметах было деление по группам. Представим, что необходимо вывести две части строки.
Первая часть – это первая группа, а вторая – вторая группа. Разделять их будет введённое имя.
Реализация (не забывайте, регистр важен):
students = "Karl, Misha, Olga, Steve, Oliver, Harry, Jone, Damir, Eliot, Mister" split_student = input("Введите имя студента, на котором начинается вторая группа:")
split_index = students.find(split_student) # получаем разделительный индекс (индекс соответствует первому введенному символу)
if(split_index >= 0): # проверяем его существование
print("Первая группа:", students[:split_index - 2]) # выводим первую группу. -2 нужен для того, чтобы убрать лишние запятые в конце
print("Вторая группа:", students[split_index:]) # выводим вторую группу
else: print("Студент не найден")
и снова результат на картинке ниже.
Невероятно крутой инструмент, и при этом простой в исполнении.
Читайте здесь If-elif-else в Python
Поиск символа в подстроке со start и end
Периодически возникает необходимость искать только в отдельном отрезке строки. Например, если на вход поступает строка формата: «Запись № 0001 *текст*», то искать нужно только после цифр, так как они не несут никакой ценности.
Или допустим есть строка: «*имена* — студенты, пришедшие на пересдачу». Зачем обрабатывать эту константную фразу, ведь важны только имена. Так вот, чтобы ограничить отрезок, где будет проверяться элемент, используются необязательные аргументы start и end. Соответственно, start отвечает за начало отрезка строки, а end за конец.
По умолчанию start = 0, а end = -1. Название аргумента указывать необязательно.
То есть, в функции в первую очередь указывается символ для поиска, после начальный элемент, и только после этого конечный элемент.
Рассмотрим пример, когда нужно искать только с определенного элемента:
tasklist = "Задачи на сегодня: Купить продукты, навестить друга, найти работу, отвести машину в ремонт. Успеть бы до 11"
begin_char = tasklist.find(':') # мы знаем, что список начинается с двоеточия
end_char = -15 # убираем 15 последних символов с конца
text = input("Введите задачу, с которой нужно начать отсчет:")
index = tasklist.find(text, begin_char, end_char) # проверка с выбором начала и конца отрезка
if ( index >= 0 ):
print (tasklist[index:end_char]) # вывести с выбранного индекса и до конца списка (но не строки)
else:
print ("пункт не найден")
Как видно на скриншоте, слово «сегодня» есть в переменной, но оно не было найдено, так как не принадлежит промежутку, указанному при вызове метода, а потому в учет не принималось.
Проверка есть ли символ в строке
Самые смекалистые могли заметить, что обращение к найденному индексу – это не единственная особенность метода find. С помощью него разработчик также может проверить наличие подстроки в переменной. Это действительно так.
Достаточно сделать условие: если find вернул отрицательное число, значит нужной подстроки нет, иначе есть. Однако, это нерационально. Для таких случаев в python предусмотрено ключевое слово «in».
Чтобы проверить, есть ли подстрока в строке необходимо использовать следующий синтаксис:
x = word in string
Если word есть в string, то x присвоится True, иначе False. Рассмотрим на реальном примере:
cities = "Moscow, Novosibirsk, Rostov, Magadan, Peterburg, Donetsk"
word = "Novosibirsk"
word1 = "Krasnodar"
x = word in cities
x1 = word1 in cities
print(x)
print(x1)
Как вы уже догадались, первый вывод будет True, а второй False. Так что на будущее: не придумывайте велосипед, если есть готовая замена.
Метод rfind()
Во всех примерах выше мы могли находить первое вхождение символа или подстроки. Однако, что делать, если считывать необходимо с конца. В таком случае необходимо использовать похожую по написанию функцию rfind.
Она начинает парсинг элементов с конца. И, кстати, нумерует она символы также сначала.
Допустим, если есть переменная из 20 символов, а нужный символ окажется на 18 позиции, то функция и вернет 18, а не 2 (ведь 20 – 18 = 2, а проверяет то она с конца).
Это полезно, главное не запутаться.
И как обычно пример:
string = "Эта простая строка, у которой в конце неожиданно буква ф в слове фольклор появилась"
x = string.rfind('ф')
print(x)
Программа выведет число 65, но если бы мы использовали find, то ответ был бы 55. Потому что тогда программа сначала бы увидела отдельную букву «ф», а после только «ф» в слове «фольклор».
Вывод
Сначала кажется, что метод find не несет никакой пользы. В будущем в практике часто придется искать индексы элементов по их значению. Например, чтобы делить строки или анализировать содержимое, ну или очищать мусорный контент. Главное научиться, а применение всегда найдется. Благодарим за прочтение.
tsaplya 0 / 0 / 0 Регистрация: 08.03.2013 Сообщений: 5 |
||||
1 |
||||
04.10.2014, 20:04. Показов 4764. Ответов 4 Метки нет (Все метки)
Кто-нибудь может подсказать что именно возвращает функция appWd.Selection.Find ? Вот код, на котором пытаюсь это сделать, красным выделена неудачная попытка
Красным в итоге не выделилось, в общем была попытка сделать при помощи If wdFind Is Nothing, но не сработало
0 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||||||
04.10.2014, 20:30 |
2 |
|||||||
tsaplya, Возвращает Word.Find, но, на самом деле это не важно, ибо поиск в Word’e осуществляется немного по другому.
Более подробную информацию можно получить в офисной справке, ибо у этого метода куча аргументов, а в справке масса примеров
1 |
tsaplya 0 / 0 / 0 Регистрация: 08.03.2013 Сообщений: 5 |
||||
04.10.2014, 22:44 [ТС] |
3 |
|||
Спасибо большое !
ругается ? Ошибка type mismatch
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
04.10.2014, 23:22 |
4 |
Такая ошибка может возникнуть, если в ячейке [A11] будет наличествовать значение ошибки, типа #Н/Д и т.д., с числами же — такого происходить не должно … однако на всякий случай можно попробовать CStr(Sheet1.Range(«A11»)) P.S. Если в ячейках числа, то не рекомендую устанавливать текстовый формат, иначе, потом возникнут проблемы, например с банальным суммированием, типа =СУММ(A:A)
1 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
04.10.2014, 23:49 |
5 |
P.S. На всякий случай присобачил файлы для тестирования
1 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
04.10.2014, 23:49 |
5 |
It’s probably crashing because the code goes into an infinite loop — because Find keeps executing and, since you don’t replace the found term it keeps finding the same search term over and over again.
Even if that weren’t happening and you did do a Replace, the result wouldn’t be what you expect because the Selection would still be what it was when you started the macro.
First, you need to execute a Replace and secondly, you need to Select the found Range (and in order to go to the end of a line you do need Selection). Lastly, the loop needs only one Find.Execute.
Here’s one way to successfully approach your problem. Note that I use a boolean to pick up whether the search was successful and test that, both for the Do loop as well as for whether the Selection actions should be performed.
Note also the Replace
argument in Find.Execute
— just setting Replacement.Text
isn’t enough.
And look at how I use r.Select
before the Selection actions.
Sub marx()
Dim r As Range
Dim bFound As Boolean
bFound = True
Set r = ActiveDocument.content
r.Find.ClearFormatting
Do While bFound
With r.Find
.Text = "A" & vbTab
.Replacement.Text = "A: "
.Forward = True
.wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
bFound = .Execute(Replace:=wdReplaceOne)
End With
If bFound Then
r.Select
Selection.EndKey Unit:=wdLine
Selection.Delete Unit:=wdCharacter, Count:=1
Selection.TypeText Text:="<br>"
End If
Loop
End Sub
Кстати, при написании этого скрипта меня не раз выручал командлет Get-Member, с помощью которого можно узнать о всех свойствах и методах объекта, передаваемого ему по конвееру:
Далее в переменную $sel заносим ссылку на объект Selection:
$sel = $word.selection
Объект Selection представляет текущий выделенный фрагмент. Выполняя какую-либо операцию Word’е (например меняя шрифт), мы выделяем соответствующий текст и применем к нему новый параметр форматирования. Объект Selection всегда присутствует в документе; если ничего не выделено, этот объект представляет курсор ввода.
Если есть желание (или в тестовых целях) можно показать наш документ, чтобы посмотреть как Powershell лазит по документу, и то ли он ищет:
$word.visible = $true
Для поиска текста воспользуемся объектом Find – членом объекта Selection. Объект Find имеет свои свойства и методы (все их можно посмотреть с помощью Get-Member), нам из них интересны только свойство Text, в котором задаётся искомый, текст и метод Execute(), выполняющий сам поиск:
$sel.Find.Text = $find $sel.Find.Execute()
Зациклив вызов метода Execute() по массиву, содержащему объекты для поиска, можно искать сколько угодно слов и фраз.
foreach ($find in $Find_String) { ... $sel.Find.Text = $find $sel.Find.Execute() ... }
Метод Execute() выполняется до первого вхождения слова (фразы) в документ. Поэтому, если просто нужно только убедиться в наличии текста в документе, можно ограничиться одиночным вызовом Execute():
if ($sel.Find.Execute()) { "$find найден" }
Но так как я из тех, кто любит трудности, было решено перебрать весь текст до конца и посчитать сколько раз в документе встречаются слова, которые были заданы для поиска.
Для этого можно воспользоваться свойством Found объекта Find, которое возвращает True каждый раз, когда обнаруживается искомый элемент, и циклом с постусловием:
do { if ($sel.Find.Execute()) { $count++ # Start-Sleep -Seconds 2 } } while ($sel.Find.Found)
Указанные критерии поиска применяются только к выделенному в данный момент тексту. Однако, если Selection включает лишь курсор ввода, то поиск ведется по всему документу. Когда обнаруживается элемент, удовлетворяющий критериям поиска, он автоматически выделяется подсветкой и становится текущим выделенным фрагментом. Раскомментировав закомментированную (вот такая вот тавтология) задержку в 2 секунды, можно убедиться, что текст находится и находится именно то, что нужно.
Найденный текст можно как-нибудь пометить, например, увеличив ему шрифт и сделав его жирным:
$sel.Font.Bold = $true $sel.Font.Size = 16
При этом нужно будет не забыть сохранить документ перед закрытием:
$doc.Save()
После того, как поиск окончен выводим сколько и чего нашли:
if ($count) { "$find найдено $count раз" }
После окончания первого прохода курсор будет находиться в конце документа, и чтобы повторить поиск нужно его вернуть в начало документа. Вообще для этого у объекта Selection есть специальный объект HomeKey(). Но мне с ним подружиться пока не удалось, поэтому среди свойств объекта Selection я обнаружил метод GoTo(). Поэкспериментировав с его аргументом были замечены интересные вещи, например, вызвав GoTo(), с аргументом 1 (GoTo(1)) происходит переход на следующую страницу, GoTo(3) – переход на следующую строку, ну а GoTo(0)– переход в начало документа. Однако, такой способ наверное не совсем корректен, так как при вызове GoTo(0) на экран выводится куча ненужной информации, поэтому пришлось перенаправить её в NULL:
$sel.GoTo(0) | Out-Null
После этого осталось только закрыть наш Word:
$word.Quit()
Вот и всё.
P. S.
Запустив готовый скрипт, я был немного удивлён, так как ожидал, что слова «power» и «shell» будут в одинаковом количестве, однако
power найдено 34 раз
shell найдено
42 раз
Недоумевая начал внимательно рассматривать свой файл «вручную». Найдя несколько слов об объекте WScript.Shell (о котором тоже как-нибудь поговорим) успокоился 🙂 и решил для верности к объектам поиска добавить ещё и слово «powershell» – по идее их должно было быть столько же, сколько и «power».
На этот раз я был доволен:
power найдено 34 раз
shell найдено
42 раз
powershell найдено
34 раз
Таким не очень хитрым способом можно определять наличие слов в .doc-файлах и/или подсчитывать количество определённых слов.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
1 18.03.2018 13:53:15
- o5andrey
- сержант
- Неактивен
- Откуда: Братск, Иркутская область
- Зарегистрирован: 18.03.2018
- Сообщений: 29
Тема: Как работает .Range.Find.Execute?
Здравствуйте. Интересует следующий вопрос.
Почему
Set p1 = Selection.Paragraphs(2).Range
p1.Find.Text = "110"
p1.Find.Replacement.Text = "!!!"
p1.Find.Execute Replace:=wdReplaceOne
работает, а
Selection.Paragraphs(2).Range.Find.Text = "110"
Selection.Paragraphs(2).Range.Find.Replacement.Text = "!!!"
Selection.Paragraphs(2).Range.Find.Execute Replace:=wdReplaceOne
нет. Спасибо.
2 Ответ от Fck_This 19.03.2018 08:58:27
- Fck_This
- генерал-полковник
- Неактивен
- Откуда: Минск, Беларусь
- Зарегистрирован: 13.07.2016
- Сообщений: 648
- Поблагодарили: 97
Re: Как работает .Range.Find.Execute?
o5andrey пишет:
Здравствуйте. Интересует следующий вопрос.
ПочемуSet p1 = Selection.Paragraphs(2).Range p1.Find.Text = "110" p1.Find.Replacement.Text = "!!!" p1.Find.Execute Replace:=wdReplaceOne
работает, а
Selection.Paragraphs(2).Range.Find.Text = "110" Selection.Paragraphs(2).Range.Find.Replacement.Text = "!!!" Selection.Paragraphs(2).Range.Find.Execute Replace:=wdReplaceOne
нет. Спасибо.
Всё работает
Ваш вид проще сделать так
With Selection.Paragraphs(2).Range.Find
.Text = "110"
.Replacement.Text = "!!!"
.Execute Replace:=wdReplaceOne
End With
А ещё компактнее вот так
Selection.Paragraphs(2).Range.Find.Execute FindText:="110", ReplaceWith:="!!!", Replace:=wdReplaceOne
А вот так будет верняк:
If Selection.Range.Paragraphs.Count >= 2 Then
Selection.Paragraphs(2).Range.Find.Execute FindText:="110", ReplaceWith:="!!!", Replace:=wdReplaceOne
End If
Скорее всего у вас там не было двух предложений или текст был заменён.
Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871
3 Ответ от o5andrey 19.03.2018 09:08:39
- o5andrey
- сержант
- Неактивен
- Откуда: Братск, Иркутская область
- Зарегистрирован: 18.03.2018
- Сообщений: 29
Re: Как работает .Range.Find.Execute?
Скорее всего у вас там не было двух предложений или текст был заменён.
А вот и нет, мой второй случай не работает. Вы проверили, у вас идёт?
4 Ответ от o5andrey 19.03.2018 09:47:35
- o5andrey
- сержант
- Неактивен
- Откуда: Братск, Иркутская область
- Зарегистрирован: 18.03.2018
- Сообщений: 29
Re: Как работает .Range.Find.Execute?
Вечером проверю ещё раз.
5 Ответ от Fck_This 19.03.2018 09:48:53
- Fck_This
- генерал-полковник
- Неактивен
- Откуда: Минск, Беларусь
- Зарегистрирован: 13.07.2016
- Сообщений: 648
- Поблагодарили: 97
Re: Как работает .Range.Find.Execute?
o5andrey пишет:
Вечером проверю ещё раз.
Да, проверил
Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871
6 Ответ от o5andrey 19.03.2018 15:14:52
- o5andrey
- сержант
- Неактивен
- Откуда: Братск, Иркутская область
- Зарегистрирован: 18.03.2018
- Сообщений: 29
Re: Как работает .Range.Find.Execute?
Я проверил на другом ПК
Sub Test2()
Selection.Paragraphs(2).Range.Find.Text = "110"
Selection.Paragraphs(2).Range.Find.Replacement.Text = "!!!"
Selection.Paragraphs(2).Range.Find.Execute Replace:=wdReplaceOne
End Sub
Sub Test3()
Set a = Selection.Paragraphs(2).Range
a.Find.Text = "110"
a.Find.Replacement.Text = "!!!"
a.Find.Execute Replace:=wdReplaceOne
End Sub
Test2 не работает.
Post’s attachments
110.docm 15.4 Кб, файл не был скачан.
You don’t have the permssions to download the attachments of this post.
7 Ответ от o5andrey 20.03.2018 09:13:05
- o5andrey
- сержант
- Неактивен
- Откуда: Братск, Иркутская область
- Зарегистрирован: 18.03.2018
- Сообщений: 29
Re: Как работает .Range.Find.Execute?
С «With — End With» тоже работает, а вот без всяких свёрток не работает. В общем, я объяснил это себе как глюк объекта и метода Find.Execute; как глюк Word.
8 Ответ от Вождь 20.03.2018 09:23:34
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
- За сообщение: 1
Re: Как работает .Range.Find.Execute?
Блин, ребята, вы синтаксис VBA то сначала выучите
Целая дискуссия из-за элментарной ошибки!
Каждый раз, когда вы пишите:
Selection.Paragraphs(2).Range
Создается новая переменная, по типу With.
Которая убивается, после выполнения команды
Макросы под заказ и готовый пакет — mtdmacro.ru
9 Ответ от Fck_This 20.03.2018 09:33:37
- Fck_This
- генерал-полковник
- Неактивен
- Откуда: Минск, Беларусь
- Зарегистрирован: 13.07.2016
- Сообщений: 648
- Поблагодарили: 97
Re: Как работает .Range.Find.Execute?
Вождь пишет:
Блин, ребята, вы синтаксис VBA то сначала выучите
Целая дискуссия из-за элментарной ошибки!Каждый раз, когда вы пишите:
Selection.Paragraphs(2).Range
Создается новая переменная, по типу With.
Которая убивается, после выполнения команды
Спасибо. На счёт повторного использования Selection.paragraph(2).Range не видел или не обратил внимания на подобное. Разумеется, следует пользоваться оригинальными конструкциями.
Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871
10 Ответ от o5andrey 20.03.2018 16:17:41
- o5andrey
- сержант
- Неактивен
- Откуда: Братск, Иркутская область
- Зарегистрирован: 18.03.2018
- Сообщений: 29
Re: Как работает .Range.Find.Execute?
Рад что вам всё ясно. Но будьте любезны, поясните мне.
Создается новая переменная, по типу With.
Это как?
11 Ответ от Вождь 21.03.2018 09:26:14
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
Re: Как работает .Range.Find.Execute?
Поясню, так как это вопрос почему-то оказался не очевидным форумчанам
Определение Range то читали? Range – представляет какую-то непрерывную область документа. То бишь, главное запомнить, что Range всегда относится к документу. Не к Selection, Paragraph или чему другому, а именно к документу. Так же, Range – это объект (читаем что это такое и как с ними работать).
Здесь свойство Range вернуло вам область документа, соответствующую второму выбранному абзацу:
Selection.Paragraphs(2).Range
Не ссылку на объект, а именно объект. Если бы вы запомнили этот объект Range, то работали бы с ним и дальше. Например:
Set R = Selection.Paragraphs(2).Range
Вы не сделали этого, и объект был удален сразу, после выполнения строки кода:
Selection.Paragraphs(2).Range.Find.Text = "110"
Следующий вызов вернул еще один новый объект Range. И так далее.
Если ничего не поняли, значит изучение даже основ VBA вы посчитали лишним, а сразу решили попробовать Почитайте какую книжку с примерами, можно и справку глянуть. Главное — читать с начала и подряд. Изучая основы (чего бы то ни было) бессистемным образом (на форумах) люди гробят свое и чужое время. Как говорится: У семи нянек дитя без глазу
Макросы под заказ и готовый пакет — mtdmacro.ru
12 Ответ от Fck_This 21.03.2018 09:50:59
- Fck_This
- генерал-полковник
- Неактивен
- Откуда: Минск, Беларусь
- Зарегистрирован: 13.07.2016
- Сообщений: 648
- Поблагодарили: 97
Re: Как работает .Range.Find.Execute?
Вождь пишет:
Если ничего не поняли, значит изучение даже основ VBA вы посчитали лишним, а сразу решили попробовать Почитайте какую книжку с примерами, можно и справку глянуть. Главное — читать с начала и подряд. Изучая основы (чего бы то ни было) бессистемным образом (на форумах) люди гробят свое и чужое время. Как говорится: У семи нянек дитя без глазу
Фе, какой вы сноб. Читать сначала и подряд — ужасно скучно. Считаю, что для VBA достаточно читать справку при составлении кода, но читать стоит внимательно.
Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871
13 Ответ от Вождь 21.03.2018 10:22:25
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
Re: Как работает .Range.Find.Execute?
Fck_This пишет:
…вы сноб…
Да, зануда еще тот Программеров других не бывает, все строго по алгоритму
Макросы под заказ и готовый пакет — mtdmacro.ru
14 Ответ от o5andrey 01.04.2018 09:33:42
- o5andrey
- сержант
- Неактивен
- Откуда: Братск, Иркутская область
- Зарегистрирован: 18.03.2018
- Сообщений: 29
Re: Как работает .Range.Find.Execute?
Здравствуйте. Подскажите пожалуйста как расширить диапазон на одно слово.
Set r1 = Selection.Paragraphs(1).Range
r1.Find.Text = ChrW(34)
r1.Find.Execute
If r1.Find.Found = True Then
r1.Expand Unit:=wdWord
MsgBox (r1)
End If
В окошке только одна кавычка.
15 Ответ от Вождь 01.04.2018 09:51:53
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
Re: Как работает .Range.Find.Execute?
o5andrey пишет:
…расширить диапазон на одно слово…
Например так:
R1.Find.Text = ChrW(34)
R1.Find.Execute
If R1.Find.Found = True Then
R1.Expand Unit:=wdWord
R1.MoveStart wdWord, wdBackward
R1.MoveEnd wdWord, wdForward
MsgBox (R1)
End If
Макросы под заказ и готовый пакет — mtdmacro.ru
16 Ответ от o5andrey 01.04.2018 11:46:56
- o5andrey
- сержант
- Неактивен
- Откуда: Братск, Иркутская область
- Зарегистрирован: 18.03.2018
- Сообщений: 29
Re: Как работает .Range.Find.Execute?
Не выходит. Так берётся весь текст: от кавычки до начала и до конца. Мне нужно чтобы в окошке появилось слово, которое в кавычках.
17 Ответ от o5andrey 01.04.2018 11:51:50
- o5andrey
- сержант
- Неактивен
- Откуда: Братск, Иркутская область
- Зарегистрирован: 18.03.2018
- Сообщений: 29
Re: Как работает .Range.Find.Execute?
В справке есть примеры:
Set myRange = ActiveDocument.Words(1)
myRange.Expand Unit:=wdParagraph
Set Range1 = ActiveDocument.Paragraphs(1).Range
With Range1
.Collapse Direction:=wdCollapseStart
.Move Unit:=wdParagraph, Count:=3
.Select
End With
Но почему-то у меня приведённое аналогичное не проходит…
18 Ответ от o5andrey 01.04.2018 12:20:55
- o5andrey
- сержант
- Неактивен
- Откуда: Братск, Иркутская область
- Зарегистрирован: 18.03.2018
- Сообщений: 29
Re: Как работает .Range.Find.Execute?
Вот с этой строчкой получилось:
r1.MoveEnd Unit:=wdWord, Count:=1
19 Ответ от o5andrey 01.04.2018 12:53:01
- o5andrey
- сержант
- Неактивен
- Откуда: Братск, Иркутская область
- Зарегистрирован: 18.03.2018
- Сообщений: 29
Re: Как работает .Range.Find.Execute?
With Selection.Paragraphs(1).Range
.Find.Text = ChrW(34)
.Find.Execute
If .Find.Found = True Then
.MoveEnd Unit:=wdWord, Count:=1
MsgBox (.Text)
End If
End With
20 Ответ от o5andrey 01.04.2018 16:56:47
- o5andrey
- сержант
- Неактивен
- Откуда: Братск, Иркутская область
- Зарегистрирован: 18.03.2018
- Сообщений: 29
Re: Как работает .Range.Find.Execute?
Как сделать чтобы при этом поиске находилась именно кавычка заданного кода UTF-8? А то не делается различий между кавычками в виде двух верхних чёрточек и
21 Ответ от o5andrey 01.04.2018 16:58:01
- o5andrey
- сержант
- Неактивен
- Откуда: Братск, Иркутская область
- Зарегистрирован: 18.03.2018
- Сообщений: 29
Re: Как работает .Range.Find.Execute?
Как сделать чтобы при этом поиске находилась именно кавычка заданного кода UTF-8? А то не делается различий между кавычками в виде двух верхних чёрточек и «кавычками-ёлочками»: находятся и те и другие (этот поиск работает этим по двум видам кавычек).
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться