Модераторы: mihanik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определить начало второй страницы Word 
V
    Опции темы
kminas
Дата 14.2.2008, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 26.10.2005
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Как определить в программе Word, когда курсор перешел на вторую страницу?
PM MAIL   Вверх
Akina
Дата 15.2.2008, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



При вводе текста? а зачем? страница есть понятие более чем виртуальное, и получает смысл только при форматировании для печати.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Aloha
Дата 15.2.2008, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
**


Профиль
Группа: Участник Клуба
Сообщений: 351
Регистрация: 14.5.2006

Репутация: 5
Всего: 165



kminas

У объектов Range и Selection есть свойство Information, которое возвращает информацию об этих объектах. Характер информации определяется аргументом Type. Если Type равен
wdActiveEndAdjustedPageNumber или wdActiveEndPageNumber то свойство Information вернет номер страницы, содержащей конец выделения или диапазона:

Цитата
wdActiveEndAdjustedPageNumber  Returns the number of the page that contains the active end of the specified selection or range. If you set a starting page number or make other manual adjustments, returns the adjusted page number (unlike wdActiveEndPageNumber).

Цитата
wdActiveEndPageNumber  Returns the number of the page that contains the active end of the specified selection or range, counting from the beginning of the document. Any manual adjustments to page numbering are disregarded (unlike wdActiveEndAdjustedPageNumber).

Отсюда понятна разница между константами wdActiveEndAdjustedPageNumber и wdActiveEndPageNumber: если пользователь начал нумерацию страниц не с 1-й, то 
Код
Debug.Print Selection.Information(wdActiveEndAdjustedPageNumber)
 вернет тот номер, который будет соответствовать пользовательской нумерации (тому номеру страницы, который виден в колонтитуле и в строке состояния), а 
Код
Debug.Print Selection.Information(wdActiveEndPageNumber)
 вернет фактический номер страницы с начала документа.

PM   Вверх
kminas
Дата 15.2.2008, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 26.10.2005
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Akina, а зачам тогда, например wdHeaderFooterFirstPage или wdHeaderFooterCurrentPage и т.д. Значит определяются как-то страницы?
  
Aloha,  Спасибо, буду экспериментировать. Правда мне не нужен номер, я его знаю, он ставится автоматически, но попробую. Если что получится - опишу.

PM MAIL   Вверх
kminas
Дата 15.2.2008, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 26.10.2005
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Aloha, самое простое сделал
Код

If Selection.Information(wdActiveEndAdjustedPageNumber) = 2 Then
             MsgBox "Сейчас пора заполнить штамп второго листа!", vbOKOnly + vbExclamation, 
             optShtamp.Value = True 'включается форма для заполнения штампа
End If

Теперь надо думать, как быть дальше.
Во-первых, у меня много процедур и в какую из них вставлять этот код? Во все? Или можно как-то задать глобально (очень слаб я в этом) и, во-вторых, как ее остановить? 

Это сообщение отредактировал(а) kminas - 15.2.2008, 21:08
PM MAIL   Вверх
Akina
Дата 15.2.2008, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



Цитата(kminas @  15.2.2008,  19:33 Найти цитируемый пост)
 а зачам тогда

да хрен его знает зачем. Смени верхню границу печати, поставь 10 сантиметров... или, скажем, формат с А4 на А3 поменяй (тупо сменив принтер)... с другой стороны надо же ему, ворду, чего-то рисовать - вдруг ты НЕ станешь ничего менять


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
kminas
Дата 15.2.2008, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 26.10.2005
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Akina, извини, но у меня-то получилось, как посоветовал Aloha, но?!
PM MAIL   Вверх
Aloha
Дата 15.2.2008, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
**


Профиль
Группа: Участник Клуба
Сообщений: 351
Регистрация: 14.5.2006

Репутация: 5
Всего: 165



kminas

Цитата
у меня много процедур и в какую из них вставлять этот код?

