C#Programmatic访问Excel宏

Jon*_*han 5 c# excel interop

我正在使用Excel文件目录来获取有关每个文件的信息.我正在尝试使用C#Excel interop来收集有关与其中一些文件关联的VBA宏的信息.代码见下文.问题是没有任何excel文件可以编程访问启用的宏.我可以在文件的本地副本上手动切换,但我目前只能读取文件目录.有没有办法在没有写入权限的情况下暂时更改代码中的编程访问设置(读取VBA代码,不进行任何更改)?

另外,我只知道如何手动更改程序访问(通过每个excel文件中的设置).看来我最终可能只需要获得读/写访问权限,有什么方法可以在批处理中执行此操作以节省大量时间手动打开和关闭文件?

        VBA.VBProject project = WorkBook.VBProject;
        VBA.VBComponents VBComponents = project.VBComponents;
        string projectName = project.Name;
        VBA.vbext_ProcKind procedureType = Microsoft.Vbe.Interop.vbext_ProcKind.vbext_pk_Proc;
        VBA.VBComponent vbFunction;

        foreach (Excel.Worksheet sheet in VBComponents)
        {
            vbFunction = sheet as VBA.VBComponent;

            if (vbFunction != null)
            {
                VBA.CodeModule componentCode = vbFunction.CodeModule;
                int componentCodeLines = componentCode.CountOfLines;

                int line = 1;
                while (line < componentCodeLines)
                {
                    //EXAMINE LINE

                    line++;
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

.

编辑:

产生的确切错误消息是"未处理COMException - 不信任对Visual Basic项目的编程访问".

我发现如果我打开其中一个只读文件并更改设置,我会收到不同的错误消息.我无法保存文件,但是如果我将其保留为打开状态,当它到达第一个.xlsm文件时,它会输出错误消息"COMException未处理 - 由于项目受到保护,无法执行操作".

Gar*_*ill 4

“信任对 Visual Basic 项目的访问”设置可以在“受信任的发布者”选项卡上的“工具”->“宏”->“安全”中找到。(这适用于 Excel 2003;对于 2007,可以在 Excel 选项 -> 信任中心 -> 信任中心设置 -> 宏设置中找到)。

它是一个 Excel应用程序设置,适用于用户从该点开始启动的所有 Excel 实例(无论是手动启动还是以编程方式启动)。

您需要确保在 Excel 运行的任何位置都启用此设置(与您正在处理的 Excel 文件的存储位置无关)。

(您不能以编程方式更改此设置 - 这将使其成为完全毫无意义的设置)。


编辑:您现在收到不同的错误:“COMException ...该项目受保护”。

如果 Excel 文件中的 VBA 项目受密码保护(“项目属性”、“保护”选项卡),您将收到此错误。在这种情况下,您需要先解锁项目,然后再尝试打开它。

我已经编写了一些宏来访问受保护项目中的 VBA 代码,但就我而言,我一次只处理一个文件,所以我只是要求用户解锁它并重试。

我不确定如果您知道密码是否可以以编程方式解锁项目(但我很确定如果您不知道密码就不可能)。