【发布时间】:2016-01-13 07:48:54
【问题描述】:
我有一个 Excel 加载项,我想执行以下操作:
- 检查工作簿是否有宏。
- 提示用户是否要启用宏。
- 如果是,请为用户启用宏。
有没有办法在 C# 中启用宏?
【问题讨论】:
标签: c# excel vba excel-addins
我有一个 Excel 加载项,我想执行以下操作:
有没有办法在 C# 中启用宏?
【问题讨论】:
标签: c# excel vba excel-addins
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;
}
【讨论】:
Microsoft.Office.Interop.Excel.Application.AutomationSecurity 属性设置为Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityByUI,“Microsoft Excel 安全通知”对话框会在程序访问工作簿的VBProject 时询问用户是否启用宏。但是,如果用户启用宏,则会抛出System.Runtime.InteropServices.COMException,因此您必须处理它。