2011-08-15 55 views
5

我正在处理Excel文件的目录以获取有关每个文件的信息。我正在尝试使用C#Excel互操作来收集有关这些文件中某些文件的VBA宏的信息。代码如下。问题是没有一个excel文件可以通过编程访问启用的宏。我可以在文件的本地副本上手动切换,但我目前只能读取文件目录。有没有什么办法可以暂时改变我的代码中的编程访问设置(读取VBA代码,不作任何改变)而没有写权限?C#编程访问Excel宏

此外,我只知道如何手动更改编程访问(通过每个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了未处理 - 到Visual Basic项目的编程访问不受信任”确切的错误信息。

我已经发现,如果我打开其中一个只读文件并更改设置,我会得到不同的错误消息。我无法保存文件,但是如果保持打开状态,当它到达第一个.xlsm文件时,它将显示错误消息“COMException未处理 - 由于项目受到保护,无法执行操作”。

+0

我怀疑你能做到这一点,这听起来像是一个重大的安全风险。 – Mathias

+0

这就是我所预期的......我希望我至少可以批量更改,假设我有写入权限来执行此操作......我不想通过该目录,手动进行所有更改... – Jonathan

+0

您谈论的是什么设置?它是对VBA项目对象模型*设置的* Trust访问权限吗?这是一个应用程序范围的设置,而不是每个文件的设置。如果你不能改变,你可以编写自己的解析器直接从二进制文件中提取宏对象(这可以在2-3天内完成)。 –

回答

4

“信任访问Visual Basic项目”设置可以在工具 - >宏 - >安全,在“受信任的发布者”选项卡中找到。 (这适用于Excel 2003;对于2007,可以在Excel选项 - >信任中心 - >信任中心设置 - >宏设置中找到它。

这是一个Excel的应用设置,并适用于由该点向前用户启动Excel的所有实例(无论是手工还是编程启动)。

您需要确保在Excel正在运行的任何地方启用此设置(与您正在处理的Excel文件的存储位置无关)。

(您无法以编程方式更改此设置 - 这将使其成为完全无意义的设置)。


编辑:你现在正在得到一个不同的错误:“COMException ...项目被保护”。

如果Excel文件中的VBA项目受密码保护(项目属性,保护选项卡),则会出现此错误。在这种情况下,您需要在尝试打开项目之前解锁项目。

我写了一些访问受保护项目中的VBA代码的宏,但在我的情况下,我一次只做一个文件,因此我只是要求用户解锁并尝试再次。

我不知道是否有可能以编程方式解锁项目,如果你知道密码(但我很确定它不可能,如果你不知道)。

+0

那么,我该如何为搜索目录中每个.xlsm文件的宏的内容的程序启用此设置?运行程序之前是否需要物理打开其中一个文件并更改设置?即使只读文件也可以工作吗? – Jonathan

+0

@Jonathan:“信任访问”设置与文件无关。这是适用于所有文件的应用程序范围设置。如果打开Excel,即使没有打开文件,也可以更改此设置。 Excel将永远记住该设置(直到您再次更改它)。 –

+0

@Jonathan:相比之下密码保护设置是具体到每一个文件,所以您需要当你打开它(每次你打开它时)单独解锁每个文件。我不知道你是否可以通过代码来做到这一点。 (我不是说你不能 - 我从来没有尝试过)。这个文件是只读的并不重要,因为你没有通过解锁项目来改变任何东西 - 它只在你关闭文件之前保持解锁状态。 (另一方面,您可以*删除*密码保护,在这种情况下,这将是您必须保存的更改)。 –