c# - 在 C# 中以编程方式启用 Excel 宏

标签 c# excel vba excel-addins

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

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

有什么方法可以在 C# 中启用宏吗?

最佳答案

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;
}

关于c# - 在 C# 中以编程方式启用 Excel 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33138613/

相关文章:

ms-access - 将文件拖放到 Microsoft Access 中

excel - 创建一个复选框,复制它,然后将新的复选框报告到新位置

java - Excel 到文本的转换正确处理公式和空单元格

Excel:如何使用通配符替换文本?

arrays - 如何从另一个数组excel vba的计算中创建一个数组

mysql - Excel Mac 2016,在 VBA 函数内调用时 ListObject 不起作用

c# - 给定一个Path,如何判断它是目录还是文件

c# - 在读取控制台行时在 ESC 上收听

c# - Control.Invoke 输入参数

c# - 正则表达式替换 : Transform pattern with a custom function