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

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

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

Author24 — интернет-сервис помощи студентам
Всем хай =) возникла такая проблема , нужно программно выделить слово в office word , чтоб вы делить все достаточно просто с иметировать нажатие клавиш ctrl+A но вот как выделить опред слово ? может кто встречался и знает ....
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.08.2013, 17:11
Ответы с готовыми решениями:

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

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

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

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

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

просто присвоить значение переменной Od.FileName к пути запуску определенного файла ничего не даст . как быть ?
0
13106 / 5887 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
01.09.2013, 05:11 6
Цитата Сообщение от 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  [ТС] 7
Mawrat, огромное просто спасибо ! я никогда не работал с ms world и такого даже не знал , огромное просто вам СПАСИБО !
0
13106 / 5887 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
01.09.2013, 11:35 8
Пожалуйста.

Что касается имени файла. Сейчас в программе проверяется полный путь к файлу. Если есть возможность того, что пользователь может открывать нужный документ из разных папок, то, соответственно, полный путь к файлу может быть разным. Тогда при поиске среди открытых документов можно проверять, например, имя файла без полного пути (свойство 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  [ТС] 9
Mawrat, спасибо , учту !

а на этот вопрос сможете ответить ? разделение окна ибо как всегда никто такого не делал ...может вы знаете ?
0
0 / 0 / 0
Регистрация: 25.01.2014
Сообщений: 2
20.01.2016, 13:17 10
Как зделать чтобы искало не только первое вхождения а и все последующие. Заранее благодарен.
0
0 / 0 / 1
Регистрация: 21.01.2021
Сообщений: 199
09.04.2024, 13:23 11
Привет.
А как быть, если искомый текст встречается в документе несколько раз? Как их все найти и заменить текстом?
0
Модератор
9392 / 6161 / 2403
Регистрация: 21.01.2014
Сообщений: 26,268
Записей в блоге: 3
09.04.2024, 14:19 12
Цитата Сообщение от 301sem Посмотреть сообщение
А как быть, если искомый текст встречается в документе несколько раз?
Есть такое слово - "цикл". Организуйте цикл поиска до тех пор, пока искомое слово не перестанет встречаться - после этого цикл заканчивается. А пока цикл не закончен, в теле цикла выполняете необходимые преобразования над найденным словом.
0
0 / 0 / 1
Регистрация: 21.01.2021
Сообщений: 199
09.04.2024, 14:47 13
Циклы то я знаю. Только какие пределы ему указать: начало и конец документа? Вызываю функцию так:
Delphi
1
2
wdRng := FindInDoc(WordApp.activedocument, '{docMemo}');
    wdRng.text := SL.Text;
0
Заблокирован
09.04.2024, 15:19 14
Цитата Сообщение от vuasya Посмотреть сообщение
нужно программно выделить слово в office word
А вы не ошиблись адресом? Тут форум по Delphi вообще-то.
Вам так трудно VBA освоить?
Даже если хотите замутить расширение для Word, то возьмите Visual Studio.
Там прекрасный шаблон.
Что касается выделения слова... В Word есть команды. Выделить слово на котором стоит курсор.
Или абзац. А если по поиску, то все само выделится.
Вот если бы вы спросили как это сделать в RichEdit... Это уже интересный вопрос. И кстати, далеко не все это умеют.
0
Модератор
3714 / 2221 / 774
Регистрация: 15.11.2015
Сообщений: 8,854
09.04.2024, 15:36 15
leors, обрати внимание на даты - вопрос был задан 10 лет назад. Вряд ли уже актуально для ТС.
0
Заблокирован
09.04.2024, 16:14 16
Цитата Сообщение от AzAtom Посмотреть сообщение
обрати внимание на даты
Она стояла сегодня в начале списка.
Так что вопрос не ко мне.
0
Модератор
9392 / 6161 / 2403
Регистрация: 21.01.2014
Сообщений: 26,268
Записей в блоге: 3
09.04.2024, 16:24 17
Цитата Сообщение от AzAtom Посмотреть сообщение
вопрос был задан 10 лет назад.
Да нет, просто 301sem вытащил из небытия тему 10-летней давности, ему, однако, актуально...
Цитата Сообщение от leors Посмотреть сообщение
А вы не ошиблись адресом? Тут форум по Delphi вообще-то.
Ну, так-то, никто не мешает работать с документами Word из Дельфи-приложений. И если бы ТС-у нужен был бы VB или VS - он, скорее всего, обратился бы в нужный раздел. Но ему надо это сделать именно из Дельфи. Целесообразность этого сейчас не обсуждается: вопрос задан и только Вам решать - отвечать в этой теме или нет.
Цитата Сообщение от 301sem Посмотреть сообщение
Циклы то я знаю. Только какие пределы ему указать
Советую освежить свои знания, в частности про цикл while, а так же посмотреть, как обрабатывается результат функции. Обладая этой информацией Вы легко решите свою задачу.
0
Заблокирован
09.04.2024, 23:04 18
Цитата Сообщение от D1973 Посмотреть сообщение
Ну, так-то, никто не мешает работать с документами Word
Смысла в этом никакого нет.
Намного удобнее написать обычное приложение, которое обработает текстовый документ.
Файл можно сконвертировать в HTML и делать с ним что угодно.
Точно так же элементарно открыть файл docx.
А писать в Delphi что элементарно делает простой макрос пустая трата времени. Дублировать макрос... Зачем?
0
0 / 0 / 1
Регистрация: 21.01.2021
Сообщений: 199
12.04.2024, 16:47 19
Цитата Сообщение от 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
3756 / 2261 / 703
Регистрация: 29.05.2013
Сообщений: 9,593
12.04.2024, 17:22 20
Зачем же вы делаете бесконечный, неконтролируемый цикл? Очевидно, что цикл должен заканчиваться в случае неудачного поиска, но вы этой проверки не делаете.
0
12.04.2024, 17:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2024, 17:22
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru