1

Тема: Не получается через F9 обновить сразу несколько ссылок. ???

Подскажите, пожалуйста....

В документе много гиперссылок, в основном на сноски на других страницах (см. вложенный скриншот).

Если выделить одну сноску и нажать F9, то ссылка обновится, как и положено.

Но если выделить несколько сносок (у меня все гиперссылки в сносках) и нажать F9, то Ворд пишет "Приложению Word не удается отменить данное действие".

Как быть? У меня документ 500 страниц и  в нем 700 сносок, все руками обновлять каждый раз я убьюсь.

Post's attachments

probl1.JPG 71.77 Кб, файл не был скачан. 

You don't have the permssions to download the attachments of this post.

2

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Evgen238 пишет:

Как быть? У меня документ 500 страниц и  в нем 700 сносок, все руками обновлять каждый раз я убьюсь.

Лучше всего создайте макрос на VBA для обновления всех полей в документе и назначьте комбинацию "горячих" клавиш на этот макрос. За основу можно взять, напр., макрос из внешняя ссылка. Обновляйте все поля в документе перед его сохранением.

3

Re: Не получается через F9 обновить сразу несколько ссылок. ???

yshindin пишет:
Evgen238 пишет:

Как быть? У меня документ 500 страниц и  в нем 700 сносок, все руками обновлять каждый раз я убьюсь.

Лучше всего создайте макрос на VBA для обновления всех полей в документе и назначьте комбинацию "горячих" клавиш на этот макрос. За основу можно взять, напр., макрос из внешняя ссылка. Обновляйте все поля в документе перед его сохранением.


Я в этом полный дуб-дуб, вижу только знакомые буквы в Вашем тексте. Как можно купить такую услугу?

4

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Evgen238 пишет:

Я в этом полный дуб-дуб, вижу только знакомые буквы в Вашем тексте.

Напишите мне в личку.

5

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Evgen238 пишет:

Подскажите, пожалуйста....

В документе много гиперссылок, в основном на сноски на других страницах (см. вложенный скриншот).

Если выделить одну сноску и нажать F9, то ссылка обновится, как и положено.

Но если выделить несколько сносок (у меня все гиперссылки в сносках) и нажать F9, то Ворд пишет "Приложению Word не удается отменить данное действие".

Как быть? У меня документ 500 страниц и  в нем 700 сносок, все руками обновлять каждый раз я убьюсь.

Вероятно, ошибка возникает из-за того, что в Вашем файле сформирована слишком сложная система ссылок и сносок.
Я думаю, что эксперт yshindin предложил хорошее решение.
Интересно, сообщите нам, удалось ли Вам успешно обновить все поля с помощью этого макроса.

Примечание: методические указания по применению макросов см. у нас на сайте: http://wordexpert.ru/forum/viewtopic.php?id=1342

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

6

Re: Не получается через F9 обновить сразу несколько ссылок. ???

yshindin пишет:
Evgen238 пишет:

Я в этом полный дуб-дуб, вижу только знакомые буквы в Вашем тексте.

Напишите мне в личку.

Спасибо огромное! Всё получилось. Макрос (не первый, а второй) всё сделал как надо.

Приятно, что есть профи в своем деле.

7

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Evgen238 пишет:

Спасибо огромное! Всё получилось. Макрос (не первый, а второй) всё сделал как надо.

Приятно, что есть профи в своем деле.

А где там второй макрос? smile
Там, вроде бы, всего один.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

8

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Мне господин Yshindin его скинул.

9

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Коллеги, поделитесь, пожалуйста, с общественностью работающим макросом. smile

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

10

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Alex_Gur пишет:

Коллеги, поделитесь, пожалуйста, с общественностью работающим макросом. smile

Я отправил Evgen238 еще два макроса (в макросе, что я применяю в своей практике, я использую оба подхода):

1-й макрос - универсальный (цикл по полям всех Story):
Sub UpdateAllFields()
Dim doc As Document
Set doc = ActiveDocument

Dim sRange As Range
Dim sField As Field

For Each sRange In doc.StoryRanges
   For Each sField In sRange.Fields
      sField.Update
   Next sField
Next sRange

End Sub

