我正在使用 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(使用前将#替换为@)