С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/65: Рейтинг темы: голосов - 65, средняя оценка - 4.58
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381

Найти слово в документе MS Word и выделить его

30.08.2013, 17:11. Показов 13370. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем хай =) возникла такая проблема , нужно программно выделить слово в office word , чтоб вы делить все достаточно просто с иметировать нажатие клавиш ctrl+A но вот как выделить опред слово ? может кто встречался и знает ....
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.08.2013, 17:11
Ответы с готовыми решениями:

Microsoft Word найти слово в документе и заменить его
Добрый день! Помогите с решением: Microsoft Word найти слово в документе и заменить его. К примеру в документе есть N кол-во страниц с...

Найти слово в документе MS Word
Ребята помогите, надо написать прогу которая ищет слово в word и надо знать на каких страницах это слово есть. Спасибо заранее

Как найти слово в документе Word
Народ Подскажите плиз как можно в документе Word отыскать слово и скажем заменить его другим или отыскать пару слов и вставить между ними...

28
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
31.08.2013, 04:35
vuasya, может такой вариант подойдёт: Происк текста в файле документа MS Word. ? Программа открывает файл в MS Word, ищет заданную подстроку и если она найдена, то выделяет её и прокручивает документ таким образом, чтобы найденная подстрока попала в область видимости.
2
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
31.08.2013, 21:14  [ТС]
Mawrat, т.е например у меня открыть office world и там мне нужно выделить определенное слово но программно , я использую пример что ты мне дал и настраиваю его под себя , и нажимаю на кнопку и текст в окне office world выделиться так ?
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
31.08.2013, 22:39
Да, верно - текст выделится. И кроме этого, документ будет прокручен таким образом, что выделенный текст окажется в области видимости.
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
31.08.2013, 23:35  [ТС]
Mawrat, спасибо вам , все работает прекрасно ! но вот не поможете ли вы еще мне в кое чем , мне нужно чтоб программа работала уже в готовом открытом приложении , а не создавала сама

просто присвоить значение переменной Od.FileName к пути запуску определенного файла ничего не даст . как быть ?
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
01.09.2013, 05:11
Цитата Сообщение от vuasya Посмотреть сообщение
мне нужно чтоб программа работала уже в готовом открытом приложении , а не создавала сама
Тогда понадобится не запускать новый экземпляр MS Word, а подключиться к уже запущенному экземпляру. В этом случае надо заменить вызов CreateOleObject() на GetActiveOleObject().
Полностью код будет выглядеть так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
uses
  ComObj;
 
{Пояснение по поиску.
Объект wdFind связан с диапазоном wdRng. При каждом вызове wdFind.Execute
поиск продолжается в том диапазоне, который определял wdRng до первого
вызова wdFind.Execute. Т. е., поиск выполняется в одном и том же диапазоне.
Но сам объект wdRng изменяется при каждом обнаружении искомого текста - он
становится равным диапазону, который охватывает этот найденный текст.}
 
{Функция ищет заданный текст aSearchText в документе MS Word aWdDoc и возвращает
ссылку на диапазон, который охватывает найденный текст.}
function FindInDoc(const aWdDoc : Variant; const aSearchText : String) : Variant;
const
  wdFindStop = 0; //Завершить поиск при достижении границы диапазона.
var
  wdRng, wdFind : Variant;
begin
  VarClear(Result);
  //Диапазон, охватывающий всё содержимое документа.
  wdRng := aWdDoc.Content;
 
  //Настройка поиска.
  wdFind := wdRng.Find;
  //wdFind.ClearFormatting;
  wdFind.Text := aSearchText;
  //True - поиск вести от начала - к концу диапазона.
  wdFind.Forward := True;
  //wdFindStop - завершить поиск при достижении границы диапазона.
  //wdFind.Wrap := wdFindStop;
 
  //Поиск текста.
  if wdFind.Execute then Result := wdRng;
end;
 
//Поиск заданного текста в документе MS Word.
procedure TForm1.Button1Click(Sender: TObject);
var
  wdApp, wdDocs, wdDoc, wdRng : Variant;
  SearchText : string;