2-й макрос - специально для полей, размещенных в областях колонтитулов (к тому же там обрабатываются поля в текстбоксах, что можно встретить в полях ГОСТовых рамок):
Sub UpdateFieldsInHeaderFooter()
For Each osection In ActiveDocument.Sections
    For Each oHeaderFooter In osection.Footers
        For Each oShape In oHeaderFooter.Shapes
            If oShape.Type = msoGroup Then
                For Each oItem In oShape.GroupItems
                    If oItem.Type = msoTextBox Then
                        Set oTextFrame = oItem.TextFrame
                        If oTextFrame.TextRange.Fields.count <> 0 Then
                            oTextFrame.TextRange.Fields.Update
                        End If
                    End If
                Next oItem
            End If
        Next oShape
    Next oHeaderFooter
    For Each oHeaderFooter In osection.Footers
        For Each oFld In oHeaderFooter.Range.Fields
            oFld.Update
        Next oFld
    Next oHeaderFooter
    For Each oHeaderFooter In osection.Headers
        For Each oFld In oHeaderFooter.Range.Fields
            oFld.Update
        Next oFld
    Next oHeaderFooter
Next osection
End Sub

11

Re: Не получается через F9 обновить сразу несколько ссылок. ???

yshindin пишет:
Alex_Gur пишет:

Коллеги, поделитесь, пожалуйста, с общественностью работающим макросом. smile

Я отправил Evgen238 еще два макроса (в макросе, что я применяю в своей практике, я использую оба подхода):

1-й макрос - универсальный (цикл по полям всех Story):
Sub UpdateAllFields()
Dim doc As Document
Set doc = ActiveDocument

Dim sRange As Range
Dim sField As Field

For Each sRange In doc.StoryRanges
   For Each sField In sRange.Fields
      sField.Update
   Next sField
Next sRange

End Sub

2-й макрос - специально для полей, размещенных в областях колонтитулов (к тому же там обрабатываются поля в текстбоксах, что можно встретить в полях ГОСТовых рамок):
Sub UpdateFieldsInHeaderFooter()
For Each osection In ActiveDocument.Sections
    For Each oHeaderFooter In osection.Footers
        For Each oShape In oHeaderFooter.Shapes
            If oShape.Type = msoGroup Then
                For Each oItem In oShape.GroupItems
                    If oItem.Type = msoTextBox Then
                        Set oTextFrame = oItem.TextFrame
                        If oTextFrame.TextRange.Fields.count <> 0 Then
                            oTextFrame.TextRange.Fields.Update
                        End If
                    End If
                Next oItem
            End If
        Next oShape
    Next oHeaderFooter
    For Each oHeaderFooter In osection.Footers
        For Each oFld In oHeaderFooter.Range.Fields
            oFld.Update
        Next oFld
    Next oHeaderFooter
    For Each oHeaderFooter In osection.Headers
        For Each oFld In oHeaderFooter.Range.Fields
            oFld.Update
        Next oFld
    Next oHeaderFooter
Next osection
End Sub

Evgen238, и что - первый макрос у Вас не сработал?
Или Вы его не испробовали?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

12

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Первый какой-то другой был. А первый из здесь размещенных (т.е. второй из тех, что я попробовал) сработал.

13

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Спасибо, очень интересно!

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

14

Re: Не получается через F9 обновить сразу несколько ссылок. ???

yshindin пишет:

2-й макрос - специально для полей, размещенных в областях колонтитулов (к тому же там обрабатываются поля в текстбоксах, что можно встретить в полях ГОСТовых рамок):
Sub UpdateFieldsInHeaderFooter()
For Each osection In ActiveDocument.Sections

Жаль, что в этой процедуре в начале не определены переменные. Я в начале модулей всегда прописываю Option Explicit. Придется доделывать.

К этому можно еще добавить обновление оглавления, например:

Public Sub UpdateTOC()
  ActiveDocument.TablesOfContents(1).Update
End Sub
Мой шаблон/макросы для автоматической нумерации Word 2003, 2007, 2010 и т.д. (стили, названия, перекрестные ссылки, LISTNUM). Делюсь: http://vk.com/club_alex_bir

15

Re: Не получается через F9 обновить сразу несколько ссылок. ???

yshindin пишет:

Я отправил Evgen238 еще два макроса (в макросе, что я применяю в своей практике, я использую оба подхода):

