好的,让我详细解释一下。
假设有一个名为“Word.doc”的单词文件
我想要做的是基本上使用VB.NET来做以下事情:
打开word文档
添加宏代码
例如
将以下宏代码添加到Word文档
Sub AutoOpen()
Msgbox
End Sub
然后保存此文档。
请记住我想将宏代码插入到Word文档中而不是从文档中检索已存在的宏代码
答案 0 :(得分:0)
这是一个简单的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选项的信任中心中启用)。
答案 1 :(得分:0)
通过对象模型在VBA编辑器中使用对象需要引用Microsoft Office VBA Extensibility 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