PowerShellでExcelのマクロをエクスポートしてみる

| 2012年12月24日月曜日

 ExcelマクロのエクスポートをPowerShellでやってみる。
 マクロのエクスポートをマクロからできたんだからできて当然なんだけど、思ったほど情報がなかったので、ちょっと時間がかかった。
 (前から感じていたけど、もしかして、PowerShellって流行ってないのか…。)

 使い方は、対象のエクセルファイル(hoge.xls)があるフォルダに移動して

 > Export-ExcelMacro.ps1 .\hoge.xls

 すれば、同じフォルダにモジュールがエクスポートされる。
 Join-Pathして絶対パスにしているのは、エクセルのWorkbooks.OpenやExportに渡す時には絶対パスじゃないと動いてくれないため。

Export-ExcelMacro.ps1
  1. param([string]$fileName)  
  2.   
  3. $filePath = Join-Path $pwd $fileName  
  4.   
  5. $excel = New-Object -ComObject Excel.Application  
  6.   
  7. $excel.Workbooks.Open($filePath) | % {  
  8.   $_.VBProject.VBComponents | % {  
  9.     $exportFileName = Join-Path $pwd ($_.Name + ".bas")  
  10.     $_.Export($exportFileName)  
  11.   }  
  12. }  
  13.   
  14. $excel.Quit()  

Excelのマクロをマクロでエクスポートしてみる

|

 ソースコードのバージョン管理をしている環境で、エクセルマクロの開発をしていると、一々マクロをエクスポートをするのが面倒になってきたので、マクロでモジュールをエクスポートできないか調べてみた。
 このSubプロシージャを開発しているエクセルにインポートして、エクスポートする時には、そのソース上で【F5】を押せばいい。そうすると、そのマクロがあるエクセルのフォルダにマクロのモジュールがエクスポートされる。
 Private Subにしているのは、そのまま納品してしまっても間違ってマクロの実行から選択されないようにするためだ。

 もし実行して”実行時エラー '1004':プログラミングによる Visual Basic プロジェクトへのアクセスは信頼性に欠けます”なエラーが表示されたら”Excel 2003 および Excel 2007 で Visual Basic プロジェクトへのアクセスをプログラミングにより許可すると実行時エラーが表示される場合がある”をすれば動くと思う。
  1. Attribute VB_Name = "Export"  
  2. Option Explicit  
  3.   
  4. Sub Export()  
  5.   Dim wb As Object  
  6.   Dim project As Object  
  7.   
  8.   Dim base_path As String  
  9.   Dim export_path As String  
  10.   
  11.   base_path = ActiveWorkbook.path  
  12.   
  13.   For Each wb In Application.Workbooks  
  14.     For Each project In wb.VBProject.VBComponents  
  15.       export_path = base_path & "\" & project.Name & ".bas"  
  16.       project.Export export_path  
  17.     Next  
  18.   Next  
  19. End Sub