Ваш второй макрос, назначение которого залазить в колонтитулы и обновлять в них все поля, не обновляет поля в надписях. Это наглядно видно, если заменить .Update на .Unlink; перекрестные ссылки в надписях остаются серыми (если включено затенение полей).

А вот первый макрос обновляет поля в надписях, но только он не обрабатывает колонтитулы.

Обновление полей «на стероидах», по вашей ссылке, работает отлично и обновляет поля как тексте документа, так и в колонтитулах, внутри и вне надписей. Непонятно, почему вы не используете это «стероидное» обновление, и вместо одного макроса используете два, второй из которых не полностью выполняет свои обязанности (вне надписей он все же работает, вроде).

Теперь по делу

Макрос "на стероидах" обновляет все поля, кроме оглавления (поле TOC). На всякий случай приведу этот макрос здесь:

Public Sub UpdateAllFieldsOnSteroids()
' Обновление всех полей "на стреоидах" в тексте и в колонтитулах, внутри и вне надписей
'http://www.vbaexpress.com/kb/getarticle.php?kb_id=1100

    Dim rngStory As Word.Range
    Dim lngJunk As Long
    Dim oShp As Shape
    lngJunk = ActiveDocument.Sections(1).Headers(1).Range.StoryType
    For Each rngStory In ActiveDocument.StoryRanges
         'Iterate through all linked stories
        Do
            On Error Resume Next
            rngStory.Fields.Update
            Select Case rngStory.StoryType
            Case 6, 7, 8, 9, 10, 11
                If rngStory.ShapeRange.Count > 0 Then
                    For Each oShp In rngStory.ShapeRange
                        If oShp.TextFrame.HasText Then
                            oShp.TextFrame.TextRange.Fields.Update
                        End If
                    Next
                End If
            Case Else
                 'Do Nothing
            End Select
            On Error GoTo 0
             'Get next linked story (if any)
            Set rngStory = rngStory.NextStoryRange
        Loop Until rngStory Is Nothing
    Next
End Sub

А вот этот макрос обновляет поля TOC разных видов (оглавление или перечни):

Sub UpdateRefTables()
' Обновление оглавлений и перечней рисунков и таблиц
'http://www.office-forums.com/threads/vba-to-update-toc.1861901/

Dim TOC As TableOfContents ' Table of Contents Object
Dim TOA As TableOfAuthorities ' Table of Authorities Object
Dim TOF As TableOfFigures ' Table of Figures Object
  With ActiveDocument
    ' The following routines update TOC, TOA or TOF contents.
    ' Loop through Tables Of Contents and update
    For Each TOC In .TablesOfContents
      TOC.Update
    Next
    ' Loop through Tables Of Authorities and update
    For Each TOA In .TablesOfAuthorities
      TOA.Update
    Next
    ' Loop through Tables Of Figures and update
    For Each TOF In .TablesOfFigures
      TOF.Update
    Next
  End With
End Sub

По-моему, приведенная пара процедур обновит в документе ВСЕ поля. По крайне мере, начальное тестирование показало, что все очень здорово. И я доволен как слон. Нажатием одной кнопки можно обновить сразу все.

Мой шаблон/макросы для автоматической нумерации Word 2003, 2007, 2010 и т.д. (стили, названия, перекрестные ссылки, LISTNUM). Делюсь: http://vk.com/club_alex_bir

16

Re: Не получается через F9 обновить сразу несколько ссылок. ???

А чем не нравится такой код?

Sub Fields_Update()
PrintPreview = True
PrintPreview = False
End Sub

Вроде бы приведенная  процедура из пары строк кода тоже обновляет в документе все поля (кроме поля TOC), в том числе поля, находящиеся в надписях в колонтитулах.

17

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Борис, нравится. Слышал про него раньше. И почему все разрабатывают какие-то сложные макросы...
Ну, я в основном написал ради того, чтобы дать макрос полного обновления всех полей TOC. Будем, значит, использовать этот и тот, что вы дали.
Я так понимаю, для экспертов вопрос обновления полей уже сто раз решен, и им лень комментировать, а я все по старинке использую и использую CTRL+A, F9.