Мне кажется, лучше всего в обработчик какого-нибудь подходящего события. Глянем на объектную модель Word’a. У объекта Document событий немного: Close, New да Open. Не очень подходит для нашего случая. А вот у объекта Application есть вполне подходящее событие: WindowSelectionChange. Проблема только в том, что чтобы его заюзать нужно предпринять некоторые телодвижения, а именно – “подписаться” на это событие.
Для этого нужно сделать следующее. Добавить модуль класса и назвать его, например, EventClassModule. Затем в этот модуль добавить код:
Код
Public WithEvents App As Word.Application

Private Sub App_WindowSelectionChange(ByVal Sel As Selection)
  If Sel.Information(wdActiveEndAdjustedPageNumber) = 2 Then
    MsgBox "Сейчас пора заполнить штамп второго листа!", vbOKOnly + vbExclamation
    'optShtamp.Value = True 'включается форма для заполнения штампа
  End If
End Sub


Теперь остается только инициализировать соответствующий объект. Это можно сделать так: в модуль класса ThisDocument добавить код инициализации, прикрутив его, например, к событию Document_Open:
Код
 Dim X As New EventClassModule

Private Sub Document_Open()
  Set X.App = Word.Application
End Sub


У всего этого дела есть недостаток. Событие WindowSelectionChange наступает когда меняется выделение – либо мышкой, либо клавишами ArrowLeft, Right, Up, Down (короче - стрелками), либо клавишей Delete. Но при этом не происходит при нажатии других клавиш, включая Enter. Т.е. если юзер буде просто печатать и перейдет при этом на новую страницу – событие WindowSelectionChange не инициируется.
Других, более подходящих событий в объектной модели Word’a я не углядел (у меня Word 2002).

Цитата
во-вторых, как ее остановить?

Ну, можно, к примеру, завести глобальную переменную - флаг и в ней хранить "состояние" системы. Что-то типа Public blnMsgWasSent As Boolean (переменную нужно объявлять в обычном модуле - не модуле класса). В обработчик события App_WindowSelectionChange добавить строку
Код
blnMsgWasSent = True
а также проверять в этом обработчике значение этой переменной:
Код
Private Sub App_WindowSelectionChange(ByVal Sel As Selection)
  If blnMsgWasSent = False And Sel.Information(wdActiveEndAdjustedPageNumber) = 2 Then
    blnMsgWasSent = True
    MsgBox "Сейчас пора заполнить штамп второго листа!", vbOKOnly + vbExclamation
    'optShtamp.Value = True 'включается форма для заполнения штампа
  End If
End Sub
 

А можно классу EventClassModule добавить соответствующее свойство, и там хранить "состояние" системы.


Это сообщение отредактировал(а) Aloha - 16.2.2008, 00:16

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Doc1.doc 40,00 Kb
PM   Вверх
kminas
Дата 16.2.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 26.10.2005
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Aloha, большое спасибо, буду пробовать. Но, к сожалению, это одна из  первых моих программ, и я еще не работал с модулями класса. У меня возникла одна мысль, может она конечно глупая. А можно ли эту процедуру создать в обычном модуле и вызывать ее из других процедур, хотя я не знаю как потом возвращаться в исходную процедуру.
Цитата
У всего этого дела есть недостаток. 
 Программа заполняет стандартную таблицу и переход на новую страницу происходит по     
Код
 .MoveRight Unit:=wdCell 


Это сообщение отредактировал(а) kminas - 16.2.2008, 16:54
PM MAIL   Вверх
kminas
Дата 16.2.2008, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 26.10.2005
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



В принципе, можно возвращаться так же, как и вызывать ее - по условию. 
PM MAIL   Вверх
kminas
Дата 17.2.2008, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 26.10.2005
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Цитата(Aloha @  15.2.2008,  23:25 Найти цитируемый пост)
в модуль класса ThisDocument добавить код инициализации
 А вот такого модуля класса у меня нет. Я работаю из чистого VB. Что делать? 

PM MAIL   Вверх
kminas
Дата 17.2.2008, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 26.10.2005
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Спасибо, все ясно. Сохрани эту инфу и буду использовать, когда надо будет пользоваться VBA. Еще раз спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование, связанное с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.1050 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.