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  

jrunscriptでGMailを送信してみる

| 2011年12月15日木曜日

jrunscriptを使ってGMailを送信してみる。

まず、JavaでMailを送信するためのライブラリをダウンロードする。

JavaMail API 1.4.4
http://www.oracle.com/technetwork/java/javamail/index.html

ダウンロードした、”javamail1_4_4.zip”を解凍し、中から”mail.jar”だけ適当な場所にコピーする。

下記のコードのアドレスやパスワードを実際に自分の利用するGMailアドレスに変更して、”mail.jar”をコピーしたフォルダと同じ場所に置き、下記のように実行する。

> jrunscript.exe -cp mail.jar -f SendGMail.js

--- SendGMail.js ---
  1. var user = "送信元アドレス@gmail.com";  
  2. var password = "パスワード";  
  3. var to = "送信先アドレス";  
  4. var subject = "件名";  
  5. var body = "本文";  
  6.   
  7. var props = new java.util.Properties();  
  8. props.put("mail.smtp.host""smtp.gmail.com");  
  9. props.put("mail.smtp.port""587");  
  10. props.put("mail.smtp.auth""true");  
  11. props.put("mail.smtp.starttls.enable""true");  
  12.   
  13. var session = Packages.javax.mail.Session.getInstance(props);  
  14. var mimeMessage = new Packages.javax.mail.internet.MimeMessage(session);  
  15.   
  16. mimeMessage.setFrom(new Packages.javax.mail.internet.InternetAddress(user));  
  17. mimeMessage.setRecipient(Packages.javax.mail.Message.RecipientType.TO, new Packages.javax.mail.internet.InternetAddress(to));  
  18.   
  19. mimeMessage.setSubject(subject, "ISO-2022-JP");  
  20. mimeMessage.setText(body, "ISO-2022-JP");  
  21.   
  22. mimeMessage.setSentDate(new java.util.Date());  
  23.   
  24. var transport = session.getTransport("smtp");  
  25. transport.connect(user, password);  
  26. transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());  

jrunscriptで自作のstaticなクラスメソッドを呼んでみる

| 2011年11月6日日曜日

足し算をするだけのstaticなクラスメソッドをjrunscriptで呼んでみる。

カレントフォルダに下に書いたMyMethod.javaがあるとしてコンパイルしてから、classpathの指定に”.(ピリオド)”でカレントフォルダにパスを通して利用する。

CMD > javac MyMethod.java
CMD > jrunscript -classpath .
js> Packages.MyMethod.add(1, 2);
3
js>

--- MyMethod.java ---
  1. class MyMethod {  
  2.   public static int add(int a, int b) {  
  3.     return (a + b);  
  4.   }  
  5. }  

jrunscriptで複数のClass、複数のJarに同時にパスを通して使う

|

前々回と前回でClassもJarも使えるようになった。
複数のClass、複数のJarを同時に使いたい時もあるので調べてみた。

複数にパスを通すには、”;(セミコロン)”でパスを区切ればいけそうだ。

通すファイルは前々回と前回に作ったClassとJar
ここではカレントフォルダのMy.classとMy.jarにパスを通して使う。

CMD > jrunscript -classpath ".;My.jar"
js> var myClass = new Packages.My("class");
js> myClass.getName();
class
js> var myJar = new Packages.foo.bar.My("jar");
js> myJar.getName();
jar
js>

jrunscriptで自作したJarを使ってみる

|

自分で作ったJarをjrunscriptから使ってみる。
前回書いたClassとの違いはあまりないけど、1つだけ注意が必要。
クラスパスを通すとき、クラスを使う場合は、そのクラスファイルのあるフォルダを指定してパスを通してあげればよかったけど、Jarの場合は使いたいJarファイル自体のパスを引数に渡してやる必要がある。

Jarを作るところから順番に書いていく。

カレントフォルダの下に
foo
└─bar
     └─My.java
があるとして

CMD > javac foo\bar\My.java
CMD > jar cvf My.jar foo\bar\*.class
マニフェストが追加されました。
foo/bar/My.class を追加中です。(入 = 446) (出 = 274)(38% 収縮されました)

CMD > jrunscript -classpath My.jar
js> var my = Packages.foo.bar.My();
js> my.setName("foo");
js> my.getName();
foo
js>

--- My.java ---
  1. package foo.bar;  
  2.   
  3. class My {  
  4.   private String name;  
  5.   
  6.   public String getName() { return this.name; }  
  7.   public void setName(String name) { this.name = name; }  
  8.   
  9.   public My() {  
  10.   }  
  11.   
  12.   public My(String name) {  
  13.     this.name = name;  
  14.   }  
  15. }  

jrunscriptで自作したClassを使ってみる

|

自分で作ったBeansを使えれば既存のJavaコードを利用できるし、Webアプリの一部機能をバッチ化する場合に便利なので試してみた。
Javaの標準クラスを使うサンプルは多かったけど自作クラスを使うのは見当たらなかった。
いくつかのサイトを見て、どうやら使えるらしいということはわかっていたけど、どうやって使ったらいいのかよくわからなかった。
試行錯誤した結果、下の方法でなんとか使えるようになった。

jrunscriptでは自分で書いたクラスを使うには起動時に、使いたいクラスのパスを引数で渡してやる必要があるみたいだ。
jrunscript -classpath に  ”.(ピリオド)” を渡すとカレントフォルダをクラスパスに指定できる。

カレントフォルダにMy.javaがあるとして、My.javaをコンパイルするところから使い方を順番に書いていく。

CMD > javac My.java
CMD > jrunscript -classpath .
js> var my = new Packages.My();
js> my.setName("foo");
js> my.getName();
foo
js> var my2 = new Packages.My("bar");
js> my2.getName();
bar
js>

--- My.java ---
  1. class My {  
  2.   private String name;  
  3.   
  4.   public String getName() { return this.name; }  
  5.   public void setName(String name) { this.name = name; }  
  6.   
  7.   public My() {  
  8.   }  
  9.   
  10.   public My(String name) {  
  11.     this.name = name;  
  12.   }  
  13. }