Мой шаблон/макросы для автоматической нумерации Word 2003, 2007, 2010 и т.д. (стили, названия, перекрестные ссылки, LISTNUM). Делюсь: http://vk.com/club_alex_bir

18

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Поля TOC рекомендую обновить дважды, т.к. при первом обновлении может измениться число страниц, на которых расположено оглавление. Второе обновление уже учитывает изменившееся число страниц.

19

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Boris_R пишет:

А чем не нравится такой код?

Есть маленький недостаток - при обновлении, страница прокручивается, это немного неприятно. Поэтому я пока повесил себе на кнопку оба макроса (на стероидах и через предпросмотр). Посмотрю еще какой лучше. Если предпросмотр работает быстрее, то будет проблема выбора...

Мой шаблон/макросы для автоматической нумерации Word 2003, 2007, 2010 и т.д. (стили, названия, перекрестные ссылки, LISTNUM). Делюсь: http://vk.com/club_alex_bir

20

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Александр Б. пишет:

Есть маленький недостаток - при обновлении, страница прокручивается, это немного неприятно. ...

Это лечится запретом обновления экрана в начале кода и восстановлением обновления в конце.

Sub Fields_Update()
Application.ScreenUpdating = False   'Отключаем обновление экрана
PrintPreview = True
PrintPreview = False
Application.ScreenUpdating = True   'Включаем обновление
End Sub

Кстати, запрет обновления экрана  позволяет значительно уменьшить время выполнения кода

21

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Борис, все равно прокручивается (к позиции вставки). Но за запрет обновления экрана спасибо. Посмотрю, как это на производительность влияет.

Мой шаблон/макросы для автоматической нумерации Word 2003, 2007, 2010 и т.д. (стили, названия, перекрестные ссылки, LISTNUM). Делюсь: http://vk.com/club_alex_bir

22

Re: Не получается через F9 обновить сразу несколько ссылок. ???

yshindin пишет:

1-й макрос - универсальный (цикл по полям всех Story):
Sub UpdateAllFields()
Dim doc As Document
Set doc = ActiveDocument

Dim sRange As Range
Dim sField As Field

For Each sRange In doc.StoryRanges
   For Each sField In sRange.Fields
      sField.Update
   Next sField
Next sRange

End Sub

Оказалось, что этот макрос обновляет поля в основном тексте и в одной надписи (Text box). Если надписей много, то они не обновятся. Проще всего это показать, заменив sField.Update на sField.Unlink, и включив затенение полей. Сразу будет видно, что обработка всех надписей не выполняется.

Сейчас я воюю со StoryRanges. Там в надписях непонятно как выделять текст с помощью Range. В коде ниже последняя строка неправильно выделяет (перед выполнением кода, выделено поле SEQ, которое расположено в надписи). Может кто-нибудь подскажет, как это исправить?

Dim lngStart As Long, lngEnd As Long 'левая и правая позиция выделения
Dim oRng As Range 'объект Range
  
  lngEnd = Selection.Range.End ' ЛЕВАЯ граница поля SEQ
  
     ' сохраняем ЛЕВУЮ границу поля SEQ (чтобы поиск " - " потом можно было сделать)
  Set oRng = ActiveDocument.Range(Start:=lngEnd, End:=lngEnd) 

  Selection.StartOf Unit:=wdParagraph 'переход в начало абзаца
  lngStart = Selection.Range.Start 'левая граница абзаца
  
    'выделяем от начала абзаца 
  ActiveDocument.Range(Start:=lngStart, End:=lngEnd).Select до конца поля SEQ
Мой шаблон/макросы для автоматической нумерации Word 2003, 2007, 2010 и т.д. (стили, названия, перекрестные ссылки, LISTNUM). Делюсь: http://vk.com/club_alex_bir

23

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Это поможет?

For Each s In ActiveDocument.Shapes
    With s.TextFrame
        If .HasText Then MsgBox .TextRange.Text
    End With
Next

24

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Boris_R пишет:

Это поможет?

Нет, в решении должны быть задействованы переменные lngStart и lngEnd, которые определяются в рамках надписи, например lngStart=0, поэтому ActiveDocument.Range выделяет текст в самом начале документа, а мне нужно выделение в начале надписи. Т.е. мне нужна какая-то другая команда, не ActiveDocument.Range...

