2016-07-18 2 views
0

Как я могу переименовать свой customVariable в слове? У меня есть Customvaraiable под названием «Номер документа», но теперь я хотел бы переименовать его в _DocumentNumber «изменить имя CustomDocumentProperties в слове с vba

Я знаю, что могу создать новый CustomVariable, удалить старый, но я тогда борется с тем, как обновлять все ссылки в документе на новый

Отредактированный код:.

Sub test() 
Dim A As word.Field 
Dim FldUpd As String 
Dim findText As String 
Dim replaceText As String 

findText = "Document Number" 
replaceText = "_DocumentNumber" 
ActiveWindow.View.ShowFieldCodes = False 

If ActiveDocument.CustomDocumentProperties(findText).value = "" Then Exit Sub 

For Each A In ActiveDocument.Fields 
    If A.result.Text = ActiveDocument.CustomDocumentProperties(findText).value Then 

      Call WordProperties.createCustomDocumentProperty(ActiveDocument.name, replaceText, ActiveDocument.CustomDocumentProperties(findText).value) 
      ActiveWindow.View.ShowFieldCodes = True 

      A.Select 

      'DOCPROPERTY "Document number" \* MERGEFORMAT 
      With Selection.Find 
       .Text = "DOCPROPERTY*" & findText 
       .Replacement.Text = "DOCPROPERTY " & replaceText 
       .Format = True 
       .MatchCase = False 
       .MatchWildcards = True 
      End With 
      tempBool = Selection.Find.Execute(replace:=wdReplaceAll) 

      ' Refresh fields 
      ActiveDocument.Fields.update 

      ActiveWindow.View.ShowFieldCodes = False 
      If tempBool Then ActiveDocument.CustomDocumentProperties(findText).Delete 
    End If 
Next 
End Sub 

Отредактировано: проблема заключается в том, что метод находкой не возвращает истинный

+0

Вы все еще создавать/удалять docproperty внутри цикла. Но это не свойство поля, а документа. Таким образом, он принадлежит снаружи. – Andre

ответ

1

Вы путаете две вещи, которые должны. быть sepa ставка.

Сначала создайте новый DOC свойство, используя ActiveDocument.CustomDocumentProperties.Add

Вы можете сделать это только один раз, так как свойство документа существует только один раз.

Затем вы заменяете все существующие ссылки на старое свойство doc новым. Что-то вроде (выдержки из макрорекордера)

' Show field source references (Alt+F9) so you can use Find&Replace 
ActiveWindow.View.ShowFieldCodes = True 
With Selection.Find 
    .Text = "DOCPROPERTY Document Number" 
    .Replacement.Text = "DOCPROPERTY _DocumentNumber" 
    .Format = False 
End With 
Selection.Find.Execute Replace:=wdReplaceAll 

' Refresh fields 
ActiveDocument.Fields.Update 

ActiveWindow.View.ShowFieldCodes = False 

Тогда вы можете удалить свойство старого документа.

Edit:, чтобы найти и заменить во всех секциях (включая заголовок & колонтитула), см
Searching for Text in Header Section of A Word Document

+0

ОК, поэтому я совмещаю ваш код с моим, чтобы убедиться, что метод find находит вхождения в верхнем и нижнем колонтитулах? – skatun

+0

Я думаю, вы обнаружите, что 'ActiveDocument.Fields' не включает поля в header/footer. См. Править. Но вы можете использовать тот же механизм, что и в связанной записи для коллекций полей в разделах. Затем измените 'myField.Code'. – Andre

+0

Я также отметил, что docproperty иногда использует [пробел] и другие времена [пробел] [пробел], а также другой случай. Я предполагаю, что это связано с тем, что люди редактируют документ слова и все еще работают. Таким образом, это может привести к ошибке «Номер документа DOCPROPERTY», поскольку в некоторых документах это может быть «Номер документа DOCPROPERTY». Использование подстановочных знаков в методе поиска? – skatun

0

Вот рабочий код, не стесняйтесь, чтобы улучшить его:

Sub test() 

    Dim findText As String 
    Dim replaceText As String 
    Dim temp As Variant 

    findText = "Document Number" 
    replaceText = "_DocumentNumber" 

    On Error GoTo doesNotExist 

    temp = ActiveDocument.CustomDocumentProperties(findText).value 

    pFindTxt = "DOCPROPERTY*" & findText 
    pReplaceTxt = "DOCPROPERTY """ & replaceText 

    ActiveWindow.View.ShowFieldCodes = True 

    'create the new variable 
    Call WordProperties.createCustomDocumentProperty(ActiveDocument.name, replaceText, ActiveDocument.CustomDocumentProperties(findText).value) 
    'Iterate through all story types in the current document 
    For Each rngStory In ActiveDocument.StoryRanges 

     'Iterate through all linked stories 
     Do 
      SearchAndReplaceInStory rngStory, pFindTxt, pReplaceTxt 
      On Error Resume Next 
      Select Case rngStory.StoryType 
       Case WdStoryType.wdEvenPagesHeaderStory, _ 
        WdStoryType.wdPrimaryHeaderStory, _ 
        WdStoryType.wdEvenPagesFooterStory, _ 
        WdStoryType.wdPrimaryFooterStory, _ 
        WdStoryType.wdFirstPageHeaderStory, _ 
        WdStoryType.wdFirstPageFooterStory 
        If rngStory.ShapeRange.Count > 0 Then 
         For Each oShp In rngStory.ShapeRange 
          If oShp.TextFrame.HasText Then 
           SearchAndReplaceInStory oShp.TextFrame.TextRange, pFindTxt, pReplaceTxt 
          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 


     ' Refresh fields 
     ActiveDocument.Fields.update 

     ActiveWindow.View.ShowFieldCodes = False 
     Exit Sub 

doesNotExist: 
    MsgBox "CustomVariable " & findText & " does not exist" 
    Exit Sub 


End Sub 

Public Sub SearchAndReplaceInStory(ByVal rngStory As word.Range, ByVal strSearch As String, ByVal strReplace As String) 
    With rngStory.Find 
     .ClearFormatting 
     .Replacement.ClearFormatting 
     .Text = strSearch 
     .Replacement.Text = strReplace 
     .Wrap = wdFindContinue 
     .MatchCase = False 
     .MatchWildcards = True 
     .Execute replace:=wdReplaceAll 
    End With 
End Sub 
Смежные вопросы