日本のPCユーザーは表計算好きといわれている。ちょっとした計算もExcelを使う人は少なくない。そもそもExcelは、ワークシートの関数、特に一部の初等関数(logなど)や特殊関数(一部のみ)、統計、金融の関数が充実している。
こうした関数を使い慣れてしまうと、コンピュータ言語の標準ライブラリなどの関数に満足できなくなることがある。もちろん、言語なので、関数の定義に従いプログラムで計算をすることは不可能ではない。しかし、数値計算や近似計算では、誤差を小さくするための手法などを駆使する必要があり、忙しいときに自分で書くようなものでもない。
こうしたとき、Excelのワークシート関数をコンピュータ言語から直接呼び出して使う方法がある。Excelのワークシート関数というと、引数にセル範囲が必要で、ワークシートを新規作成して使わねばと思いがちである。
しかし、ワークシート関数のほとんどは、引数に直接値(配列など)を渡すことができるため、ワークシートを読み込むことは必須ではない。ワークシートを読み込まなければ、コンポーネントとしてのExcelの起動時間も短縮され、メモリ消費も少なくなる。
Excelオブジェクトを作る
ここでは、コンピュータ言語の1例としてWindows PowerShellを使う。もちろん自分で好みの言語を使って構わない。必要なのは、COMオブジェクトを生成して扱えることだ。言語自体にCOMオブジェクトを扱う機能はなくとも、標準ライブラリやサードパーティライブラリなどでCOMオブジェクトを扱える言語は少なくない。
また注意が必要なこととして、外部から実行できるワークシート関数は、もともとExcel組み込みのVBA(Visual Basic for Applications)から実行することを想定している。このためVisual BASICの標準関数(sinやconなど)は含まれておらず、これらに関しては、利用言語自前の関数を使う。Windows PowerShellの場合、Mathクラス(https://learn.microsoft.com/ja-jp/dotnet/api/system.math?view=netframework-4.8.1#methods)に登録されている関数を使う。
ExcelなどOfficeアプリケーションは、コンポーネントとして作られており、言語からCOMオブジェクトを作ることでExcelやWordなどの制御が可能になる。
以下のリストは、Windows PowerShellからExcelのワークシート関数を使う基本的なパターンである。
# comオブジェクトの作成
$eobj = New-Object -ComObject Excel.Application;
# WorksheetFunctionオブジェクトを取り出す
$excel = $eobj.WorksheetFunction;
#ワークシート関数の利用
$excel.Average(1,2,3,4,5,6);
#終了処理
$eobj.Quit();
[System.Runtime.Interopservices.Marshal]::FinalReleaseComObject($eobj);

ExcelはCOMコンポーネントとして扱えるので、言語からCOMコンポーネントをオブジェクトとして利用できるなら、Excelを自由に操作できる。ここでは、Excelのワークシート関数を呼び出して使う例を考えている
先頭のCOMオブジェクトを作るところは、言語により表記が異なるが、「Excel.Application」というCOMオブジェクトを生成すればよい。ここでは生成したオブジェクト($eobjに格納されている)から、WorksheetFunctionオブジェクト取り出し$excelという変数に入れておく。
以後は、$excel変数を使ってワークシート関数を呼び出せばよい。この部分は、ほとんどの言語で表現がそれほど異ならないはずだ。オブジェクトのアクセスにドット記法を使う言語は少なくないからである。具体的には、作成したCOMオブジェクトから「Application.WorksheetFunction.<関数名>」を呼び出している。引数は、関数により異なる。
ここで使える<関数名>に関しては、Excelの「WorksheetFunction オブジェクト」のページに記述がある(https://learn.microsoft.com/ja-jp/office/vba/api/excel.worksheetfunction)。
最後に「Application.Quit()」でExcelを終了させたあと、「FinalReleaseComObject」で、メモリ中にあるCOMオブジェクトの参照カウントをゼロにしてメモリから消去する。このようにすることでExcelが実行で使ったメモリをすべて解放できる。
引数の渡し方
Excelのワークシート関数の引数には、「数値」、「真偽値」、「文字列」、「日付データ」、「配列」(行または列範囲。ベクトル)、「行列」(矩形範囲)がある。ただし、多くのワークシート関数の引数は「バリアント型」として定義されているため、その表現は比較的自由にできる。たとえば、数値が必要な引数でも文字列として渡すことも可能だ。
今回、言語として使ったPowerShellは、バリアント型を採用しているわけではないが、文字列や数値といったデータ型の区別がない。
このことを利用すると、関数の引数の与え方は比較的自由だ。たとえば、真偽値の場合、"true"または"false"でも、PowerShellの$true、$falseでもかまわない。あるいは0以外の数値(真を表す)、0(偽を表す)を指定することもできる。日付に関しても、文字列を使ってExcel内で使うような表現でデータを渡すことができる。
$excel.Text($excel.EDate("2025/6/13",1),"yyyy-MM-dd")
Excelでは、日付は内部的にはシリアル値として記録されていることに注意が必要。このため、日付を入力とする関数の結果は、シリアル値になる。
Excelのワークシートでよく使うセル範囲は、行(A1:A5など)または列(A1:E1など)の範囲ならば、PowerShellの配列表現「@(1,2,3,4,5)」が利用できる。ワークシート関数を使うのにワークシートは必須ではないため、関数の引数には、データを直接渡すことができる。
たとえば、直接引数を指定してもいいし、
$excel.average(@(1,2,3,4,5,6,7))
PowerShellの変数を使って
$v=@(1,2,3,4,5,6,7)
$excel.average($v)
とすることもできる。
Excelのワークシート関数でよく使う2次元のセル範囲(A1:E5など)は、2次元配列を使う。
# PowerShellで多次元配列を作る
$m1=New-Object 'int[,]' 2,2;
$m1[0,0]=2 ; $m1[0,1]=2 ; $m1[1,0]=2 ; $m1[1,1]=2
$m2=New-Object 'int[,]' 2,2;
$m2[0,0]=1 ; $m2[0,1]=2 ; $m2[1,0]=3 ; $m2[1,1]=4
$excel.SumSq($m1,$m2);
# ジャグ配列で代用する
$excel.SumSq(@((2,2,2,2),@(1,2,3,4)));
しかし、言語により対応が異なるが、配列を要素とする配列(ジャグ配列。配列の配列。)を使う方が簡単だ。
$excel.SumSq(@((2,2,2),@(1,2,3)))
引数は、一次元配列を表す“@(……)”の各要素が“@(……)になっている。
ワークシート関数では、複素数を扱うこともできる。この場合、Complex関数を使って、複素数を作り、これを複素数関数の引数とするのが通常の方法である。複素数の絶対値を求めるImAbs関数では、以下のようにする。
$c1=$excel.Complex(2,3,"i")
$excel.ImAbs($c1)
しかし、複素数の文字列表現「"2+3i"」を使うこともできる。
$excel.ImAbs("2+3i")
というのもPowerShellでは、Complex関数は文字列を返しているだけだからだ。
数学的な関数のサポートは多くの言語では標準ライブラリを使うが、そのサポート範囲は言語の性格を反映してか、広範なものもあれば、最低限という場合もある。PowerShellはどちらかというと最小限と言える。こうした場合、Excelのワークシート関数を使って、広範な関数を利用することが可能になる。

この連載の記事
-
第490回
PC
WindowsのPowerToysにおけるプレビューハンドラのバグがようやく取れた -
第489回
PC
大きく分けて3種類あるWindowsのライセンス形態 -
第488回
PC
Windowsのサウンド設定をコマンドラインで調べる -
第487回
PC
気づけば随分数が増えているWindowsのファイル属性 -
第485回
PC
Windows Subsystem for Linux(WSL)のソースコードが公開された -
第484回
PC
WindowsのコマンドラインでGrapheme Clusterを正しく扱うには -
第483回
PC
Microsoftが作るコンソールエディタがこの時代に復活 -
第482回
PC
WSL(Windows Subsystem for Linux)向けにFedoraディストリビューション登場 -
第481回
PC
Windows 11にそろそろ聞こえる25H2の声 -
第480回
PC
PowerShellが使う色を変更する - この連載の一覧へ