На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Таблица в рамке Word. Как добраться? , Frames?
    Таблица на титульном листе располагается в рамке надписи. Если в Ворде с помощью команды "Перейти" хочу перейти на таблицу, то курсор на таблице не останавливается. Он таблицу не видит.
    Если бы можно было составить макрос, дошло бы до меня, как перевести на С++. Но макроса нет.
    Может кто знае, как программно через OleServer выделить таблицу в рамке.
    Очень буду благодарна. Таких вопросов даже в инете не задают. Редко кому нужно. Но мне постоянно приходится работать программно с вордовскими документами.
      Насколько я понимаю, нужно в ActiveDocument.ActiveWindow.ActivePane перебрать все Page и для каждого изучить коллекцию Rectangles. (Если цель только лишь титульный лист, достаточно ограничиться только первой страницей.) Она содержит объекты Rectangle, в которых нужно поискать те, которые имеют RectangleType равным wdShapeRectangle, взять их Range и делать с ним, что угодно. Это если я правильно понял тип контейнера "рамка надписи".
      Сообщение отредактировано: Qraizer -
        Спасибо за подсказку. Получилось вот что:
        ExpandedWrap disabled
          Variant shape;
          shape = Wdoc.OlePropertyGet("Shapes").OleFunction("Range", 1);
          shape.OleProcedure("Select");

        Этим кодом я активирую рамку. На прикрепленном файле это видно. А вот проникнуть в таблицу, которая находится внутри рамки, не получается.
        Я думала, должно быть так:
        ExpandedWrap disabled
          Variant Tbl = shape.OlePropertyGet("Tables").OleFunction("Item", 1);

        Но это не работает. Может знаете, как проникнуть в рамку?
        Я вышла из положения таким образом:
        1) Выделила все - в итоге таблица внутри рамки выделилась;
        2) Команда "вырезать"
        3) Перешла на первый раздел
        4) Вставила таблицу - она уже вне рамки и с ней можно работать, вытаскивать данные из ячеек.
        Но, думаю, должен быть правильный путь. Хотелось бы его узнать.
        Прикреплённая картинка
        Прикреплённая картинка
          Ага. Значит всё-таки неправильно. Ну и ладно.
          Цитата laifik @
          Но, думаю, должен быть правильный путь. Хотелось бы его узнать.
          Если на этот раз правильно, то после
          ExpandedWrap disabled
            shape.OleProcedure("Select");
          можно просто взять Selection и работать с его Range. Там должно быть всё.

          Добавлено
          P.S. Selection берётся от приложения, а не документа, это глобальный объект.
            К сожалению, ничего не получается. Как только обращаюсь к таблице, которая находится в рамке, курсор переходит на первую таблицу документа.
            То же самое происходит и в документе, который я прикрепила.
            Таблица находится в верхнем колонтитуле (так я думаю). Вхожу в колонтитул, запрашиваю, сколько таблиц в колонтитуле. Получаю ответ = 1. Перехожу на 1 таблицу в колонтитуле. Курсор не видит таблицу и выходит из колонтитула.
            А вот на второй странице спокойно нахожу таблицу в колонтитуле и обращаюсь к ней.
            Я неплохо знаю Word, казалось, уже все в нем запрограммировала. Иногда, чтобы понять, как действовать, составляю сначала макрос, а затем пишу на C++. Но в данном документе даже макрос не составляется.
            Может есть "продвинутые", которые объяснят мне, что происходит с таблицей в данном конкретном документе.
            Мои действия:

            ExpandedWrap disabled
                   //Активизирую колонтитул - нижний
               Variant ActiveWindow=Wapp.OlePropertyGet("ActiveWindow");
                Variant Value=ActiveWindow.OlePropertyGet("View").OlePropertyGet("SplitSpecial");
                      if(Value!=0  )
                ActiveWindow.OlePropertyGet("Panes").OleFunction("Item",2).OleProcedure("Close");
               
                Variant ActivePane=ActiveWindow.OlePropertyGet("ActivePane");
                Value=ActivePane.OlePropertyGet("View").OlePropertyGet("Type");
                   if((Value== 1  )
                   || (Value== 2 ))     {  //Value== 1
                   ActivePane.OlePropertyGet("View").OlePropertySet("Type", 3 );
                                        }  //Value== 1
               
                   //Перехожу на верхний колонтитул
                ActivePane.OlePropertyGet("View").OlePropertySet("SeekView",9 );
               
                Range = Wdoc.OlePropertyGet("Sections").OleFunction("Item",1);
              //Входу в "подвал"
                Variant Foot = Range.OlePropertyGet("Footers").OleFunction("Item",1).OlePropertyGet("Range");
               
                int n_tab=Foot.OlePropertyGet("Tables").OlePropertyGet("Count"); //Определяю, сколько таблиц создано
               
                Variant Tabl_D = Foot.OlePropertyGet("Tables").OleFunction("Item",n_tab);
                Tabl_D.OleFunction("Cell", 1, 1).OleProcedure("Select");

            Ну и несколько аналогичных вариантов, а результата никакого.
            Прошу помощи :huh:
            Прикреплённый файлПрикреплённый файл__________________.doc (114 Кбайт, скачиваний: 126)
            Сообщение отредактировано: laifik -
              Дык эта, колонтитулы – это совсем другое.
              В твоём документе таблица находится в верхнем колонтитуле, как ни странно, а не в нижнем. Вот тут её видно:
              ExpandedWrap disabled
                MsgBox ActiveDocument.Sections(1).Headers(2).Range.Tables(1).Range.Text
                Полагаю, что это должно быть так:
                ExpandedWrap disabled
                  Range = Wdoc.OlePropertyGet("Sections").OleFunction("Item",1);
                   
                    Variant Headers = Range.OlePropertyGet("Headers").OleFunction("Item",2).OlePropertyGet("Range");
                   
                    Table_Info = Headers.OlePropertyGet("Tables").OleFunction("Item",1);

                Я вспомнила, что когда-то мне приходилось рисовать номер документа в колонтитуле (а по факту - вовсе не колонтитуле) слева листа альбомной ориентации.
                Просто уже подзабыла, что в Ворде все так неоднозначно.
                Спасибо за ответы. Теперь все должно получиться. :)
                  Это в целом то же, что у тебя, только Headers вместо Footers.
                  Конкретно тут это автор документа постарался так всё запутать. Но да, иерархия классов в Офисе ужасная.

                  P.S. Вам вот ещё хорошо, а мне год назад пришлось писать тулзу на голом C++ и WinAPI, т.к. она должна была быть лицензионно чиста и бесплатна.
                  Сообщение отредактировано: Qraizer -
                    Еще раз хочу поблагодарить. Все заработало! :D
                    Может, кому-нибудь понадобится. Хотя за годы работы с Вордом, мало кто им интересуется и очень мало литературы. :huh:
                      Цитата laifik @
                      Хотя за годы работы с Вордом, мало кто им интересуется и очень мало литературы.

                      На каждую версию ворда выходит книжка листов под тысячу, но там только как пользоваться этим монстром.
                      Даже раздел есть - VB for Application
                      Сообщение отредактировано: Bas -
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0333 ]   [ 19 queries used ]   [ Generated: 19.04.24, 20:39 GMT ]