Замена слова в Ворде
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.142] |
|
|
Замена слова в Ворде
|
|
|
|
|
Извините, что-то у меня сегодня много вопросов. Более месяца их не возникало...
На Бейсике это так: ![]() ![]() Selection.Find.Execute With Selection.Find .Text = "Текст номера" .Replacement.Text = "1052-426-003" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With With Selection If .Find.Forward = True Then .Collapse Direction:=wdCollapseStart Else .Collapse Direction:=wdCollapseEnd End If .Find.Execute Replace:=wdReplaceOne If .Find.Forward = True Then .Collapse Direction:=wdCollapseEnd Else .Collapse Direction:=wdCollapseStart End If .Find.Execute End With End Sub Пробую перевести на язык Си, ничего не получается. Прошу учесть, что Ворд у меня уже открыт, документ создан, нужно найти только фразу "Текст номера" и заменить ее на "1052-426-003". Читала справку Ворда, там приблизительно так же. Зато в самом Билдере после ![]() ![]() WordApp->Selection На форуме нашла ![]() ![]() OleVariant oldStr=AnsiString("Текст номера"); OleVariant newStr=AnsiString("1052-426-003"); OleVariant tr = AnsiString("true"); WordApp->ActiveDocument->Range(EmptyParam,EmptyParam)->Find->Execute(oldStr, EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam, newStr,tr); но задача не выполняется, работа Ворда прерывается. Подскажите работающий код, пожалуйста! |
|
Сообщ.
#2
,
|
|
|
|
хе
![]() на бейсике это так потому что это родной вордовский "объект". ![]() В си тебе придётся создавать OLE объекты, подключаться к ворду и там уже исполнять VBA макросы. |
|
Сообщ.
#3
,
|
|
|
|
![]() ![]() OleVariant oldStr,newStr; OleVariant EmptyPar=False; OleVariant Yes=True; oldStr=AnsiString("@3"); newStr=AnsiString(MaskEdit1->Text); WApp->ActiveDocument->Range(EmptyParam,EmptyParam)->Find->Execute(oldStr, EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam, newStr,Yes); Добавлено в : Работаем с Word, COM |
|
Сообщ.
#4
,
|
|
|
|
Цитата laifik,7.09.04, 07:42 ![]() ![]() OleVariant tr = AnsiString("true"); Bas, вот в этой фразе я сморозила глупость. Обратила внимание, когда увидела Ваш код. Спасибо большое. Но на этом вопрос не закончился. А если текст "Текст номера" находится в колонтитуле. То как активизировать колонтитул на языке Си и заменить в нем фразу? Опять же, на Бейсике все понятно. |
|
Сообщ.
#5
,
|
|
|
|
В общем, на Бейсике активизация колонтитула и замена строки в макросе выглядит так:
![]() ![]() //Найти в колонтитуле и изменить Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "Dez_nomer" .Replacement.Text = "rr" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub С огромным трудом, но удалось перевести на Си. Получилось вот что: ![]() ![]() //Активизация колонтитула WordApp->ActiveWindow->ActivePane->View->SeekView = wdSeekCurrentPageHeader; WordApp->ActiveDocument->Range(EmptyParam,EmptyParam)->Find->ClearFormatting(); WordApp->ActiveDocument->Range(EmptyParam,EmptyParam)->Find->Replacement->ClearFormatting(); //Замена слова OleVariant oldStr,newStr; OleVariant EmptyPar=False; OleVariant Yes=True; oldStr=AnsiString("Dez_nomer"); newStr=AnsiString("xxx"); WordApp->ActiveDocument->Range(EmptyParam,EmptyParam)->Find->Execute(oldStr, EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam, newStr,Yes); Вроде все правильно, но происходит активизация колонтитула, а замена слова почему-то нет. Если повнимательнее присмотреться к первому коду, посоветуйте, чего мне не хватает во втором? |
|
Сообщ.
#6
,
|
|
|
|
А почему нельзя сделать Dll на Бейсике и уже его использовать в C ?
Или я чего то непонимаю или так гораздо проще, если код на Бейсике уже есть. |
|
Сообщ.
#7
,
|
|
|
|
Попробуйте примерно так
![]() ![]() WDoc->Sections->Item(1)->get_Range()->Find->Execute(... || WDoc->Sections->Item(1)->Headers->Item(wdHeaderFooterFirstPage)->Range->Find || WDoc->Sections->Item(wdHeaderFooterType)->Headers->Item (wdHeaderFooterFirstPage)->Range->Find |
|
Сообщ.
#8
,
|
|
|
|
Цитата SmK,7.09.04, 16:21 А почему нельзя сделать Dll на Бейсике и уже его использовать в C ? Или я чего то непонимаю или так гораздо проще, если код на Бейсике уже есть. Это уже высший пилотаж. Я не умею это делать. Зато Ворд из Билдера загружаю со многими возможностями. И мне даже интересно довести это до конца. Далее я еще хочу осуществить формирование оглавления на основе заголовков со стилями. А что касается использования VBA, то можно прикрепить макрос, но хочется обойтись без него. |
|
Сообщ.
#9
,
|
|
|
|
Запарилась я с этой проблемой.
Уже полностью воссоздала код макроса![]() ![]() If ActiveWindow.View.SplitSpecial <> wdPaneNone Then ActiveWindow.Panes(2).Close End If If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. _ ActivePane.View.Type = wdOutlineView Then ActiveWindow.ActivePane.View.Type = wdPrintView End If ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "Dez-nomer" .Replacement.Text = "yyy" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub ![]() ![]() //Активизация колонтитула if(WordApp->ActiveWindow->View->SplitSpecial != wdPaneNone) { WordApp->ActiveWindow->Panes->Item(2)->Close(); } if ((WordApp->ActiveWindow->ActivePane->View->Type == wdNormalView) && (WordApp->ActiveWindow->ActivePane->View->Type == wdOutlineView)) { WordApp->ActiveWindow->ActivePane->View->Type == wdPrintView; } WordApp->ActiveWindow->ActivePane->View->SeekView = wdSeekCurrentPageHeader; WordApp->ActiveWindow->ActivePane->View->NextHeaderFooter(); if (WordApp->Selection->HeaderFooter->IsHeader == true) { WordApp->ActiveWindow->ActivePane->View->SeekView = wdSeekCurrentPageFooter; } else { WordApp->ActiveWindow->ActivePane->View->SeekView = wdSeekCurrentPageHeader; } WordApp->Selection->Find->ClearFormatting(); WordApp->Selection->Find->Replacement->ClearFormatting(); //Поиск и замена OleVariant oldStr,newStr; OleVariant EmptyPar=False; OleVariant Yes=True; oldStr=AnsiString("Dez-nomer"); newStr=AnsiString("xxx"); OleVariant Replace = wdReplaceAll; WordApp->ActiveDocument->Range(EmptyParam,EmptyParam)->Find->Execute(oldStr, EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam, newStr,Yes); Самое интересное, что ни этот код, ни макрос в колонтитуле не работают. Я использую вордовский шаблон, где в колонтитул вставлена таблица. В одной из ее ячеек стоит "Dez-nomer", который нужно поменять. При активизации колонтитула данные в ячейках странно себя ведут: то они активны, то они приглушены (на языке С++ это Enabled = false). Но в том, и другом случае поиск и замена отсутствуют. Несколько раз макрос отрабатывался, но по большей части он игнорирует фразу по запросу поиска. Я бы не суетилась, если бы макрос постоянно не работал, но почему через раз... Тогда мне не понятно, как добраться до данных в таблице, которая находится в колонтитуле. И еще важный момент: когда я открываю колонтитул на двойной щелчок (без участия макроса), а затем запускаю макрос на поиск фразы и ее замену, то макрос работает. Дело, наверное, в самом шаблоне, но его делали несколько лет назад. Ворд я знаю неплохо, но не могу разобраться, в чем причина. И стили проверила, и все свойства. Может кто-нибудь знает ответ на мой вопрос? И еще: если эти два куска (активизация колонтитула и поиск фразы) исполнять по отдельности, то они работают как надо. Только поиск фразы осуществляется по всему документу, не затрагивая колонтитул. |