【问题标题】:C# Programmatic Access to Excel macrosC# 以编程方式访问 Excel 宏
【发布时间】:2011-08-15 19:03:09
【问题描述】:

我正在使用 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 was unhandled - Programmatic access to Visual Basic Project is nottrusted”。

我后来发现,如果我打开其中一个只读文件并更改设置,我会收到不同的错误消息。我无法保存文件,但如果我让它保持打开状态,当它到达第一个 .xlsm 文件时,它会打印错误消息“COMException was unhandled - can't perform the operation since the project is protected”。

【问题讨论】:

  • 我怀疑你能做到,这听起来像是一个重大的安全风险。
  • 这就是我的预期......我希望我至少可以进行批量更改,假设我有写访问权限......我不想这样做必须通过目录,手动进行所有更改...
  • 您所说的究竟是什么设置?是 信任对 VBA 项目对象模型的访问 设置吗?这是应用程序范围的设置,而不是每个文件的设置。如果您无法更改,您可以编写自己的解析器直接从二进制文件中提取宏对象(这可以在 2-3 天的工作中完成)。
  • @0xA3 “应用程序范围设置”是什么意思?我可以从我的 Excel.Application 对象调用一些函数来进行此更改吗?是的。我说的是“信任对 VBA 项目对象模型设置的访问”。

标签: c# excel interop


【解决方案1】:

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

这是一个 Excel 应用程序设置,适用于用户从那时起启动的所有 Excel 实例(无论是手动启动还是以编程方式启动)。

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

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


编辑:你现在得到一个不同的错误:“COMException ...项目受到保护”。

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

我已经编写了一些宏来访问受保护项目中的 VBA 代码,但在我的情况下,我一次只做一个文件,所以我只是要求用户解锁它并重试.

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

【讨论】:

  • 那么,如何为搜索目录中每个 .xlsm 文件的宏内容的程序启用此设置?在运行程序并更改设置之前,我是否需要物理打开其中一个文件?这甚至适用于只读文件?
  • @Jonathan:“信任访问”设置与文件无关。这是适用于所有文件的应用程序范围的设置。如果您打开 Excel,即使您没有打开任何文件,也可以更改此设置。 Excel 将永远记住该设置(直到您再次更改它)。
  • @Jonathan:相比之下,密码保护设置特定于每个文件,因此您需要在打开每个文件时单独解锁(每次打开它)。我不知道你是否可以通过代码做到这一点。 (我并不是说你不能——我只是从未尝试过)。文件是只读的并不重要,因为您不会通过解锁项目来更改任何内容 - 它只会在您关闭文件之前保持解锁状态。 (另一方面,您可以删除密码保护,在这种情况下,您必须保存更改)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 2010-11-11
相关资源
最近更新 更多