Vba 如何将输入的数据保存到宏中,以便下次运行时可以用数据填充输入表单?

Vba 如何将输入的数据保存到宏中,以便下次运行时可以用数据填充输入表单?,vba,ms-word,Vba,Ms Word,宏终止后,我需要将输入Microsoft Word表单的数据保存在VBA中。我有一个表单,大约有40个字段,包括姓名、地址、电话号码等,我不希望用户再次输入所有内容,以防他们意识到自己犯了错误,需要更改一项。当前,宏将删除窗体关闭时输入到窗体中的所有数据 我在论坛和谷歌上到处找了找,但没有找到任何运气 此代码使用命令按钮从word文档调出我的输入表单: Private Sub CommandButton1_Click() InputForm.Show vbModeless End Su

宏终止后,我需要将输入Microsoft Word表单的数据保存在VBA中。我有一个表单,大约有40个字段,包括姓名、地址、电话号码等,我不希望用户再次输入所有内容,以防他们意识到自己犯了错误,需要更改一项。当前,宏将删除窗体关闭时输入到窗体中的所有数据

我在论坛和谷歌上到处找了找,但没有找到任何运气

此代码使用命令按钮从word文档调出我的输入表单:

Private Sub CommandButton1_Click()

    InputForm.Show vbModeless
End Sub
此代码关闭表单:

Private Sub CloseForm_Click()

    Dim Closing As Integer
    Closing = MsgBox("This will exit the form and erase all the data that has been input. You may want to review the documents to ensure they were generated correctly before closing the form. Click Yes to proceed to close the form or No to go back to the form.", vbYesNo + vbQuestion, "Exit Confirmation")
    If Closing = vbYes Then
        Unload InputForm 'This closes the Input Form and returns the user to Word
    End If
End Sub

宏不会将输入的信息保存到表单中。每当它关闭时,所有信息都会被删除;我想保存它。

用于在文档中保存数据的选项

  • Document.Variables
    从很早的时候就在Word中提供了,自Word 2.0(1990年代早期)以来,所有版本都提供了该功能。它只是一个存储与标识符(名称)关联的任意数量的字符串的地方。本质上,是一个键值对。需要注意的重要事项:它必须是一对,不能有没有值的键,值不能是零长度字符串。为名称赋值将创建
    变量
    ;删除该值将删除
    变量
    。这些对用户不可见
  • 例如:

    Document.Variables("Name").Value = "John Doe"
    
    Document.CustomDocumentProperties.Add(Name As String, LinkToContent As Boolean, _
                                          [Type], [Value], [LinkSource]) 
    
  • Document.CustomDocumentProperties
    类似于
    变量
    ,但可以使用字符串以外的数据类型。可以存储的数据长度有限制。用户可以通过“属性”界面看到它们。必须显式创建/销毁它们。我相信这是在Word 97中引入的
  • 例如:

    Document.Variables("Name").Value = "John Doe"
    
    Document.CustomDocumentProperties.Add(Name As String, LinkToContent As Boolean, _
                                          [Type], [Value], [LinkSource]) 
    
  • CustomXMLParts
    这些是保存在docx zip包中的XML“页面”。这是一种保存数据的好方法,并且可以从关闭的文件轻松访问。该功能是在Word 2010中引入的,因此在旧版本或文档文件格式中都不可用,只有docx
  • 编码比
    变量
    属性
    更复杂

    在所描述的场景中,处理此问题的通常方法是在文档中创建CustomXMLPart(或模板-从模板创建的文档应继承CXP)。然后,所有代码都需要从已经可用的xml节点读/写。如果VBA编码人员没有XML解析方面的背景知识,那么学习曲线将变得陡峭

    阅读和写作有很多方法,这里有一个片段演示了阅读的基础知识,让我们了解其中所涉及的内容:

    Sub ReadCXP()
        Dim cxp As Office.CustomXMLPart, CXPs As Office.CustomXMLParts
        Dim doc As Word.Document
        Dim sUri As String
    
        Set doc = ActiveDocument
    
        'object, not collection, because ID is unique and can return only one
        'ID is unique to each CustomXMLPart - this is won't work as it stands!
        Set cxp = doc.CustomXMLParts.SelectByID("{32B20BB8-F4FB-47D6-9DF4-FFAF5A1D8C18}")
    
        Dim xmlNds As Office.CustomXMLNodes
        Dim xmlNd As Office.CustomXMLNode
        Set xmlNds = cxp.SelectSingleNode("trees").ChildNodes
        For Each xmlNd In xmlNds
            Debug.Print xmlNd.XML
        Next
    End Sub
    

    你有没有想过数据应该保存在哪里?我们不知道在使用宏的业务场景中什么是可行的。宏需要通过云服务器访问,因此我希望数据保存在具有打开宏的命令按钮的同一文档中。请记住:如果要“ping”某人,则需要使用@+用户名。例如@Stomper。否则,我们不会收到您已回复的通知。我不知道任何XML解析,因此我更愿意执行选项2,因为我需要保存字符串以外的值,包括复选框。我曾尝试在宏中使用上述代码,但语法似乎不正确,因为VBA无法识别我输入的内容,我可以分辨出来,因为当我键入“Document”时,.CustomDocumentProperties没有显示。我的输入表单名为InputForm,调用InputForm的文档名为InputDocumentMacro。我要保存的变量之一的名称是ClientName,但我还需要保存复选框值,例如POACheck1I。我还需要知道如何在宏再次打开时检索数据。嘿@Stomper:-)您的注释中的请求有点像一个难题-我认为最好在一个新问题中非常精确地表述这一点。在撰写我的答案之前,我争论了很久——最初的问题几乎是“太宽泛”了,不适合这个网站(见附录)。但是这个主题很有用,所以我决定回答这个问题——如何为将来保存数据。但是如果你试图改变这个问题,在这一点上,它肯定变得太宽泛了。。。而你在发布答案后更改问题,哪些网站规则也不允许。。。。。。在写一个新的、更狭隘的问题时,你也有机会展示你尝试过的代码,并提供更准确的细节(a),这将使人们能够写出更好的答案:-)嘿@Cindy Meister,我正在使用第二个选项,但有困难。我的代码是:ActiveDocument.CustomProperties.Add Name:=“ClientName”,LinkToContent:=False,Value:=ClientName,Type:=msoPropertyTypeString有时代码可以工作,有时它会给我以下错误:运行时错误“-2147467259”(8000004005”);自动化错误未指定的错误。我已经检查了试图写入word文档属性部分的变量,它们确实有值。我知道这没什么大不了的,但你能解释一下吗?如果这是一个单独的问题,请告诉我。