C# 以编程方式访问 Excel 宏

2024-04-27

我正在使用 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++;
                }
            }
        }

.

EDIT:

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

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


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

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

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

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


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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 以编程方式访问 Excel 宏 的相关文章

随机推荐

  • 初始化后将 HttpMessageHandler 设置为 HttpClient 的实例

    我想分享一个实例HttpClient在不同的请求之间 幸运的是这个类可以安全地同时使用 但我需要设置HttpMessageHandler对于每个单独的请求 因为它们可能有不同的 ClientCertificates 显然这只能通过构造函数来
  • Angular ngRoute“控制器”声明是否必要?

    阅读了 api 和开发人员指南后 我仍然不明白在给定路由中声明 控制器 所 提供的功能 现在我只是在我的视图中将控制器声明为 ng controller 指令 ngRoute 只是提供一种替代方法吗 为了在代码中明确我的问题 请参见下文 I
  • 如何将服务添加到 .Net 中属性网格的类型描述符上下文中?

    我有一个应用程序 允许用户在设计时选择图像 无论是直接图像还是从图像列表中 到目前为止 一切都很酷 除了这不是发生在 Visual Studio 属性浏览器中 而是发生在作为类型编辑器一部分的属性网格中 我的问题是 图像选择器 实际上是资源
  • RequestContextHolder 是线程安全的吗?

    在我的 Spring JDBC 项目中 我有一个名为DBStuff我用它来连接到数据库并进行简单的数据库操作 这是一个Web项目 有用户 所以自然我使用会话机制 当我需要检索请求数据时DBStuff类 我使用下面这行代码 HttpServl
  • 为什么我们不能在打字稿的类中使用 let 关键字

    我是 TypeScript 新手 我想知道为什么我们不能使用let类内变量声明的关键字 如下所示 提前致谢 class Greeter let greeting string constructor message string this
  • 使用 asyncio 处理超时

    免责声明 这是我第一次尝试asyncio module 我在用着asyncio wait通过以下方式尝试支持等待一组异步任务的所有结果的超时功能 这是一个更大的库的一部分 因此我省略了一些不相关的代码 请注意 该库已经支持提交任务并使用 T
  • 是否可以在控制器外部获取运行时的路线数据?

    我想知道是否有可能以某种方式获取控制器外部的路由值 这是我尝试过的 我也尝试过做 Values projectId 但我仍然得到null RoutePrefix projects public class UsergroupControll
  • 如何使用 ServiceStack JsonSerializer 序列化 ExpandoObject?

    是否可以让 ServiceStack JsonSerializer 将 ExpandoObject 序列化为平面对象而不是字典 大致类似于这样 x xvalue y Date 1313966045485 我正在尝试比较 JSON 序列化Ex
  • .NET 的 BBCode 或 wiki 标记库? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 您最喜欢用于处理以下任一问题的 NET 库是什么 BBCode http en wikipedia org wiki BBCode markup
  • 图标字体的正确字体显示值

    font display https www w3 org TR css fonts 4 font display desc是一个新的 CSS 属性 允许开发人员根据字体加载速度是否足够快来控制字体的呈现方式 已经有几篇文章介绍了 使用 f
  • 如何保证按一定顺序调用的AJAX请求得到相同顺序的响应?

    如何保证按一定顺序调用的AJAX请求得到相同顺序的响应 首先 请记住 服务器本身可能不会按照收到请求的顺序返回响应 想象一下 如果您首先触发一个复杂的 ajax 请求 然后触发一个简单的 ajax 请求 可能引用一些缓存的静态数据 第二个请
  • 如何使用 AndEngine (Android) 移动精灵对象

    我正在使用 andengine 在 android 中开发游戏 我在精灵中放置了一个对象 例如 this mTexture new Texture 32 32 TextureOptions BILINEAR PREMULTIPLYALPHA
  • 在 ubuntu 10 64 位上安装 java 时出错

    EDIT 我添加此注释是为了解释为什么我将这个问题保留在这里 我添加了 Android 作为关键字 我想知道其他人是否尝试过下载代码以及如何解决此问题 我担心如果我问 Ubuntu 他们会建议我使用 OpenJDK 但问题是 有人使用该 S
  • Tkinter:尝试点击离开时窗口闪烁

    我已经尝试这样做有一段时间了 但还没有找到方法 我有一个 tkinter 脚本 当按下按钮时会创建一个弹出窗口 但是 我不希望用户能够从该窗口单击到之前创建的任何窗口 我已经使用 root grab set 进行了此操作 但是没有任何迹象表
  • 如何在 Laravel 5.4 中将 base64 转换为图像?

    我正在 Laravel 5 4 中开发 api 我将收到 Base64 格式的图像 如何在 Laravel 中将 base64 转换为图像 该解决方案将处理所有图像类型 image request gt input image image
  • 将 Spring Boot Web 应用程序与 Pivotal TC Server 结合使用

    我从 Spring Tool Suite 内部将项目重构为 Spring Boot 应用程序 所有文档都展示了如何创建一个带有嵌入式 Tomcat 实例的自包含应用程序 该应用程序可以工作并且很棒 然而在此之前 我有自己的 Maven We
  • 使用 CSS 与使用列和行调整文本区域大小

    使用列和行调整文本区域大小与使用高度和宽度调整文本区域大小有什么区别
  • 如何将变量从一个 PowerShell 脚本加载到另一个?

    我有一个主脚本正在调用其他几个脚本 我需要将其他脚本中的变量加载到主脚本中 以便我可以将它们转储到 html 文件中 我尝试对我正在调用的脚本进行点采购 但这不起作用 或者我做错了什么 任何帮助 将不胜感激 脚本的示例部分 get clus
  • 在弹出窗口中打开 Google Play(如 Vimeo、Wisher、Buzzfeed)- 即时应用

    如何在 Wisher Buzzfeed Vimeo 等弹出窗口中打开 Google Play 我在看谷歌文档 https developer android com distribute marketing tools linking to
  • C# 以编程方式访问 Excel 宏

    我正在使用 Excel 文件的目录来获取有关每个文件的信息 我正在尝试使用 C Excel 互操作来收集有关与其中一些文件关联的 VBA 宏的信息 其代码如下 问题在于 所有 Excel 文件都没有启用对宏的编程访问 我可以在文件的本地副本