【问题标题】:Programmatically enable Excel macro in C#在 C# 中以编程方式启用 Excel 宏
【发布时间】:2016-01-13 07:48:54
【问题描述】:

我有一个 Excel 加载项,我想执行以下操作:

  1. 检查工作簿是否有宏。
  2. 提示用户是否要启用宏。
  3. 如果是,请为用户启用宏。

有没有办法在 C# 中启用宏?

【问题讨论】:

    标签: c# excel vba excel-addins


    【解决方案1】:

    This article对你很有帮助。

    根据文章,我将其实现为 WinForm 应用程序,因此我使用MessageBox 提示用户是否要启用宏。

    在执行此操作之前,您必须在“xlsm”工作簿中的 [文件]->[选项]->[信任中心] 中检查“信任对 VBA 项目对象模型的访问”。

    using VBA = Microsoft.Vbe.Interop;
    using Excel = Microsoft.Office.Interop.Excel;
    
    private void ReadExcel()
    {
        string filePath = @"C:\temp\Macro.xlsm";
    
        Microsoft.Office.Interop.Excel.Application appExcel = null;
        Microsoft.Office.Interop.Excel.Workbooks workbooks = null;
        Microsoft.Office.Interop.Excel.Workbook workbook = null;
    
        object oMiss = System.Reflection.Missing.Value;
    
        appExcel = new Microsoft.Office.Interop.Excel.Application();
        appExcel.DisplayAlerts = true;
        appExcel.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityByUI;
        // Make the excel visible
        appExcel.Visible = true;
        workbooks = appExcel.Workbooks;
        workbook = workbooks.Open(filePath, oMiss,
                                  oMiss, oMiss,
                                  oMiss, oMiss,
                                  oMiss, oMiss,
                                  oMiss, oMiss,
                                  oMiss, oMiss,
                                  oMiss, oMiss,
                                  oMiss);
    
        if (workbook.HasVBProject)  // Has macros
        {
            try
            {
                // Show "Microsoft Excel Security Notice" prompt
                var project = workbook.VBProject;
            }
            catch (System.Runtime.InteropServices.COMException comex)
            {
                // Macro is enabled.
            }
        }
    
        workbook.Close(true, oMiss, oMiss);
    
        System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
        workbook = null;
        System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
        workbooks = null;
        appExcel.Quit();
        System.Runtime.InteropServices.Marshal.ReleaseComObject(appExcel);
        appExcel = null;
    }
    

    【讨论】:

    • 您好 jhmt,感谢您的代码!顺便说一句,我不想​​运行宏,而是想在工作簿上启用宏。你知道,就像当你打开一个工作簿时,你有那个黄色栏,你可以点击它来启用宏。我该怎么做?
    • @DhinneshJeevan 然后,我们可以缩短代码:)。如果将Microsoft.Office.Interop.Excel.Application.AutomationSecurity 属性设置为Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityByUI,“Microsoft Excel 安全通知”对话框会在程序访问工作簿的VBProject 时询问用户是否启用宏。但是,如果用户启用宏,则会抛出System.Runtime.InteropServices.COMException,因此您必须处理它。
    • 不错!现在我在加载工作簿时弹出窗口,我可以选择启用/禁用宏。但是我意识到,如果我启用宏,然后保存文件,下次打开文件时仍然会提示我。但是如果我点击一次黄条启用宏,然后保存文件,下次打开就不会提示了。
    • @DhinneshJeevan 如果您希望黄色栏每次都提示您,您必须为您的 Excel 应用程序禁用“受信任的文档”。进入[文件]->[选项]->[信任中心]->[信任中心设置]->[可信文档],勾选“禁用可信文档”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多