C#编程访问Excel宏

5
我正在使用一个Excel文件目录来获取每个文件的信息。我尝试使用C# Excel互操作性来收集与某些文件关联的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++;
                }
            }
        }

编辑:

产生的确切错误消息是“未处理的COMException - 不信任对Visual Basic项目的程序访问”。

此后,我发现如果打开一个只读文件并更改设置,则会获得不同的错误消息。 我无法保存文件,但如果将其保持打开状态,则在达到第一个.xlsm文件时,它会打印出错误消息“未处理的COMException - 无法执行该操作,因为项目受到保护”。


我怀疑你能做到,那听起来像是一个重大的安全风险。 - Mathias
这正是我预料到的... 我希望我至少可以进行批量更改,假设我有写入权限... 我不想手动遍历目录并逐个进行更改... - Jonathan
你所说的是哪个设置?是指“信任访问VBA项目对象模型”设置吗?这是一个应用程序级别的设置,而不是每个文件的设置。如果您无法更改该设置,您可以编写自己的解析器直接从二进制文件中提取宏对象(这可以在2-3天内完成)。 - Dirk Vollmar
@0xA3 你所说的“应用程序范围设置”是什么意思?我能从我的Excel.Application对象中调用某个函数来进行更改吗?是的,我指的是“信任对VBA项目对象模型的访问设置”。 - Jonathan
1个回答

4
“信任对Visual Basic项目的访问”设置可以在“工具”->“宏”->“安全性”中找到,在“受信任的发布者”选项卡中(这是适用于Excel 2003的;对于2007,可以在Excel选项->“信任中心”->“信任中心设置”->“宏设置”中找到)。
这是一个Excel应用程序设置,适用于用户从那一点开始启动的所有Excel实例(无论是手动启动还是通过编程启动)。
您需要确保在运行Excel的任何地方启用此设置(与正在处理的Excel文件存储位置无关)。
(您无法通过编程更改此设置-这将使其成为完全没有意义的设置)。

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

如果Excel文件中的VBA项目受密码保护(项目属性,保护选项卡),则会出现此错误。在这种情况下,在尝试打开它之前,您需要解锁该项目。

我写了一些访问受保护项目中的VBA代码的宏,但在我的情况下,我一次只处理一个文件,因此我只是要求用户解锁并重试。

我不确定是否可能在知道密码的情况下以编程方式解锁该项目(但我相当确定如果您不知道密码,则无法解锁)。


那么,我该如何为一个程序启用这个设置,以便搜索目录中每个.xlsm文件的宏内容?我需要在运行程序之前物理打开其中一个文件并更改设置吗?即使是只读文件,这也能起作用吗? - Jonathan
@Jonathan:「信任访问」设置与文件无关,它是应用程序范围的设置,适用于所有文件。如果您打开 Excel,即使没有打开任何文件,也可以更改此设置。Excel 将永久记住该设置(直到您再次更改它)。 - Gary McGill
@Jonathan:相比之下,密码保护设置是针对每个文件的,因此每次打开文件时都需要单独解锁每个文件(每次打开文件都要解锁)。我不知道你是否可以通过代码来实现这一点。(我并不是说你不能 - 我只是从未尝试过)。即使文件是只读的,也无所谓,因为解锁项目不会改变任何内容 - 它只会在关闭文件之前保持解锁状态。(另一方面,您可以删除密码保护,这样就需要保存更改)。 - Gary McGill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接