保护单词

时间:2017-10-25 11:15:24

标签: vba ms-word word-vba

我们在Word2016中有几个使用自定义变量的模板,这些变量应该用我的宏更新,以便在用户更改数据时将数据推送到数据库。

不幸的是,我们有一些用户删除了文档中的变量(文本中不在文件属性中),这意味着数据库不会更新。是否有设置使自定义属性无法从文本中删除?

下面列出了一个示例文档的属性 enter image description here

这就是文档中的样子 enter image description here

然后这是有时发生的事情,不应该被允许 enter image description here

通过这样做,我不需要遍历文档来查找变量,因为我可以简单地遍历自定义属性:

Public Sub initializeVariablesFromDB(doc As Document, dokID As String)
    Dim docProp As Object
    Dim rowNumber As Integer

    'Get valid properties
    If CPearson.IsArrayEmpty(Settings.validPropertiesArray) Then
        Settings.validPropertiesArray = Post.helpRequest("xxxxxx?Dok2=1")
    End If

    'We create the docid just in case....
    Call CustomProperties.createCustomDocumentProperty(doc, "_DocumentID", dokID)

    'We loop through all custom properties
    For Each docProp In doc.CustomDocumentProperties
        rowNumber = CPearson.findRownumber(docProp.name, Settings.validPropertiesArray)
        If rowNumber <> -1 Then
            'we clear all SIGN properties...
            If InStr(UCase(docProp.name), "SIGN") > 0 Then
                docProp.value = ""
            End If

            'We check if we should use value from DB
            If Settings.validPropertiesArray(rowNumber, 1) = "0" Or InStr(UCase(docProp.name), "DOCUMENTCREATEDDATE") > 0 _
                Or InStr(UCase(docProp.name), "DOCUMENTCREATOR") > 0 Or InStr(UCase(docProp.name), "DOCUMENTNAME") > 0 Then

                'Update from DB
                Call Post.updateDBFromCustomProperties(docId:=dokID, PropertyName:=docProp.name, whoRules:="dBrules", doc:=doc)

            End If
        End If
    Next docProp
End Sub

对于文本中的_DocumentSubject,这将失败,将收集属性的新值,但不再反映在文本中,因为用户删除了文本中的变量,我可以阻止它吗?

2 个答案:

答案 0 :(得分:1)

您可以将该字段放入内容控件并锁定内容控件。对MS Word了解得足够多的用户仍然可以删除内容控件,但他们需要采取一些相当深思熟虑的步骤(我猜这些人不是问题)。< / p>

可以将正常字段(包括文档属性)添加到内容控件(可能最好使用富文本)。

  

你可以把字段放到内容控件中,好像你不能这样做:( - skatun 10小时前

您完全可以 ,请按以下步骤操作( Word 2010 ):

  1. 将自定义属性添加到新的空白(甚至未保存)文档_SlowLearner
  2. DeveloperTab
  3. 添加 RichText 内容控件
  4. 在内容控件中单击
  5. 插入&gt;快速部件&gt;字段
  6. 过滤字段文档信息&gt;选择 DocProperty
  7. 选择属性:_SlowLearner&gt;行
  8. 注意:当内容控件完全锁定时,该字段受到保护。这有一个奇怪的副作用,内容控制不允许该字段正常更新...为了解决这个问题,您需要向VBA添加更多代码,如下所示:

    Sub UpdateProtectedField()
        With ActiveDocument.ContentControls(1)
            .LockContents = False
            .Range.Fields(1).Update
            .LockContents = True
        End With
    End Sub
    

    Custom Document Property Content Control Properties Insert Field Dialogue Field Protected in Content Control

答案 1 :(得分:0)

一种可能性是使用连续的断面和保护部分,不是理想的解决方案,因为这样的图像无法格式化等等。