使用vba更改单词中的CustomDocumentProperties的名称

时间:2016-07-18 08:59:31

标签: vba ms-word word-vba

如何在word中重命名我的customVariable?我有一个名为" Document Number"的Customvaraiable,但我现在想将其重命名为_DocumentNumber"

我知道我可以创建一个新的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

编辑: 问题是find方法没有返回true。

2 个答案:

答案 0 :(得分:1)

你混淆了两件必须分开的东西。

首先使用ActiveDocument.CustomDocumentProperties.Add

创建新的doc属性

您只执行一次,因为doc属性只存在一次。

然后将旧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

然后你可以删除旧的doc属性。

编辑以查找和替换所有部分(包括页眉和页脚),参见
Searching for Text in Header Section of A Word Document

答案 1 :(得分: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