我已经设置了一个包含不同部分的单词表单,每个部分由一个单独的人完成。表单的每个部分都包含使用命名内容控件设置的下拉列表或自由文本字段的组合。在每个部分的末尾,都有字段供工作人员记录他们的姓名、日期(日历图标)和一个带有相关宏的命令按钮,以便在该部分完成后保存表单和保护数据。虽然这样可以保护数据,但它并不阻止person A填写表单并输入person 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时,它只需要添加一次。如果我要更新子CommandButton2_Click,如果重复保存、插入Microsoft、保存、插入Microsoft的周期,我将如何停止?
注:使用word与PDF格式。目前,该表格采用word格式,转换为PDF格式,并以电子方式签署,但不允许其他人将其信息添加到其余章节中。Adobe已被用于设计LiveCycler表单,但是在维护图像和图形方面存在问题,而且Adobe还存在其他问题,所以选择保留word。
谢谢。
发布于 2020-09-15 13:43:03
我不确定我是否完全理解这些问题,但是
插入字段代码LASTSAVEDBY和SAVEDATE的问题是,除非您“锁定”它们,否则它们的值总是反映最近的保存。此外,如果希望字段进入内容控件,则必须使用富文本内容控件。
也许更好
如果您的内容控件名为(例如)
Section1LastSavedBy
Section1SaveDate
Section2LastSavedBy等。
然后
的哪个部分。
.SelectContentControlsByTitle("Section1LastSavedBy")(1).Range.Text =_.BuiltinDocumentProperties(“最后一位作者”).Value .SelectContentControlsByTitle("Section1SaveDate")(1).Range.Text =_format(.BuiltinDocumentProperties(“最后一次节省时间”).Value,"D/MM/YYYY h:mm:ss am/pm") .Save结束,以End Sub结束
如果希望以编程方式基于节号构造内容控件名称,则可以。
如果要锁定内容控件以防止进一步编辑,则可以。
我不知道你在这里遇到了什么问题:
上面的第二个问题是,当第一次选择Sub CommandButton2_Click时,它只需要添加一次。如果我要更新CommandButton2_Click,如果重复保存、插入Microsoft数据、保存、插入微软数据的循环,我将如何停止?
除非您使用的是保存事件。如果这就是问题所在,我们可以重新考虑这部分。
很难阻止人们在Word中篡改数据,但就我个人而言,我会考虑将这些值的副本保存在例如自定义XML部件(未映射到控件)或文档变量中--可能还会对它们进行加密--为此您可以使用Windows密码API。
顺便提一句,我怀疑您现有代码的问题是.SelectContentControlsBYTitle没有选择正常意义上的控件。它只返回具有该名称的控件集合。
https://stackoverflow.com/questions/63878294
复制相似问题