首页 > 解决方案 > 来自模板 Application.OrganizerCopy 的 VBA 复制样式不会更新 activedocument.styles(Style.NameLocal) 并列出本地样式

问题描述

我正在尝试拥有一组使用相同格式的 ms-Word 文档(来自文档模板)。
编辑:我使用 [@timothy-rylatt] 和 [@john-korchok] 建议的模板创建文档,但我仍在对模板中的样式进行更新。当我使用样式管理器时,我会看到许多内置样式。当我尝试更新使用模板的文档时,我会从模板vba中复制命名样式列表。

我有两个问题:

  1. 当我使用样式管理器或vba以下样式复制样式时,目标文档中的样式不会更新(至少编号、边框、背景颜色等不会更新)

  2. If我将逐个元素更新样式元素(右缩进,左缩进,编号基本样式,... Then,我只想更新实际存储在目标文档中的样式。下面的第二部分vba列出了样式,但是所有可见样式,而不仅仅是当前文档中的样式。

以单一样式复制的 VBA 代码

它不会更新在目标文档中使用该样式的实例。

Private Sub moveOneStyle(styleName As String, _
        fromFile As String, _
        toFile As String)
'
' moveOneStyle
'  styleName: is the style to copy
'  fromFile: is usually a word template file .dotx or .dotm
'      (open the from file, and then use that fromDoc.FullName)
'  toFile: is usually the Application.ActiveDocument.FullName
'
'
    On Error GoTo record
    Application.OrganizerCopy Source:=fromFile, _
            Destination:=tof, _
            name:=styleName, _
            Object:=wdOrganizerObjectStyles
    GoTo done
record:
    Debug.Print styleName
done:
    'On Error GoTo 0
End Sub

列出当前文档中样式的 VBA 代码

现在,我知道大多数情况下,这将用于检索当前文档、模板或内置(按此顺序)中的任何样式名称,但我不知道如何仅获取当前文档中的那些。请参阅下面的代码以获取here a miracle occurs. 我在寻找奇迹。

Private Sub listAllStyles()
    Dim d As Word.Document
    Dim sty As Word.Style
    Dim styName As Variant
    Dim r As Word.Range
    Dim Inuse As String

   Application.ScreenUpdating = False
    Set d = Application.ActiveDocument
    Set r = d.Range()
    r.Collapse wdCollapseEnd
    On Error Resume Next
    For Each sty In d.Styles
        styName = sty.NameLocal
        On Error GoTo StyError
        ' if sty. is from this document
        ' here a miracle occurs
        If sty.Inuse Then Inuse = "True" Else Inuse = "False"
        r.text = CStr(styName) + " inuse= " + Inuse + vbCrLf
        r.Collapse wdCollapseEnd
        GoTo StyNext
StyError:
        Debug.Print styName
StyNext:
        On Error GoTo 0
    Next sty
    Set d = Nothing
    Set sty = Nothing
    Set r = Nothing
   Application.ScreenUpdating = True
End Sub

标签: vbatemplatesms-word

解决方案


使用 VBA

我找到了一种方法来做我想做的事,从文档模板更新我的样式。

Private Sub linktemplate()
'
' linktemplate Macro
'
'
    With ActiveDocument
        .AttachedTemplate = _
            "C:\Users\XXX\AppData\Roaming\Microsoft\Templates\projectTemplate.dotx"
        .UpdateStylesOnOpen = False
        .UpdateStylesOnOpen = True
        .UpdateStylesOnOpen = False
    End With
End Sub

我使用了 (false, true, false) 的顺序,因为样式会在 false -> 到 true 转换时更新。

注意 Bene (NB)这些步骤只会更新模板中正在使用的样式。

没有 VBA

现在,如果您想在没有 vba 的情况下执行此操作,请访问https://office-watch.com/2018/automatically-update-document-styles-in-microsoft-word/(Office Watch)

引用相关部分:

Microsoft Word 的深处是“自动更新文档 > 样式”选项。那有什么作用以及哪些文件受到影响?

“样式”和“自动”有几个措辞相似的选项,所以让我们明确一点……我们正在谈论文件 | 选项 | 加载项 | 管理 | 模板 | 去 | 模板和加载项 | 模板……我们确实在 Word 中说“深入”。

当你到达那里时看到的屏幕截图

代替 Normal,您可以放置​​您的项目模板。当它说“自动更新文档样式”时,它的意思是模板更新当前的文档样式。

选中更新框,然后取消选中它,否则文档将在您打开文档时不断更新(尽管这可能是您想要的)。


推荐阅读