Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2012, 16:38   #1
madster
 
Регистрация: 02.04.2012
Сообщений: 7
По умолчанию Программно создать поле в колонтитуле

Записал макрос:
Код:
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
 
    Selection.TypeText Text:="Стр. "
    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _
        "PAGE  ", PreserveFormatting:=True
    Selection.TypeText Text:=" из "
    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _
        "NUMPAGES  ", PreserveFormatting:=True
    ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
При его выполнении в колонтитул каждой страницы документа добавляется номер текущей страницы и количество страниц в документе.
Но при попытке использовать макрос в VB получаю ошибку.
Как нужно переделать макрос, чтобы в колонтитулы добавлялись номера страниц?

Заранее спасибо.

Последний раз редактировалось madster; 18.06.2012 в 17:00.
madster вне форума Ответить с цитированием
Старый 19.06.2012, 03:20   #2
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Естественно, если использовать этот макрос в VB совершенно не переделав, то будут ошибки, т.к. макрос подразумевает, что он выполняется из-под Word'a, а ты его выполняешь из-под VB, значит доработать. Лучше всего, подключить соответствующую библиотеку Microsoft Word 11.0 Object Library или другой версии. Тогда код должен выглядеть как-то так:
Код:
Dim wdApp As Word.Application
Dim wdDoc As Word.Document
Set wdApp = New Word.Application 'Создаём новое приложение Word
Set wdDoc = wdApp.Documents.New() 'Новый документ
With wdApp    
    If .ActiveWindow.View.SplitSpecial <> .WdSpecialPane.wdPaneNone Then
        .ActiveWindow.Panes(2).Close
    End If
    If .ActiveWindow.ActivePane.View.Type = wdNormalView Or .ActiveWindow. _
        ActivePane.View.Type = .WdViewType.wdOutlineView Then
        .ActiveWindow.ActivePane.View.Type = .WdViewType.wdPrintView
    End If
 
    .Selection.TypeText Text:="Стр. "
    .Selection.Fields.Add Range:=.Selection.Range, Type:=.WdFieldType.wdFieldEmpty, Text:= _
        "PAGE  ", PreserveFormatting:=True
    .Selection.TypeText Text:=" из "
    .Selection.Fields.Add Range:=.Selection.Range, Type:=.WdFieldType.wdFieldEmpty, Text:= _
        "NUMPAGES  ", PreserveFormatting:=True
    .ActiveWindow.ActivePane.View.SeekView = .WdSeekView.wdSeekMainDocument
End With
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 19.06.2012, 04:18   #3
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

а смысл создавать wdDoc, если к нему не обращаемся?
Ципихович Эндрю вне форума Ответить с цитированием
Старый 19.06.2012, 04:52   #4
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Во-первых, обращаемся к нему: wdSeekMainDocument, во-вторых Selection работает не в вакууме, а в-третьих это только часть кода, вряд ли задача стоит только во вставке поля в колонтитул. И всё же, если переменная для документа не нужна, то её можно не объявлять. Но документ открыть или создать нужно!
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 19.06.2012, 16:42   #5
madster
 
Регистрация: 02.04.2012
Сообщений: 7
По умолчанию

viter.alex, спасибо!
Но на строке "Set wdDoc = wdApp.Documents.New() 'Новый документ" возникает ошибка.
Забыл уточнить, эти манипуляции нужно произвести для 2007 офиса.
Вот так у меня для 2003 офиса:
Код:
Public wrd As Object
Set wrd = CreateObject("Word.Document")
NormalTemplate.AutoTextEntries("Стр. <№> из <всего>").Insert Where:= _
     '   wrd.Sections(1).Footers(wdHeaderFooterPrimary).Range, RichText:=False

Последний раз редактировалось madster; 20.06.2012 в 08:34.
madster вне форума Ответить с цитированием
Старый 19.06.2012, 16:50   #6
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

доля правды есть, а как насчёт wdDoc As Word.Document - тип не определён
Ципихович Эндрю вне форума Ответить с цитированием
Старый 25.06.2012, 13:28   #7
madster
 
Регистрация: 02.04.2012
Сообщений: 7
По умолчанию

Неужели такой сложный вопрос, что больше нет ответов?
madster вне форума Ответить с цитированием
Старый 25.06.2012, 14:31   #8
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Вот так у меня для 2003 офиса
Попробуйте - работает даже в VBS
Код:
With CreateObject("Word.Document")
  .Application.NormalTemplate.AutoTextEntries("Стр. <№> из <всего>").Insert .Sections(1).Footers(1).Range, False
  .Application.Visible = True
End With
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 25.06.2012, 16:03   #9
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Правильнее, конечно, вводить отдельные поля, иначе в другой локали "Стр. <№> из <всего>" не сработает:
Код:
With CreateObject("Word.Document")
  Set ptr = .Sections(1).Footers(1).Range
  ptr.InsertAfter "Стр. "
  ptr.MoveEnd 6         'wdStory
  ptr.Collapse 0        'wdCollapseEnd
  .Fields.Add ptr, 33   'wdFieldPage
  ptr.MoveEnd 6
  ptr.InsertAfter " из "
  ptr.MoveEnd 6
  ptr.Collapse 0
  .Fields.Add ptr, 26   'wdFieldNumPages
  .Application.Visible = True
End With
Наверно, можно сдвигать и коллапсировать Range в одно действие. Кто-нибудь знает, как?
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 25.06.2012, 16:04   #10
madster
 
Регистрация: 02.04.2012
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
Попробуйте - работает даже в VBS
В новосозданном excel файле (2007 офис), запускаю и получаю ошибку:
Run-time error '5941':
Запрашиваемый номер семейства не существует
madster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как создать поле с 3 точками _LEXXX Общие вопросы Delphi 8 03.06.2014 20:53
как програмно создать событие??? gufon Общие вопросы Delphi 7 07.06.2011 16:31
програмно загруз веб страницу вставить текст и програмно нажать кнопку. asdn Общие вопросы .NET 0 05.10.2010 13:40
как програмно создать TSpeedButton Angel86rus Общие вопросы Delphi 2 14.02.2010 21:33