2010-06-01 85 views
2

有没有人知道如何删除全部 VB代码使用C#形成Excel工作簿? 此代码不起作用。它删除第一个(最后一个)VBComponent,但在第二个上升ArgumentException。如何使用C#从Excel工作表中删除VB代码?

 VBProject project = workbook.VBProject; 
     int componentsCount = project.VBComponents.Count; 

     for (int i = componentsCount; i >= 1; i--) 
     { 
      VBComponent component = project.VBComponents.Item(i); 
      project.VBComponents.Remove(component); 
     } 

有什么建议吗? :)

+0

在VBA中,在收藏物品必须从计数除去1第1步。 – Fionnuala 2010-06-01 11:01:56

回答

5

我在山姆的帮助下解决了这个问题。我怀疑每个Excel工作簿都有一些不可删除的VBComponent,因此我们可以清除它们的内容,而不是删除它们。它现在有效。谢谢萨姆。

  VBProject project = workbook.VBProject; 

     for (int i = project.VBComponents.Count; i >= 1; i--) 
     { 
      VBComponent component = project.VBComponents.Item(i); 
      try 
      { 
       project.VBComponents.Remove(component); 
      } 
      catch(ArgumentException) 
      { 
       continue; 
      } 
     } 

     for (int i = project.VBComponents.Count; i >= 1; i--) 
     { 
      VBComponent component = project.VBComponents.Item(i); 
       component.CodeModule.DeleteLines(1, component.CodeModule.CountOfLines); 
     } 

不要忘记之后保存工作簿:)

2

你试图删除第一个n次:

VBProject project = workbook.VBProject; 
    int componentsCount = project.VBComponents.Count; 

    for (int i = 1; i <= componentsCount; i++) 
    { 
     VBComponent component = project.VBComponents.Item(1); 
     project.VBComponents.Remove(component); 
    } 

你可能需要调整,但我认为VBA集合基于1(可能需要做出project.VBComponents.Item(0)代替

编辑:

我发现this post这也解释了如何做到这一点的VBA,但据推测它不是太难翻译...

+0

是的,我试过了。是的,VB使用基于1的集合,因此如果不调用Remove,代码工作正常。但我仍然得到了ArgumentExcecption。即我可以删除集合中的第4个元素,但不能删除其他元素。我怀疑前3个VBC组件被嵌入(像工作簿中的前三个工作区)并且不能被删除...也许我应该清除它们的内容而不是删除。让我试试:) – 2010-06-01 10:28:17

+1

代码文件是什么样的?它有4个'东西'还是只有一个?在删除了所有可能的东西之后它看起来是什么样的,它是空的吗? (也许在'try catch'块中,这样你就可以在实验时忽略错误) – 2010-06-01 10:34:43

+0

编辑我的答案来添加一些在另一个网站上可能有用的信息......他们似乎使用'On Error Resume Next',所以我怀疑一些元素不可删除 – 2010-06-01 10:39:20

相关问题