2014年4月24日木曜日

Better VBA としてのPowerShell

まえがき

に、PowerShellからCOM経由でExcelを操作する話が載っていました。サンプルコードを見た感じでは、VBAと大差なくExcelを扱えそうでした。

というわけで、COM経由でOfficeをまともにハンドリングできるのであれば、 ~中略~ Better VBAとして使えそうな気がしたので色々試してみました。

サンプルコード

動作検証がてら、自分がVBAでよく操作するアプリに関するサンプルコードを書いてみました。(サンプルコード自体に意味はないです。)

概要

  • (ブラウザの操作) SeleniumVBAを使ったChrome の操作
    • Googleで「メタ構文」をキーワードに検索
    • 上位5位までの検索結果のページタイトルを取得
  • (Excel の操作)
    • Chromeから取得したページタイトルをセルに書き込み
  • (Word を操作) ExcelとWordの連携
    • Excelのセルの内容を、Word本文に流し込み

コード


動作環境

上記コードの動作には、SeleniumVBAが必要です。
動作確認は、PowerShell 3.0 +Windows7 で行いました。(上位互換性や下位互換性は把握していません。)

PowerShellに関して

Seleniumの使い方

PowerShellでSeleniumを使う方法が、Web上に見当たらなかったのでメモ程度に。

VBA用Wrapperと銘打たれた SeleniumVBA というラッパーがあるのですが、実体はCOMオブジェクト (DLL)なので、PowerShellからNew-Object で呼び出せます。
扱い方は、VBAと同様です(もっといえば、Selenium本家とほぼ同じです)。詳しくは、下記の記事をどうぞ。


なお、少し検証した限りでは、実害はないものの、findElementBy* メソッドのオプション引数を省略できないという問題がありました。謎い。

※ なお、PowerShellでSelenium関連のプロジェクトとしては、Selenium PowerShell eXtensions - Home があるようですが、機能の実装は限定的な上、開発は凍結しているようです。

VBA-erにとって気になりそうなところ

Excelの扱い方に関する差異

基本的に、COM経由でExcelを操作する際、メソッド、プロパティはVBA同様に使えました。基本的にはVBAの知識で十分対応できそうです。

ただし、試した範囲では、以下の差異点が気になりました。
コレクションを扱う際は、以下のように、Itemというプロパティを経由する必要があります。
Worksheets.Item(1) #Worksheets(1)は不可
Cells.Item(1,1) #Cells(1,1)は不可
他にも、Range("A1").Valueではなく、Range("A1").Value2 プロパティという違いがありました(これはC#からExcel操作するときと同じですね)。他にも色々細かな違いはあるかもしれません。ただ、差異点は小さそうなので、VBAと同じ書き方では動かなかったときに、ISEのスクリプトウィンドウで、Get-Memberを使ってメソッド/プロパティを確認するくらいで、十分対応できそうに思います。

VBAと同等の書き心地に

なお、どうしてもVBAと同じアクセス方法がしたいという場合は、下記DLLを使うと、VBAと同様の書式でExcelファイルを操作可能です。
(とはいえ、このDLLが、どの程度オリジナルの機能をカバーできているのかはよくわからないので、書式のためだけに使うのはおすすめできないかも。)

ユーザー権限で実行できるのか

下記オプションを使えば可能でした。
> powershell -executionPolicy RemoteSigned -F hoge.ps1
Set-ExecutionPolicy自体は管理者権限が必要ですが、起動オプションでの実行ポリシー変更はユーザー権限でOKのようです。

所感

WindowsXPのサポートも切れ、公式にサポートされるOS (WindowsVista以降)は、PowerShellが標準で備えられることになりました。
現状のPowerShellは、
  • OS標準で、実行できる
  • OS標準で、開発環境 PowerShell ISE がある
  • スクリプト言語
という点で、実務の現場において、VBAと同レベル(以上)のハンドリングのし易さを備えているように思います。

(記事中では特に触れていませんが)VBAよりもプログラミング言語としてだいぶ現代的なので、ちょっとしたツールは、PowerShellで作ればいいんじゃないのという気がしました。

なんとなくめんどくさそうなイメージがあってPowerShellは避けていたのですが、COMや.NET Frameworkを手軽に扱えるし、ISEと強力なコマンドレットのおかげで開発はお手軽なので、Better VBAとして見ると手軽で良い言語じゃないでしょうか。

できるならVBAには引導を渡したいです。