begin
  //Искомый текст.
  SearchText := Edit1.Text;
  if SearchText = '' then begin
    MessageBox(0, 'Искомый текст не задан. Действие отменено.'
      ,'Искомый текст не задан', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
  
  //Запуск MS Word и подключение к его корневому объекту.
  try
    wdApp := GetActiveOleObject('Word.Application');
  except
    MessageBox(0, 'Нет запущенных экземпляров MS Word. Действие отменено.',
      'Отмена', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  //Подключаемся к коллекции документов.
  wdDocs := wdApp.Documents;
  //Проверяем - есть ли хотя бы один открытый документ.
  if wdDocs.Count = 0 then begin
    MessageBox(0, 'Нет ни одного открытого документа. Действие отменено.'
      ,'Отмена', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
  //Делаем видимым окно MS Word.
  wdApp.Visible := True;
  //Подключаемся к первому документу в коллекции.
  wdDoc := wdDocs.Item(1);
  //Поиск заданного текста.
  wdRng := FindInDoc(wdDoc, SearchText);
  if VarIsClear(wdRng) then begin
    ShowMessage('Текст НЕ найден.');
    Exit;
  end;
 
  ShowMessage('Текст найден.');
 
  //Выделяем найденный текст.
  wdRng.Select;
  //Прокручиваем содержимое документа (в первом окне) таким образом, чтобы стал
  //видимым участок с найденным текстом.
  wdDoc.Windows.Item(1).ScrollIntoView(wdRng);
 
  //Можно выполнить какие-нибудь действия с найденным текстом.
  //Например, пометим найденный текст жирным красным шрифтом.
  //wdRng.Font.Bold := True;
  //wdRng.Font.Color := RGB(255, 100, 100);
end;
 
end.
Здесь происходит попытка подключения к уже запущенному экземпляру MS Word. Затем, выполняется подключение к первому из уже открытых документов. Если все эти шаги успешны, то выполняется поиск текста.

Ещё можно сделать так. Подключаемся к запущенному экземпляру MS Word. Потом, среди открытых документов ищем тот, чьё имя файла совпадает с заданным и выполняем поиск в этом документе. Имя файла пускай будет выбираться через OpenDialog.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
implementation
 
{$R *.dfm}
 
uses
  ComObj;
 
{Пояснение по поиску.
Объект wdFind связан с диапазоном wdRng. При каждом вызове wdFind.Execute
поиск продолжается в том диапазоне, который определял wdRng до первого
вызова wdFind.Execute. Т. е., поиск выполняется в одном и том же диапазоне.
Но сам объект wdRng изменяется при каждом обнаружении искомого текста - он
становится равным диапазону, который охватывает этот найденный текст.}
 
{Функция ищет заданный текст aSearchText в документе MS Word aWdDoc и возвращает
ссылку на диапазон, который охватывает найденный текст.}
function FindInDoc(const aWdDoc : Variant; const aSearchText : String) : Variant;
const
  wdFindStop = 0; //Завершить поиск при достижении границы диапазона.
var
  wdRng, wdFind : Variant;
begin
  VarClear(Result);
  //Диапазон, охватывающий всё содержимое документа.
  wdRng := aWdDoc.Content;
 
  //Настройка поиска.
  wdFind := wdRng.Find;
  //wdFind.ClearFormatting;
  wdFind.Text := aSearchText;
  //True - поиск вести от начала - к концу диапазона.
  wdFind.Forward := True;
  //wdFindStop - завершить поиск при достижении границы диапазона.
  //wdFind.Wrap := wdFindStop;
 
  //Поиск текста.
  if wdFind.Execute then Result := wdRng;
end;
 
//Поиск заданного текста в документе MS Word.
procedure TForm1.Button1Click(Sender: TObject);
var
  wdApp, wdDocs, wdDoc, wdRng : Variant;
  SearchText : string;
  i : Integer;
  Od : TOpenDialog;
begin
  //Искомый текст.
  SearchText := Edit1.Text;
  if SearchText = '' then begin
    MessageBox(0, 'Искомый текст не задан. Действие отменено.'
      ,'Искомый текст не задан', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
  //Выбор имени файла.
  Od := OpenDialog1; //OpenDialog1 уже должен быть на форме.
  if Od.InitialDir = '' then
    Od.InitialDir := ExtractFilePath( ParamStr(0) );
  if not Od.Execute then Exit;
  if not FileExists(Od.FileName) then begin
    MessageBox(0, 'Файл с заданным именем не найден. Действие отменено.'
      ,'Файл не найден', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
 
  //Попытка подключиться к уже запущенному экземпляру MS Word.
  try
    wdApp := GetActiveOleObject('Word.Application');
  except
    MessageBox(0, 'Нет запущенных экземпляров MS Word. Действие отменено.',
      'Отмена', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  //Подключаемся к коллекции документов.
  wdDocs := wdApp.Documents;
  //Ищем документ по имени файла.
  VarClear(wdDoc);
  for i := 1 to wdDocs.Count do
    if wdDocs.Item(i).FullName = Od.FileName then begin
      wdDoc := wdDocs.Item(i);
      Break;
    end;
  if VarIsClear(wdDoc) then begin
    MessageBox(0, 'Документ не является открытым в настоящее время. Действие отменено.'
      ,'Отмена', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  //Делаем видимым окно MS Word.
  wdApp.Visible := True;
  //Поиск заданного текста.
  wdRng := FindInDoc(wdDoc, SearchText);
  if VarIsClear(wdRng) then begin
    ShowMessage('Текст НЕ найден.');
    Exit;
  end;
 
  ShowMessage('Текст найден.');
 
  //Выделяем найденный текст.
  wdRng.Select;
  //Прокручиваем содержимое документа (в первом окне) таким образом, чтобы стал
  //видимым участок с найденным текстом.
  wdDoc.Windows.Item(1).ScrollIntoView(wdRng);
 
  //Можно выполнить какие-нибудь действия с найденным текстом.
  //Например, пометим найденный текст жирным красным шрифтом.
  //wdRng.Font.Bold := True;
  //wdRng.Font.Color := RGB(255, 100, 100);
end;
 
end.
1
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
01.09.2013, 09:52  [ТС]
Mawrat, огромное просто спасибо ! я никогда не работал с ms world и такого даже не знал , огромное просто вам СПАСИБО !
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
01.09.2013, 11:35
Пожалуйста.

Что касается имени файла. Сейчас в программе проверяется полный путь к файлу. Если есть возможность того, что пользователь может открывать нужный документ из разных папок, то, соответственно, полный путь к файлу может быть разным. Тогда при поиске среди открытых документов можно проверять, например, имя файла без полного пути (свойство Name, вместо FullName):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var
...
  FileName : Strinmg;
...
begin
...
  //Ищем документ по имени файла.
  FileName := ExtractFileName(Od.FileName); //Имя файла без полного пути.
  VarClear(wdDoc);
  for i := 1 to wdDocs.Count do
    if wdDocs.Item(i).Name = FileName then begin
      wdDoc := wdDocs.Item(i);
      Break;
    end;
...
end;
Добавлено через 1 минуту
Только надо иметь в виду, что в MS Word можно открыть одновременно несколько документов с одним и тем же именем файла. В этом случае программа подключится к первому такому документу.
0
1 / 1 / 2
Регистрация: 26.08.2013
Сообщений: 381
01.09.2013, 11:39  [ТС]
Mawrat, спасибо , учту !

а на этот вопрос сможете ответить ? разделение окна ибо как всегда никто такого не делал ...может вы знаете ?
0
0 / 0 / 0
Регистрация: 25.01.2014
Сообщений: 2
20.01.2016, 13:17
Как зделать чтобы искало не только первое вхождения а и все последующие. Заранее благодарен.
0
0 / 0 / 1
Регистрация: 21.01.2021
Сообщений: 224
09.04.2024, 13:23
Привет.
А как быть, если искомый текст встречается в документе несколько раз? Как их все найти и заменить текстом?
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,358
Записей в блоге: 3
09.04.2024, 14:19
Цитата Сообщение от 301sem Посмотреть сообщение
А как быть, если искомый текст встречается в документе несколько раз?
Есть такое слово - "цикл". Организуйте цикл поиска до тех пор, пока искомое слово не перестанет встречаться - после этого цикл заканчивается. А пока цикл не закончен, в теле цикла выполняете необходимые преобразования над найденным словом.
0
0 / 0 / 1
Регистрация: 21.01.2021
Сообщений: 224
09.04.2024, 14:47
Циклы то я знаю. Только какие пределы ему указать: начало и конец документа? Вызываю функцию так:
Delphi
1
2
wdRng := FindInDoc(WordApp.activedocument, '{docMemo}');
    wdRng.text := SL.Text;
0
14 / 11 / 3
Регистрация: 14.08.2022
Сообщений: 157
09.04.2024, 15:19
Цитата Сообщение от vuasya Посмотреть сообщение
нужно программно выделить слово в office word
А вы не ошиблись адресом? Тут форум по Delphi вообще-то.
Вам так трудно VBA освоить?
Даже если хотите замутить расширение для Word, то возьмите Visual Studio.
Там прекрасный шаблон.
Что касается выделения слова... В Word есть команды. Выделить слово на котором стоит курсор.
Или абзац. А если по поиску, то все само выделится.
Вот если бы вы спросили как это сделать в RichEdit... Это уже интересный вопрос. И кстати, далеко не все это умеют.
0
Модератор
4134 / 2348 / 807
Регистрация: 15.11.2015
Сообщений: 9,357
09.04.2024, 15:36
leors, обрати внимание на даты - вопрос был задан 10 лет назад. Вряд ли уже актуально для ТС.
0
14 / 11 / 3
Регистрация: 14.08.2022
Сообщений: 157
09.04.2024, 16:14
Цитата Сообщение от AzAtom Посмотреть сообщение
обрати внимание на даты
Она стояла сегодня в начале списка.
Так что вопрос не ко мне.
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,358
Записей в блоге: 3
09.04.2024, 16:24
Цитата Сообщение от AzAtom Посмотреть сообщение
вопрос был задан 10 лет назад.
Да нет, просто 301sem вытащил из небытия тему 10-летней давности, ему, однако, актуально...
Цитата Сообщение от leors Посмотреть сообщение
А вы не ошиблись адресом? Тут форум по Delphi вообще-то.
Ну, так-то, никто не мешает работать с документами Word из Дельфи-приложений. И если бы ТС-у нужен был бы VB или VS - он, скорее всего, обратился бы в нужный раздел. Но ему надо это сделать именно из Дельфи. Целесообразность этого сейчас не обсуждается: вопрос задан и только Вам решать - отвечать в этой теме или нет.
Цитата Сообщение от 301sem Посмотреть сообщение
Циклы то я знаю. Только какие пределы ему указать
Советую освежить свои знания, в частности про цикл while, а так же посмотреть, как обрабатывается результат функции. Обладая этой информацией Вы легко решите свою задачу.
0
14 / 11 / 3
Регистрация: 14.08.2022
Сообщений: 157
09.04.2024, 23:04
Цитата Сообщение от D1973 Посмотреть сообщение
Ну, так-то, никто не мешает работать с документами Word
Смысла в этом никакого нет.
Намного удобнее написать обычное приложение, которое обработает текстовый документ.
Файл можно сконвертировать в HTML и делать с ним что угодно.
Точно так же элементарно открыть файл docx.
А писать в Delphi что элементарно делает простой макрос пустая трата времени. Дублировать макрос... Зачем?
0
0 / 0 / 1
Регистрация: 21.01.2021
Сообщений: 224
12.04.2024, 16:47
Цитата Сообщение от D1973 Посмотреть сообщение
Обладая этой информацией Вы легко решите свою задачу
что-то все равно не получается легко. И так и сяк пытался, заменяет только первое попавшееся

Добавлено через 8 минут
Delphi
1
2
3
4
repeat
    wdRng := FindInDoc(WordApp.activedocument, '|docMemo|');
    wdRng.text := SL.Text;
   until False;
в шаблоне все встречающиеся |docMemo| заменил, но потом выдает ошибку "Invalid variant operation"

Добавлено через 1 час 4 минуты
погано конечно, но сработало так
Delphi
1
2
3
4
5
6
7
8
try
  while True do
    begin
    wdRng := FindInDoc(WordApp.activedocument, '|docMemo|');
    wdRng.text := SL.Text;
  end;
  except
  end;
Добавлено через 5 минут
а так тоже не работает
Delphi
1
2
3
4
5
6
7
8
9
10
try
  while True do
    begin
    wdRng := FindInDoc(WordApp.activedocument, '|docMemo|');
    wdRng.text := SL.Text;
    wdRng := FindInDoc(WordApp.activedocument, '|vikMemo|');
    wdRng.text := SL_1.Text;
  end;
  except
  end;
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
12.04.2024, 17:22
Зачем же вы делаете бесконечный, неконтролируемый цикл? Очевидно, что цикл должен заканчиваться в случае неудачного поиска, но вы этой проверки не делаете.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.04.2024, 17:22
Помогаю со студенческими работами здесь

Как выделить текст в документе word
Пытаюсь выделить текст в документе word. Выдает ошибку. Подскажите как от нее избавиться? var W:variant; MyRange: variant; ...

Выделить в MS Word 2007 выделить каждое четвёртое слово
Как выделить в MS Word 2007 каждое четвёртое слово? Просто подсвечивать их синим или жёлтым, любым цветом - главное, чтобы они были...

В текстовом документе найти самое длинное слово и удалить его из этого документа
Не используя другие файлы и массивы. Добавлено через 2 минуты Поправка в текстовом файле.

Выделить в документе самое короткое слово.
Помогите пожалуйста, решить простенькую задачку:Выделить в документе самое короткое слово.

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru