• Excelの魂

PowerShellを使っていると、数学的関数に力不足を感じることがある。ルートなどの関数は、System.Mathクラスを使うのだが、PowerShell(.NET 7.x)で利用できる関数は48個しかなく、そのうちの1つは2つの数値が等しいことを調べる「equal」関数である(これはMathクラスに含まれていない)。場合によっては、もっと高度な数学関数を使いたくなることがある。Mathクラスの関数があれば、多くの著名な関数を派生させることが可能だが、場合によってはFunctionを定義しなければならないことがある。プログラミングの訓練にはもってこいだが、日常的な利用ではちょっと面倒だ。

こうしたとき、Excelのワークシート関数を使う方法がある。Excelのワークシート関数がカバーする範囲は広く、実績もあるため、安心して使える。Excelのワークシート関数には、最大公約数(GCD関数)や最小公倍数(LCM関数)、順列(Permut関数)、組み合わせ(COMBIN関数)、階乗(FACT関数、GAMMA関数)、平均値(AVERAGE関数)などがある。

具体的には、以下のようにExcelのcomオブジェクトを作り、「WorksheetFunction」クラスから、ワークシート関数を呼び出す(写真01)。関数を呼び出すだけなら、ワークシートは不要で、ブックファイルなどを読み込まないので、New-Objectは、Excelの起動時間のみ。最近のマシンであれば、待たされる感もない。

  • 写真01: New-ObjectでExcelのオブジェクトを作り、Excel.Application.WorksheetFunctionでワークシート関数を実行できる。ワークシートやブックを開く必要はない。FinalReleaseComObjectによるExcelオブジェクトの解放には少し時間が掛かる。FinalReleaseComObject実行直後はプロセスが残ったままになるが、少し待つとExcelのプロセスは終了する


$excel = New-Object -ComObject Excel.Application
$excel.Application.WorksheetFunction.Average(1,2,3,4,5,6)

もう少し関数と引数の指定方法を見てみよう。Average関数のように複数の引数やセル範囲などによる配列を受け付ける関数には、PowerShellの配列を使うこともできる。


$excel.Application.WorksheetFunction.average(@(1,2,3,4,5,6))
$myArray=@(1,2,3,4,5,6)
$excel.Application.WorksheetFunction.average($myArray)

行列を引数とする関数では、PowerShellのジャグ配列(配列を要素に持つ1次元配列)を使うことができる。


$excel.Application.WorksheetFunction.MDeterm(@(@(1,2,3),@(4,5,6),@(7,8,9)))

その他、日付の引数は、文字列で与えることができる。


$excel.Application.WorksheetFunction.Text("2025/1/2",”[$-ja-JP]ggge年m月d日dddd”)

この方法は、ExcelけけのVBAからワークシート関数を利用するものなので、VBAに備わっている関数(たとえばsinやcos)は、対象から外れている。もっとも、sinやcosは、mathクラスにあるので、わざわざExcelの関数を使う必要はない。

利用できる関数に関しては、以下のドキュメントがある。

Visual Basic で使用できるワークシート関数一覧
Excel 関数 (機能別)
WorksheetFunction オブジェクト

作業が終わったら、Excelを終了させる。それには、以下のコードを実行する。


$excel.Application.Quit()

なお、Excelのプロセスが終了するまでには数秒から数10秒の時間がかかるが、コマンド自体はすぐに終了する。インターネットにはReleaseComObjectを使う例もあるようだが、PowerShellからだと、ワークシート関数などの実行で参照カウントが増えることがある。ReleaseComObjectは、参照カウント1つだけしか解放しない。このため、参照カウントが0になるまで、リリース操作を繰り返してくれる「FinalReleaseComObject」を使う。

今回のタイトルネタは、バリントン・J・ベイリーの「ロボットの魂」(創元SF文庫。原題THE SOUL OF THE ROBOT,1974年)である。自らに意識はあるのかと問い続けるロボットの話。アシモフのロボット3原則の枠外にあるロボットSFである。