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

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

30.08.2013, 17:11. Показов 12810. Ответов 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
13113 / 5894 / 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
13113 / 5894 / 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
13113 / 5894 / 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
13113 / 5894 / 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
9846 / 6387 / 2451
Регистрация: 21.01.2014
Сообщений: 27,156
Записей в блоге: 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
13 / 10 / 3
Регистрация: 14.08.2022
Сообщений: 151
09.04.2024, 15:19
Цитата Сообщение от vuasya Посмотреть сообщение
нужно программно выделить слово в office word
А вы не ошиблись адресом? Тут форум по Delphi вообще-то.
Вам так трудно VBA освоить?
Даже если хотите замутить расширение для Word, то возьмите Visual Studio.
Там прекрасный шаблон.
Что касается выделения слова... В Word есть команды. Выделить слово на котором стоит курсор.
Или абзац. А если по поиску, то все само выделится.
Вот если бы вы спросили как это сделать в RichEdit... Это уже интересный вопрос. И кстати, далеко не все это умеют.
0
Модератор
4087 / 2321 / 805
Регистрация: 15.11.2015
Сообщений: 9,216
09.04.2024, 15:36
leors, обрати внимание на даты - вопрос был задан 10 лет назад. Вряд ли уже актуально для ТС.
0
13 / 10 / 3
Регистрация: 14.08.2022
Сообщений: 151
09.04.2024, 16:14
Цитата Сообщение от AzAtom Посмотреть сообщение
обрати внимание на даты
Она стояла сегодня в начале списка.
Так что вопрос не ко мне.
0
Модератор
 Аватар для D1973
9846 / 6387 / 2451
Регистрация: 21.01.2014
Сообщений: 27,156
Записей в блоге: 3
09.04.2024, 16:24
Цитата Сообщение от AzAtom Посмотреть сообщение
вопрос был задан 10 лет назад.
Да нет, просто 301sem вытащил из небытия тему 10-летней давности, ему, однако, актуально...
Цитата Сообщение от leors Посмотреть сообщение
А вы не ошиблись адресом? Тут форум по Delphi вообще-то.
Ну, так-то, никто не мешает работать с документами Word из Дельфи-приложений. И если бы ТС-у нужен был бы VB или VS - он, скорее всего, обратился бы в нужный раздел. Но ему надо это сделать именно из Дельфи. Целесообразность этого сейчас не обсуждается: вопрос задан и только Вам решать - отвечать в этой теме или нет.
Цитата Сообщение от 301sem Посмотреть сообщение
Циклы то я знаю. Только какие пределы ему указать
Советую освежить свои знания, в частности про цикл while, а так же посмотреть, как обрабатывается результат функции. Обладая этой информацией Вы легко решите свою задачу.
0
13 / 10 / 3
Регистрация: 14.08.2022
Сообщений: 151
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
Ответ Создать тему
Новые блоги и статьи
Полиглотные микросервисы на C# и .NET
ArchitectMsa 30.06.2025
Полиглотная архитектура появилась не из желания усложнить жизнь разработчикам. Она родилась из практической необходимости решать разные задачи наиболее эффективным способом. В одном из проектов. . .
Стратегии кеширования
Javaican 29.06.2025
Кеширование — это хранение часто запрашиваемых данных в быстром хранилище (обычно в памяти), чтобы не обращаться к более медленному первоисточнику. Казалось бы, все просто. Но за этой простотой. . .
Наблюдаемость приложений ASP.NET Core с OpenTelemetry, Prometheus и Grafana
ArchitectMsa 29.06.2025
Наблюдаемость (observability) – это ключевое свойство современной системы, позволяющее понимать её внутреннее состояние на основе внешних данных. Если мониторинг отвечает на вопрос "что случилось?",. . .
Четыре главных модели отношений классов в с++
russiannick 28.06.2025
Продолжаю крестовый поход против c++. ideone. com/ юзаю для проверки валидности кода. Насчитал 4 модели отношений классов: одиночный класс, равноправные классы, слейв - мастер, терминатор. . . .
Вложенные корутины в Unity
GameUnited 28.06.2025
Работа с корутинами в Unity кажется простой до тех пор, пока не начинаешь их вкладывать друг в друга. Я потратил несколько месяцев на изучение этого механизма, и до сих пор иногда ловлю себя на том,. . .
Управление Arduino на C# через последовательный порт
Wired 28.06.2025
Когда я впервые попробовал заставить Arduino общаться с моим C# приложением, казалось, что эти два мира существуют параллельно и никогда не пересекутся. Микроконтроллер упорно моргал встроенным. . .
Основы OpenGL 3.3 и Qt 6.9. Трансформированный треугольник
8Observer8 27.06.2025
Содержание блога На русском https:/ / rutube. ru/ video/ e424497dd6b7ae7e11494027c4b31a54/ https:/ / vkvideo. ru/ video-231040171_456239019 https:/ / www. youtube. com/ watch?v=mfD-ZL7wa_4
Федерация аутентификации на основе JWT-токенов с Keycloak и .NET в гетерогенных инфраструктурах
ArchitectMsa 27.06.2025
Тот самый момент, когда впервые столкнулся с проблемой интеграции десятка разрозненных систем аутентификации в одной корпоративной экосистеме. Кажый сервис жил своей жизнью - тут Basic Auth, там. . .
Гайд по современным СУБД (небесспорный)
Codd 26.06.2025
Когда я только начинал свой путь в IT как рядовой программист, база данных казалась мне чем-то простым и понятным. Ну, серьезно — это же просто место, где лежат данные, верно? Напиши SELECT * FROM. . .
Использование C# с AWS S3: Примеры с AWS SDK для .NET
stackOverflow 26.06.2025
Amazon S3 (Simple Storage Service) уже давно стал стандартом де-факто в мире облачного хранения данных. Особенно приятно, что для разработчиков . NET предусмотрен отличный SDK, который значительно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru