2016-10-03 86 views
6

我想要做什么:的PowerShell:删除从Excel VBA模块文件

  • 打开一个Excel文件
  • 动态导入VBA模块和模块
  • 运行功能移除模块

因此,这里是我的PowerShell代码:

$excel = New-Object -ComObject Excel.Application 
$excel.Workbooks.Open($filepath) | Out-Null 
$macro = $excel.ActiveWorkbook.VBProject.VBComponents.Import($MacroFilepath) 
$Excel.ActiveWorkbook.Application.Run("HoursSumCounter.main") | Out-Null 
$excel.ActiveWorkbook.VBProject.VBComponents.Remove($macro) 

(当然,我能访问VBA项目的Excel中的信任中心设置,以便能够导入动态模块)

现在的错误,我得到的是以下几点:

Cannot find an overload for "Remove" and the argument count: "1". 
At line:1 char:1 
+ $excel.ActiveWorkbook.VBProject.VBComponents.Remove($macro) 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodException 
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest 

这整个事情实际上工作,如果我在Excel(无PowerShell)中这样做。

但这里是我发现了什么已经...

我查了删除功能的过载:

[DBG]: PS C:\Users\MUT2BP\Desktop\recefice>> $excel.ActiveWorkbook.VBProject.VBComponents.Remove 

OverloadDefinitions                                           
-------------------                                           
void Remove(Microsoft.Vbe.Interop.VBComponent VBComponent)                                  
void _VBComponents.Remove(Microsoft.Vbe.Interop.VBComponent VBComponent)                              
void _VBComponents_Old.Remove(Microsoft.Vbe.Interop.VBComponent VBComponent) 

原来,我其实应该通过Microsoft.Vbe.Interop.VBComponent VBComponent类型的对象,但我$macro对象的类型System.__ComObject#{eee00921-e393-11d1-bb03-00c04fb6c4a6}

[DBG]: PS C:\Users\MUT2BP\Desktop\recefice>> $macro | Get-Member 


    TypeName: System.__ComObject#{eee00921-e393-11d1-bb03-00c04fb6c4a6} 

Name   MemberType Definition       
----   ---------- ----------       
Activate  Method  void Activate()     
DesignerWindow Method  Window DesignerWindow()   
Export   Method  void Export (string)   
... 

的......即使Remove功能AC在这个OLE自动化过程中,它会返回一个类型VBComponent,它将转换为一个COM对象。

我只是怀疑我必须以某种方式将此COM对象转换为实际的VBComponent对象,我怎么也不能明确地强制转换它。

+0

我不能复制这个 - 你的代码在样本工作簿和模块中工作得很好。 – Comintern

+0

您是否安装了MS Office Developer Tools? – Comintern

+0

@Comintern嗯,我不知道这一点。在添加/删除程序和功能(ctrl面板),我没有看到这样的事情。任何其他我可以验证的地方? – ThomasMX

回答

0

有没有理由不能简单地引用适当的模块? excel不需要附加模块。加载项中的模块&个人工作簿可以在任何工作表上运行。

如果您创建了一个加载项(另存为_另存为,然后在开发人员工具下单击该框将其打开),您可以使用任何您想要的模块即时更新它。

,如果你没有访问开发工具选项卡,可以将模块添加到您的个人工作簿(这是可以自动生成的,当您第一次使用录制宏按钮隐藏的工作簿)做

上面的任何一个你都可以打开一个excel文件,在其上运行代码,然后关闭该文件,而不用尝试以编程方式将模块添加到不支持模块的fike中。

如果您绝对需要附加并删除模块,请尝试以下操作:打开文件,转换为xlsb格式,关闭文件,将文件重命名为.zip,在.zip中添加模块并更新xml路径,重命名为.xlsb ,在excel中打开,运行模块,另存为不支持模块的文件。

0

不得不做最近类似的事情,这是我做到的。

$Code = @' 
your code here 
Make sure this guy is public 
@' 

$Excel = new-object -com Excel.Application 
#Need to change security settings 

New-ItemProperty -Path ` 
"HKCU:\Software\Microsoft\Office\$($Excel.Version)\excel\Security" -Name ` 
AccessVBOM -Value 1 -Force | Out-Null 

New-ItemProperty -Path ` 
"HKCU:\Software\Microsoft\Office\$($Excel.Version)\excel\Security" -Name ` 
VBAWarnings -Value 1 -Force | Out-Null 

$Workbook = $Excel.Workbooks.open("Insert Path to file here",$true) 
$xlModule = $Workbook.VBProject.VBComponents.Add(1) 
$Module = $xlmodule.CodeModule.AddFromString($Code) 
$Excel.Run("Name of Module here, make sure that the sub is public") 
$Workbook.VBProject.VBComponents.Remove($xlmodule) 
$Workbook.Close($True)