2016-10-03 78 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)