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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2011, 18:46   #11
Traum
 
Регистрация: 21.10.2011
Сообщений: 7
По умолчанию

Я сам кажется разобрался как обновлять поля и переводить их в текст

чем плохи методы:

Ctrl + A; F9; Ctrl + Shift + F9
ActiveDocument.Fields.Unlink
ActiveDocument.Fields.Update

Тем, что они
  • не воздействуют на поля в надписях, которые могут располагаться как сами по себе, так и внутри полотна.
  • отлинковывывают все поля, включая те которые не нужно. Например, поля формул Mathtype или иные вставленные объекты, которые часто не нужно отлинковывать

Часто обновлять и переводить в текст имеет смысл только поля SEQ и REF (включая такие поля в надписях внутри полотен). Ниже представлены 2 макроса для выполнения данной задачи.


Для обновления полей типа SEQ и REF используется макрос DocumentUpdateFields
Для обновления и перевода в текст полей типа SEQ и REF используется макрос DocumentUnlinkFields

Сначала обновляются только поля SEQ, а лишь затем REF, иначе некоторые REF поля могут быть обновлены до обновления поля SEQ, на которое они ссылаются и получат неверное значение

Код:

' field tasks
Const ftUpdateSeqFields As Integer = 1
Const ftUpdateRefFields As Integer = 2
Const ftUnlinkSeqAndRefFields As Integer = 3

Sub DocumentUpdateFields()
  DocumentHandleFields ftUpdateSeqFields
  DocumentHandleFields ftUpdateRefFields
End Sub

Sub DocumentUnlinkFields()
  DocumentHandleFields ftUpdateSeqFields
  DocumentHandleFields ftUpdateRefFields
  DocumentHandleFields ftUnlinkSeqAndRefFields
End Sub

Private Sub DocumentHandleFields(Task As Integer)
  Dim j As Integer
  HandleFields ActiveDocument.Fields, Task       ' обрабатываем обычные поля в документе
  HandleShapesFields ActiveDocument.Shapes, Task ' обрабатываем поля в самостоятельных фигурах
  j = 1
  Do
    If j > ActiveDocument.Shapes.Count Then
      Exit Do
    End If
    HandleShapesFields ActiveDocument.Shapes(j).CanvasItems, Task ' обрабатываем поля в фигурах внутри полотен
    j = j + 1
  Loop
End Sub

Private Sub HandleShapesFields(Shapes As Shapes, Task As Integer)
  Dim j As Integer
  j = 1
  Do
    If j > Shapes.Count Then
      Exit Do
    End If
    If Shapes(j).TextFrame.HasText Then
      HandleFields Shapes(j).TextFrame.TextRange.Fields, Task
    End If
    j = j + 1
  Loop
End Sub

Private Sub HandleFields(Fields As Fields, Task As Integer)
  Dim i As Integer
  Dim IsSeqField As Boolean
  Dim IsRefField As Boolean
  i = 1
  Do
    If i > Fields.Count Then
      Exit Do
    End If
    IsSeqField = (Fields(i).Code Like "SEQ *")
    IsRefField = (Fields(i).Code Like "REF *")
    Select Case Task
      Case ftUpdateSeqFields
        If IsSeqField Then Fields(i).Update
      Case ftUpdateRefFields
        If IsRefField Then Fields(i).Update
      Case ftUnlinkSeqAndRefFields
        If (IsSeqField Or IsRefField) Then Fields(i).Unlink
    End Select
    i = i + 1
  Loop
End Sub
Буду рад узнать мнение знатоков
Traum вне форума Ответить с цитированием
Старый 22.10.2011, 19:53   #12
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

Код:
Const ftUpdateSeqFields As Integer = 1
Const ftUpdateRefFields As Integer = 2
Const ftUnlinkSeqAndRefFields As Integer = 3
As Byte не подходит???
Ципихович Эндрю вне форума Ответить с цитированием
Старый 22.10.2011, 20:17   #13
Traum
 
Регистрация: 21.10.2011
Сообщений: 7
По умолчанию

Цитата:
As Byte не подходит???
Подойдет и Byte. Но по мне более привычные типы это: integer, real, string. Остальное лишь только в случаях когда стоит вопрос об экономии памяти или строгом соответствии структур данных
Traum вне форума Ответить с цитированием
Старый 22.10.2011, 20:28   #14
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

real - что за зверь???
Ципихович Эндрю вне форума Ответить с цитированием
Старый 22.10.2011, 21:28   #15
Traum
 
Регистрация: 21.10.2011
Сообщений: 7
По умолчанию

real - это зверь из других языков. Для меня Visual Basic язык новый, поэтому я не все помню. На счет Byte - просто если стоит integer - то это легко воспринимается, а если поставить Byte, то это будет пусть небольшая но дополнительная нагрузка на мозги.
Traum вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объеденение полей запроса в для отображения нескольких полей в одном списке mrCreator Microsoft Office Access 3 08.08.2009 00:53
Как вывести значение полей из выделенной записи в DBGrid ? DS75 БД в Delphi 5 30.04.2009 13:40
Слияние шаблона с данными из таблице, и как подсичтать значение количества полей в таблице n4ela Microsoft Office Access 3 07.03.2009 12:04
Преобразовать текст в числовой olimpus Microsoft Office Excel 17 12.11.2008 07:58
Как преобразовать число в текст на русском языке??? Aerodeck Microsoft Office Excel 2 09.10.2007 07:51