使用ContentControls insert LastSavedBy Name, Date and Time information into Word form

Use ContentControls to insert insert LastSavedBy Name, Date and Time information into Word form

我设置了一个包含不同部分的单词表,每个部分由一个人完成。 表单的每个部分都包含使用命名内容控件设置的下拉列表或自由文本字段的组合。 在每个部分的末尾都有供工作人员记录其姓名、日期(日历图标)的字段,以及一个带有关联宏的命令按钮,用于在该部分完成后保存表格并保护数据。 虽然这可以保护数据,但不会阻止 A 填写表格并输入 B 的姓名。请注意,这不是预期的,但出于监管目的需要可追溯性。

我想更新宏以保护这些部分,保存文件(当前工作),然后在保存后立即让宏使用 Microsoft 高级属性直接在手动输入的名称和日期下填充另一个字段上次保存者以及日期和时间。这将确认用户。

我下面的宏 (InsertMSSavedDetails()) 将提取 Microsoft 所需的数据,但前提是我手动单击表单和 运行 宏,然后它保存在我单击表单的任何位置并赢得' 保存到命名的 ContentControl 框。我想自动执行这最后一步,这样它就不会依赖于用户并且数据与特定部分相关联。

我的表单包含以下代码:

Module
Sub ProtectFieldsSections2()
' protects Sections 1 and 2
If MsgBox("Do you want to Lock and Protect this section from further editing?", vbYesNo) = vbNo     
Then Exit Sub
Dim sec As Section
Dim cc As ContentControl

Set sec = ActiveDocument.Sections(2)
For Each cc In sec.Range.ContentControls
cc.LockContents = True
Next cc
End Sub

This document:
Private Sub CommandButton2_Click()
ProtectFieldsSection1
ProtectFieldsSection2
ActiveDocument.Save
End Sub

用于添加 Microsoft 数据的当前代码 - 技术上可行,但不是我需要的方式:

Sub InsertMSSavedDetails()
'
ActiveDocument.SelectContentControlsByTitle ("MSSavedDetails")
    Selection.TypeText Text:="Check data: "
    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _
        "LASTSAVEDBY  ", PreserveFormatting:=True
    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _
        "SAVEDATE  \@ ""d/MM/yyyy h:mm:ss am/pm"" ", PreserveFormatting:=True
End Sub

上面的第二个问题是,当第一次选择 Sub CommandButton2_Click 时,只需要添加一次。如果我要更新 Sub CommandButton2_Click,如果重复保存、插入 Microsoft 数据、保存、插入 Microsoft 数据的循环,我将如何停止?

注意:使用 word 与 PDF 格式。目前,该表格以 word 格式使用,转换为 PDF 并进行电子签名,但这不允许其他人将他们的信息添加到其余部分。 Adobe LiveCycler 已用于设计 PDF 表单,但在维护图像和图形方面存在问题,并且在 Adob​​e reader 中遇到了其他问题,因此选择保留 word。

谢谢。

不确定我是否完全理解了问题,但是

插入字段代码 LASTSAVEDBY 和 SAVEDATE 的问题在于,除非您“锁定”它们,否则它们的值将始终反映最近的保存。此外,如果您希望字段进入内容控件,则必须使用富文本内容控件。

也许更好

  1. 保存文档

  2. 获取基础 属性 值(LASTSAVEDBY 和 SAVEDATE 显示的值)并插入它们

  3. 保存文档

如果您有名为(例如)

的内容控件
Section1LastSavedBy

Section1SaveDate

Section2LastSavedBy

然后

  • 你知道用户点击了哪个命令按钮,所以你知道你正在处理哪个部分

  • 你的代码看起来像

     Private Sub CommandButton2_Click()
     ProtectFieldsSection1
     ProtectFieldsSection2
     With ActiveDocument
       .Save
       .SelectContentControlsByTitle("Section1LastSavedBy")(1).Range.Text = _
         .BuiltinDocumentProperties("Last Author").Value
       .SelectContentControlsByTitle("Section1SaveDate")(1).Range.Text = _
         format(.BuiltinDocumentProperties("Last Save Time").Value,"D/MM/YYYY h:mm:ss am/pm")
       .Save
     End With
    
     End Sub
    

如果您想根据节号以编程方式构建内容控件名称,您可以。

如果您想锁定内容控件以防止进一步编辑,您可以。

不知道你遇到了什么问题:

“上面的第二个问题是,当第一次选择 Sub CommandButton2_Click 时,它只需要添加一次。如果我要更新 Sub CommandButton2_Click,怎么会如果重复保存、插入 Microsoft 数据、保存、插入 Microsoft 数据的循环,我会停止吗?

除非您使用保存事件。如果这是问题所在,我们可以重新讨论该部分。

很难阻止人们篡改 Word 中的数据,但我个人会考虑将这些值的副本保存在自定义 XML 部分(不是 映射到控件)或文档变量 - 也可能对它们进行加密 - 您可以为此使用 Windows 加密 API。

顺便说一句,我怀疑您现有代码的问题是 .SelectContentControlsBYTitle 不是 Select 普通 Word 意义上的控件。它只是 returns 具有该名称的控件集合。