1

Тема: Замена текста на ссылки

Добрый день!
Столкнулся с такой задачей - есть документы, которые необходимо перенести в шаблон.
При переносе все перекрестные ссылки рушатся, вручную обновлять - трата большого количества времени.

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

2

Re: Замена текста на ссылки

Почему-то пост урезался, возможно из-за ссылки.. Еще раз:
Попробовал сделать макрос, который выделял бы следующий кусок текста (тут обычный текст, не перекрестная ссылка) : "[номер_ссылки]", копировал номер_ссылки, выделял и удалял этот текст, вставлял перекрестную ссылку с скопированным номером_ссылки.

Sub refchange()

    Selection.MoveRight Unit:=wdCharacter, Count:=1
    Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    Selection.Copy
    Selection.MoveLeft Unit:=wdCharacter, Count:=2
    Selection.MoveRight Unit:=wdCharacter, Count:=3, Extend:=wdExtend
    Selection.Delete Unit:=wdCharacter, Count:=1
    Selection.InsertCrossReference ReferenceType:="Абзац", ReferenceKind:= _
        wdNumberRelativeContext, ReferenceItem:="2", InsertAsHyperlink:=True, _
        IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" "
End Sub

Однако возникла проблема - не получается передать в переменную ReferenceItem мой скопированный номер_ссылки.
Пробовал записывать в переменную, а затем туда, тоже не получалось.. Возникали две проблемы - не мог понять, как правильно записать скопированный номер в переменную, и как передать в ReferenceItem методу Selection.InsertCrossReference.

В документации к методу написано: "Для всех остальных значений ReferenceType этот аргумент указывает номер или имя элемента в поле тип ссылки в диалоговом окне Перекрестные ссылки".

Пробовал просто вставить ссылку, передав переменную методу, выдавало ошибки всегда (runtime error 4198):

Dim refnumb as integer
refnumb = 4
...
    Selection.InsertCrossReference ReferenceType:="Абзац", ReferenceKind:= _
        wdNumberRelativeContext, ReferenceItem:=refnumb, InsertAsHyperlink:=True, _
        IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" "

3

Re: Замена текста на ссылки

Brond пишет:

Почему-то пост урезался, возможно из-за ссылки.. Еще раз:
Попробовал сделать макрос, который выделял бы следующий кусок текста (тут обычный текст, не перекрестная ссылка) : "[номер_ссылки]", копировал номер_ссылки, выделял и удалял этот текст, вставлял перекрестную ссылку с скопированным номером_ссылки.

Sub refchange()

    Selection.MoveRight Unit:=wdCharacter, Count:=1
    Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    Selection.Copy
    Selection.MoveLeft Unit:=wdCharacter, Count:=2
    Selection.MoveRight Unit:=wdCharacter, Count:=3, Extend:=wdExtend
    Selection.Delete Unit:=wdCharacter, Count:=1
    Selection.InsertCrossReference ReferenceType:="Абзац", ReferenceKind:= _
        wdNumberRelativeContext, ReferenceItem:="2", InsertAsHyperlink:=True, _
        IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" "
End Sub

Однако возникла проблема - не получается передать в переменную ReferenceItem мой скопированный номер_ссылки.
Пробовал записывать в переменную, а затем туда, тоже не получалось.. Возникали две проблемы - не мог понять, как правильно записать скопированный номер в переменную, и как передать в ReferenceItem методу Selection.InsertCrossReference.

В документации к методу написано: "Для всех остальных значений ReferenceType этот аргумент указывает номер или имя элемента в поле тип ссылки в диалоговом окне Перекрестные ссылки".

Пробовал просто вставить ссылку, передав переменную методу, выдавало ошибки всегда (runtime error 4198):

Dim refnumb as integer
refnumb = 4
...
    Selection.InsertCrossReference ReferenceType:="Абзац", ReferenceKind:= _
        wdNumberRelativeContext, ReferenceItem:=refnumb, InsertAsHyperlink:=True, _
        IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" "

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

refnumb = Selection.Range.Text
Selection.Range.Delete
Selection.InsertCrossReference ReferenceType:="Абзац", ReferenceKind:= _
        wdNumberRelativeContext, ReferenceItem:=refnumb, InsertAsHyperlink:=True, _
        IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" "

Для ссылок есть объект Field. Можно просто перебирать их и по условию удалять и делать заново.
Вроде такого:

Dim oDoc As Document
Set oDoc = ActiveDocument
' Макрос14 Макрос
y = oDoc.Fields.Count
Dim oFld As Field
For i = y To 1 Step -1
    Set oFld = oDoc.Fields(i)
    sInfo = oFld.Code
    If InStr(sInfo, "Ref") >= 1 Then oFld.Select
    sText = Selection.Range.Text
    If IsNumeric(sText) Then
        Selection.Range.Delete
        Selection.InsertCrossReference ReferenceType:="Абзац", ReferenceKind:= _
            wdNumberRelativeContext, ReferenceItem:=sText, InsertAsHyperlink:=True, _
            IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" "
    End If
Next i
Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871

4

Re: Замена текста на ссылки

Fck_This пишет:

...Проблема в том, что ни черта не понятно, что вы там выделяете своей ездой курсора, вполне возможно выделяется и вносится в переменную совсем не то, что нужно (зависит от того, на что была дана ссылка ранее (что указано в поле, выделенным серым для перекрёстной ссылке?)...

В этом плане все понятно было

Fck_This пишет:

...Вот так можно внести в переменную значение вашего элемента и передать его методу...

Спасибо, именно это и требовалось!)