Если find true word

На чтение 10 мин Просмотров 11.8к.
Обновлено 07.03.2023

В статье подробно разбираем метод find() в Python: описание, синтаксис, применение.

Содержание

  1. Описание метода find()
  2. Синтаксис
  3. Поиск символа или подстроки в строке
  4. Поиск символа в подстроке со start и end
  5. Проверка есть ли символ в строке
  6. Метод rfind()
  7. Вывод

Описание метода find()

Функция find() в языке python (питон) используется для поиска первого вхождения символа или подстроки во всей строке, либо только в ее отрезке.

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

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

1. Метод find работает только со строками, для списков и словарей используются совсем другие методы.

Если же нужная подстрока или буква не были найдены внутри строки, то возвращается значение -1.

Кстати, если вы уже думаете сделать конструкцию, в которой с помощью функции find определяется индекс, а после сразу происходит вывод по этому индексу, то это плохая идея. Если буква не будет найдена, то будет возвращено значение -1 (как мы уже говорили).

Если обратиться к минус первому элементу, то питон вернет самый последний элемент (например, в слово «сайт» элемент с индексом -1 – это «т»). Дело в том, что когда в качестве индекса указывается отрицательное число, то минус исчезает, но отсчет начинается с конца.

Следственно, при работе с find стоит дополнительно использовать условия (о них читайте в предыдущих статьях).

Find – это своего рода человек с лупой, который выискивает нужную вещь по дорожке (строке)

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 ?
И как запрограммировать какое-либо действие в случае, если соответствие не найдено ?

Вот код, на котором пытаюсь это сделать, красным выделена неудачная попытка

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 Set sheet1 = Sheets("TABLES")
    Set wdFind = appWd.Selection.Find
    ClipT = "  "
    ClipEmpty.SetText ClipT
 
    
    prov = 0
    sheet1.Range("B1").Copy
    wdFind.Text = sheet1.Range("A1")
    Call NoFormatPaste
    sheet1.Range("B2").Copy
    wdFind.Text = sheet1.Range("A2")
    [COLOR="red"]If wdFind Is Nothing Then[/COLOR]
    prov = 0
    Else
    Call NoFormatPaste
    End If

Красным в итоге не выделилось, в общем была попытка сделать при помощи 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 осуществляется немного по другому.

Visual Basic
1
2
3
4
5
6
If appWd.Selection.Find.Execute( _
   FindText:="Заказ", MatchWholeWord:=False) = True Then
   MsgBox "Слово <Заказ> (возможно частично) найдено"
Else
   MsgBox "Слово <Заказ> не найдено"
End If
Visual Basic
1
2
3
4
5
6
7
8
9
With appWd.Selection.Find
     .MatchWholeWord = False
     .Text = "Заказ"
     If .Execute = True Then
        MsgBox "Слово <Заказ> (возможно частично) найдено"
     Else
        MsgBox "Слово <Заказ> не найдено"
     End If
End With

Более подробную информацию можно получить в офисной справке, ибо у этого метода куча аргументов, а в справке масса примеров



1



tsaplya

0 / 0 / 0

Регистрация: 08.03.2013

Сообщений: 5

04.10.2014, 22:44

 [ТС]

3

Спасибо большое !
А не подскажете еще, почему на строчку

Visual Basic
1
2
If appWd.Selection.Find.Execute( _
    FindText:=sheet1.Range("A11"), MatchWholeWord:=False) = True Then

ругается ? Ошибка type mismatch
Сначала ругался на 8ю клетку, после переделывания всех полей в текстовые — перестал ругаться на 8ю, но начал на 11ю. И там, и там числа в ячейках.



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

  • Как работает .Range.Find.Execute?
  • 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

  • Как работает .Range.Find.Execute?
  • 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

  • Как работает .Range.Find.Execute?
  • Вождь
  • Модератор
  • Неактивен
  • Зарегистрирован: 07.01.2010
  • Сообщений: 745
  • Поблагодарили: 181
  • За сообщение: 1

Re: Как работает .Range.Find.Execute?

Блин, ребята, вы синтаксис VBA то сначала выучите smile
Целая дискуссия из-за элментарной ошибки!

Каждый раз, когда вы пишите:

Selection.Paragraphs(2).Range

Создается новая переменная, по типу With.
Которая убивается, после выполнения команды smile

Макросы под заказ и готовый пакет — mtdmacro.ru

9 Ответ от Fck_This 20.03.2018 09:33:37

  • Как работает .Range.Find.Execute?
  • Fck_This
  • генерал-полковник
  • Неактивен
  • Откуда: Минск, Беларусь
  • Зарегистрирован: 13.07.2016
  • Сообщений: 648
  • Поблагодарили: 97

Re: Как работает .Range.Find.Execute?

Вождь пишет:

Блин, ребята, вы синтаксис VBA то сначала выучите smile
Целая дискуссия из-за элментарной ошибки!

Каждый раз, когда вы пишите:

Selection.Paragraphs(2).Range

Создается новая переменная, по типу With.
Которая убивается, после выполнения команды smile

Спасибо. На счёт повторного использования 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

  • Как работает .Range.Find.Execute?
  • Вождь
  • Модератор
  • Неактивен
  • Зарегистрирован: 07.01.2010
  • Сообщений: 745
  • Поблагодарили: 181

Re: Как работает .Range.Find.Execute?

Поясню, так как это вопрос почему-то оказался не очевидным форумчанам smile

Определение 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 вы посчитали лишним, а сразу решили попробовать smile Почитайте какую книжку с примерами, можно и справку глянуть. Главное — читать с начала и подряд. Изучая основы (чего бы то ни было) бессистемным образом (на форумах) люди гробят свое и чужое время. Как говорится: У семи нянек дитя без глазу smile

Макросы под заказ и готовый пакет — mtdmacro.ru

12 Ответ от Fck_This 21.03.2018 09:50:59

  • Как работает .Range.Find.Execute?
  • Fck_This
  • генерал-полковник
  • Неактивен
  • Откуда: Минск, Беларусь
  • Зарегистрирован: 13.07.2016
  • Сообщений: 648
  • Поблагодарили: 97

Re: Как работает .Range.Find.Execute?

Вождь пишет:

Если ничего не поняли, значит изучение даже основ VBA вы посчитали лишним, а сразу решили попробовать smile Почитайте какую книжку с примерами, можно и справку глянуть. Главное — читать с начала и подряд. Изучая основы (чего бы то ни было) бессистемным образом (на форумах) люди гробят свое и чужое время. Как говорится: У семи нянек дитя без глазу smile

Фе, какой вы сноб. Читать сначала и подряд — ужасно скучно. Считаю, что для VBA достаточно читать справку при составлении кода, но читать стоит внимательно.

Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871

13 Ответ от Вождь 21.03.2018 10:22:25

  • Как работает .Range.Find.Execute?
  • Вождь
  • Модератор
  • Неактивен
  • Зарегистрирован: 07.01.2010
  • Сообщений: 745
  • Поблагодарили: 181

Re: Как работает .Range.Find.Execute?

Fck_This пишет:

…вы сноб…

Да, зануда еще тот smile Программеров других не бывает, все строго по алгоритму smile

Макросы под заказ и готовый пакет — 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

  • Как работает .Range.Find.Execute?
  • Вождь
  • Модератор
  • Неактивен
  • Зарегистрирован: 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

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Like this post? Please share to your friends:
  • Если excel условие любое
  • Если excel сравнение символов
  • Если excel примеры время
  • Если excel при сохранении файла ошибка
  • Если excel пишет недостаточно ресурсов