На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Замена слова в Ворде
    Извините, что-то у меня сегодня много вопросов. Более месяца их не возникало...
    На Бейсике это так:
    ExpandedWrap disabled
       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".
    Читала справку Ворда, там приблизительно так же. Зато в самом Билдере после
    ExpandedWrap disabled
      WordApp->Selection
    Find в структуре не числится. Есть только get_Find, но опять же не получается его прикрепить.
    На форуме нашла
    ExpandedWrap disabled
      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);

    но задача не выполняется, работа Ворда прерывается. Подскажите работающий код, пожалуйста! :(
      хе :)
      на бейсике это так потому что это родной вордовский "объект". :)
      В си тебе придётся создавать OLE объекты, подключаться к ворду и там уже исполнять VBA макросы.
        ExpandedWrap disabled
           
          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
          Цитата laifik,7.09.04, 07:42
          ExpandedWrap disabled
            OleVariant tr = AnsiString("true");

          Bas, вот в этой фразе я сморозила глупость. Обратила внимание, когда увидела Ваш код. Спасибо большое.
          Но на этом вопрос не закончился.
          А если текст "Текст номера" находится в колонтитуле. То как активизировать колонтитул на языке Си и заменить в нем фразу? Опять же, на Бейсике все понятно.
            В общем, на Бейсике активизация колонтитула и замена строки в макросе выглядит так:
            ExpandedWrap disabled
              //Найти в колонтитуле и изменить
                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


            С огромным трудом, но удалось перевести на Си.
            Получилось вот что:
            ExpandedWrap disabled
              //Активизация колонтитула
              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);

            Вроде все правильно, но происходит активизация колонтитула, а замена слова почему-то нет. Если повнимательнее присмотреться к первому коду, посоветуйте, чего мне не хватает во втором?
              А почему нельзя сделать Dll на Бейсике и уже его использовать в C ?
              Или я чего то непонимаю или так гораздо проще, если код на Бейсике уже есть.
                Попробуйте примерно так
                ExpandedWrap disabled
                   
                  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
                  Цитата SmK,7.09.04, 16:21
                  А почему нельзя сделать Dll на Бейсике и уже его использовать в C ?
                  Или я чего то непонимаю или так гораздо проще, если код на Бейсике уже есть.

                  Это уже высший пилотаж. Я не умею это делать. Зато Ворд из Билдера загружаю со многими возможностями. И мне даже интересно довести это до конца.
                  Далее я еще хочу осуществить формирование оглавления на основе заголовков со стилями.
                  А что касается использования VBA, то можно прикрепить макрос, но хочется обойтись без него.
                    Запарилась я с этой проблемой. :wall: Уже полностью воссоздала код макроса
                    ExpandedWrap disabled
                       
                        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
                    на языке Си:
                    ExpandedWrap disabled
                      //Активизация колонтитула
                      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). Но в том, и другом случае поиск и замена отсутствуют. Несколько раз макрос отрабатывался, но по большей части он игнорирует фразу по запросу поиска. Я бы не суетилась, если бы макрос постоянно не работал, но почему через раз... Тогда мне не понятно, как добраться до данных в таблице, которая находится в колонтитуле.
                    И еще важный момент: когда я открываю колонтитул на двойной щелчок (без участия макроса), а затем запускаю макрос на поиск фразы и ее замену, то макрос работает. Дело, наверное, в самом шаблоне, но его делали несколько лет назад. Ворд я знаю неплохо, но не могу разобраться, в чем причина. И стили проверила, и все свойства.
                    Может кто-нибудь знает ответ на мой вопрос?
                    И еще: если эти два куска (активизация колонтитула и поиск фразы) исполнять по отдельности, то они работают как надо. Только поиск фразы осуществляется по всему документу, не затрагивая колонтитул.
                    Сообщение отредактировано: laifik -
                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0459 ]   [ 15 queries used ]   [ Generated: 4.04.26, 11:27 GMT ]