【发布时间】: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 项目对象模型设置的访问”。