【问题标题】:Adding Macro Code to Word Documents using VB.Net使用 VB.Net 将宏代码添加到 Word 文档
【发布时间】:2016-05-20 02:30:34
【问题描述】:

好的,让我详细解释一下。

假设有一个名为“Word.doc”的word文件

我想做的基本上是使用VB.NET来做以下事情:

打开word文档

添加宏代码

例如

将以下宏代码添加到 Word 文档中

Sub AutoOpen()
    Msgbox 
End Sub

然后保存这个文档。

请记住,我想将宏代码插入到 word 文档中,而不是从文档中检索已经存在的宏代码

【问题讨论】:

  • 有例子,如果你搜索。但是 Office 应用程序的默认安装配置不允许这样做 - 这是一个安全风险。用户必须更改 UI 中的设置。所以这并不是一个真正可靠的方法。
  • 不需要我实现这个东西。改变设置不是问题

标签: vb.net vba insert ms-word


【解决方案1】:

这是一个简单的 VBA 宏,展示了如何使用 Word 对象模型将宏添加到文档(VB.NET 代码几乎相同)。

Sub NewDocWithCode()
    Dim doc As Document

    Set doc = Application.Documents.Add
    doc.VBProject.VBComponents("ThisDocument").CodeModule.AddFromString _
            "Sub AutoOpen()" & vbLf & _
            "   MsgBox ""It works""" & vbLf & _
            "End Sub"
End Sub

请注意,运行此代码需要信任对 VBA 项目对象模型的访问(这需要在 Word 选项的信任中心中启用)。

【讨论】:

    【解决方案2】:

    通过对象模型在 VBA 编辑器中处理对象需要引用 Microsoft Office VBA 可扩展性 5.3 对象模型,您可以在 Visual Studio 的项目/添加引用的 COM 选项卡中找到该模型。

    我喜欢在代码顶部添加 Imports 语句,这样我就不必总是写出完整的命名空间限定:

    Imports VBE = Microsoft.Vbe.Interop
    

    AutoOpen 宏必须是普通代码模块中的“公共”Sub。假设您要在文档中添加新的代码模块,请使用VBComponents.Add 方法并指定枚举类型vbext_ct_StdModule

    默认情况下,VBE 会将新模块命名为“Module#”——一个递增的数字。如果您需要再次以编程方式处理此模块(例如,查看它是否存在),最好为其指定一个名称。

    使用AddFromString 方法将代码作为字符串添加。

    如果您要向文档添加代码,则该文档的类型可能是 docx,这意味着它不能包含宏代码。文档必须具有扩展名docm 才能包含宏代码。所以你可能需要在文档上使用 SaveAs 方法来更改文件类型和名称!

    Private Sub InsVbaCode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles InsVbaCode.Click
        'Helper method to get current Word instance or, if none, start one
        GetWordProcess()
    
        Dim doc As Word.Document = WordApp.ActiveDocument
        Dim vbModule As VBE.VBComponent = doc.VBProject.VBComponents.Add(VBE.vbext_ComponentType.vbext_ct_StdModule)
        vbModule.Name = "basAddedCode"
        vbModule.CodeModule.AddFromString( _
          "Sub AutoOpen()" & vbLf & _
          "   MsgBox ""Document "" & ActiveDocument.FullName & "" has been opened successfully!""" & vbLf & _
          "End Sub")
        'doc.Save() or doc.SaveAs to change file type and/or name
    End Sub
    

    【讨论】:

    • 嗯,我只是无法理解两件事。第一个是 GetWordProcess(),第二个是“WordApp”。你能帮我吗?是否可以在没有开头词的情况下添加宏。当你的意思是 word 的实例时,你是指 word 的程序实例还是打开实际的 Word。请告诉我并帮助我,我对在 .net 中使用宏和单词一无所知。谢谢
    • 这是一个不同的问题,在询问如何将宏添加到 Word 文档之前,您应该知道该怎么做。有大量关于如何从 VB.NET 自动化 Word 应用程序的示例和文档。我建议你做一些基础研究。并阅读 help center 中的 Stack Overflow 指南。这不是免费的代码编写或教程服务!
    • 对不起......我做了一些研究并弄清楚了伙计。非常感谢你,伙计。但是,当我尝试将宏添加到 Microsoft Word 对象中的 ThisDocument 时,它给出了一个未知错误。我使用的代码是Dim vbModule As VBE.VBComponent = doc.VBProject.VBComponents.Add(VBE.vbext_ComponentType.vbext_ct_Document) vbModule.Name = "ThisDocument"
    • 请仔细阅读我的答案。 ThisDocument 是一个特殊的,而不是普通的模块。如果宏应该是 AutoOpen,那么你需要我的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    相关资源
    最近更新 更多