我发现了如何在运行时插入VBA代码,以及如何删除所有VBA代码" /> 我发现了如何在运行时插入VBA代码,以及如何删除所有VBA代码" /> 我发现了如何在运行时插入VBA代码,以及如何删除所有VBA代码" />

首页 / 知识

关于.net:以编程方式从Word 2007文档中提取宏(VBA)代码

2023-04-14 13:32:00

关于.net:以编程方式从Word 2007文档中提取宏(VBA)代码

Programmatically extract macro (VBA) code from Word 2007 docs

是否可以使用API??从Word 2007 " docm "文档中提取所有VBA代码?

我发现了如何在运行时插入VBA代码,以及如何删除所有VBA代码,但没有将实际代码提取到我可以存储的流或字符串中(以后再插入其他文档中)。铅>

任何技巧或资源将不胜感激。

编辑:感谢所有人,Aardvark的答案正是我所寻找的。我已经将他的代码转换为C#,并能够使用Visual Studio 2008从类库中调用它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using Microsoft.Office.Interop.Word;
using Microsoft.Vbe.Interop;

...

public List<string> GetMacrosFromDoc()
{
    Document doc = GetWordDoc(@"C:\\Temp\\test.docm");

    List<string> macros = new List<string>();

    VBProject prj;
    CodeModule code;
    string composedFile;

    prj = doc.VBProject;
    foreach (VBComponent comp in prj.VBComponents)
    {
        code = comp.CodeModule;

        // Put the name of the code module at the top
        composedFile = comp.Name + Environment.NewLine;

        // Loop through the (1-indexed) lines
        for (int i = 0; i < code.CountOfLines; i++)
        {
            composedFile += code.get_Lines(i + 1, 1) + Environment.NewLine;
        }

        // Add the macro to the list
        macros.Add(composedFile);
    }

    CloseDoc(doc);

    return macros;
}

您可以将代码导出到文件中,然后再读回。

我一直在使用下面的代码来帮助我将某些Excel宏保持在源代码控制下(使用Subversion)


您必须添加对Microsoft Visual Basic for Applications Extensibility 5.3(或您拥有的任何版本)的引用。我的package盒上有VBA SDK等-所以这可能不是Office附带的。

还必须专门启用对VBA对象模型的访问-请参阅Word选项中的"信任中心"。这是Office提供的所有其他其他宏安全设置的补充。

此示例将从其所在的当前文档中提取代码-它本身是VBA宏(还将显示其自身以及任何其他代码)。还有一个Application.vbe.VBProjects集合可访问其他文档。尽管我从未做过,但我假设外部应用程序也可以使用此VBProjects集合打开文件。安全对于这些东西很有趣,因此可能很棘手。

我还想知道docm文件格式现在是什么-像docx这样的XML?那会是更好的方法吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub GetCode()

    Dim prj As VBProject
    Dim comp As VBComponent
    Dim code As CodeModule
    Dim composedFile As String
    Dim i As Integer

    Set prj = ThisDocument.VBProject
        For Each comp In prj.VBComponents
            Set code = comp.CodeModule

            composedFile = comp.Name & vbNewLine

            For i = 1 To code.CountOfLines
                composedFile = composedFile & code.Lines(i, 1) & vbNewLine
            Next

            MsgBox composedFile
        Next

End Sub

文档编程运行删除

最新内容

相关内容

猜你喜欢