Мой шаблон/макросы для автоматической нумерации Word 2003, 2007, 2010 и т.д. (стили, названия, перекрестные ссылки, LISTNUM). Делюсь: http://vk.com/club_alex_bir

25

Re: Не получается через F9 обновить сразу несколько ссылок. ???

А такой пример добавит ясности, как получить объект Range  для содержимого текстового поля?

Sub shape_textrange()
Dim s As Shape
Dim myRange As Range
'Работаем с объектами Shapes в области MainStory активного документа
For Each s In ActiveDocument.Shapes
    With s.TextFrame
        If .HasText Then
        Set myRange = .TextRange   'myRange - это и есть искомое содержимое текстового поля
        End If
    End With
'Здесь пишем код для обработки myRange
'   например,так: myRange.Select
'   или
    With myRange
        If .Fields.Count > 0 Then
           .Fields(1).ShowCodes = True 
        End If
    End With
Next
End Sub

Т.е., до содержимого текстового поля добираемся через Shapes(i).TextFrame.TextRange

26

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Надыбал несколько примеров выделения текста в надписях:

'Примеры выделения текста в надписях
'http://windowssecrets.com/forums/showthread.php/18031-Select-text-in-text-box-from-within-VBA-%28Word-97-SR2%29

    '1) выделение текста в первой надписи
  ActiveDocument.Shapes(1).TextFrame.TextRange.Select
    
    '2) выделение второго слова (в первой надписи)
  ActiveDocument.Shapes(1).TextFrame.TextRange.Words(2).Select
    
    '3) выделение третьего символа (в первой надписи)
  ActiveDocument.Shapes(1).TextFrame.TextRange.Characters(3).Select

    '4) выделение символов с третьего по шестой (в первой надписи)
  Dim rng As Range
  Set rng = ActiveDocument.Shapes(1).TextFrame.TextRange
  rng.Start = rng.Characters(3).Start
  rng.End = rng.Characters(4).End
  rng.Select

Но этого недостаточно. Допустим я могу выделять диапазоны символов, как в последнем (четвертом) примере, но непонятно как определить номер символа в текущем выделении. Например, какой будет номер у выделенного поля SEQ, как это узнать?

Честно говоря, у меня были трудности даже с обычным Range для определения позиций в основном теле документа (хотя на самом деле это оказалось очень просто), но у TextRange какая-то другая логика, судя по последнему (четвертому) примеру, когда номер начального символа (равен 3) отсчитывается от начала надписи, а номер конечного символа (равен 3+4-1) отсчитывается от начального символа (а не от начала надписи, как можно было бы подумать).

Мой шаблон/макросы для автоматической нумерации Word 2003, 2007, 2010 и т.д. (стили, названия, перекрестные ссылки, LISTNUM). Делюсь: http://vk.com/club_alex_bir

27

Re: Не получается через F9 обновить сразу несколько ссылок. ???

Разобрался кое-как. Оказывается число выделенных символов можно посчитать, нехитрым способом:

Dim lngCount As Long  
  Selection.MoveRight Unit:=wdCharacter, Count:=1 'вправо на один
  Selection.MoveUp Unit:=wdParagraph, Count:=1, Extend:=wdExtend 'выделяем все символы до начала абзаца ("Рисунок 1")
  lngCount = Selection.Range.Characters.Count 'число выделенных символов (девять)

А вот так можно определить номер текущей надписи: 

' Определяем номер текущей надписи
Dim lngShapeCount As Long
  With ActiveDocument
    lngShapeCount = .Range(Start:=0, End:=.Range.End).ShapeRange.Count
  End With

Дальше в текущей надписи можно выделять любые символы, например можно выделить символ после изначально выделенного:

Dim rng As Range
  Set rng = ActiveDocument.Shapes(lngShapeCount).TextFrame.TextRange
  rng.Start = rng.Characters(lngCount + 1).Start
  rng.End = rng.Characters(1).End
  rng.Select

Напоминаю, что изначально выделено поле SEQ в некой надписи. И с помощью этих трех кусков кода можно выделить символ следующий за этим полем.

Мой шаблон/макросы для автоматической нумерации Word 2003, 2007, 2010 и т.д. (стили, названия, перекрестные ссылки, LISTNUM). Делюсь: http://vk.com/club_alex_bir