Extracting VBA Code from Word 2007 Documents: A Comprehensive Guide

When working with Word 2007 documents, you may find yourself in a situation where you need to extract VBA (Visual Basic for Applications) code from a .docm file programmatically. A common scenario might involve wanting to reuse or modify this code in other documents or applications. Here’s a comprehensive guide to help you through this process.

The Problem: Extracting VBA Code

You may be comfortable inserting and removing code within a Word document, but extracting the actual VBA code into a usable format can be tricky. The good news is that it is indeed possible to accomplish this task, and this guide will walk you through the necessary steps.

Step-by-Step Solution

1. Setting Up Your Environment

Before you can extract the VBA code, you need to ensure that your environment is correctly set up:

  • Add a Reference: Make sure to add a reference to Microsoft Visual Basic for Applications Extensibility 5.3. This is essential for interacting with VBA components in your Word documents.

  • Enable VBA Object Model Access: Go to the Trust Center in the Word options and enable access to the VBA object model. This is crucial for your application to interact with Word’s VBA project.

2. Extracting the Code

Now, let’s dive into the code that allows you to extract the VBA code. Below is a C# implementation to extract all macros from a .docm file.

using Microsoft.Office.Interop.Word;
using Microsoft.Vbe.Interop;
using System.Collections.Generic;

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;

        // Add the name of the code module
        composedFile = comp.Name + Environment.NewLine;

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

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

    CloseDoc(doc);

    return macros;
}

3. Understanding the Code

  • List Initialization: The code initializes a list to hold the extracted macros.

  • Document Access: The GetWordDoc method is used to access a specific Word document.

  • Loop Through Components: The code iterates through each VBComponent in the document’s VBProject, collecting lines of code.

  • Storage of Code: It concatenates each component’s name and lines and stores them in a list for later use.

4. Displaying the Extracted Code

You may want to display the extracted code or store it for future use. You can use message boxes or write it to a new document, depending on how you plan to use the extracted code.

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

This VBA implementation essentially mirrors the C# logic but runs directly within a Word document.

Conclusion

Extracting VBA code from Word 2007 documents can seem daunting at first, but with the right steps, it’s quite manageable. By following the steps outlined above, you can effectively access and repurpose VBA macros as needed. Always remember to ensure your development environment is set up correctly, and don’t hesitate to explore further into the capabilities of both the Word Object Model and the VBA itself.

If you have further questions or need more help, feel free to reach out!