活Excelのススメ?


はじめに

MATLAB上でとあるExcelファイルを処理しようと思って探していたら、こんなビデオにたどり着きました。
Getting Started: Excel Add-ins Using MATLAB Compiler
Excelの関数(アドイン)をMATLABで作成できるようです。直接的に探していた内容ではないのですが、マクロが苦手な私に朗報だったので早速試してみました。

環境

MATLAB R2020a
Text Analytics Toolbox
MATLAB Compiler

試したこと

下図のように、Excelの中で使えるmySummarizeという関数を作成しました。(表示されているテキストデータの出典:青空文庫 陽気な客[1])

上記の関数をExcel内で実行することで、こんなワードクラウドが表示されます。

mySummarize内の処理

後からのセクションで詳しく説明しますが、内部処理はMATLABで記載し、その後ひと手間を加えてExcel関数にしています。今回は返り値がなく、単純に表示をさせる関数を作成してみました。返り値がある関数も作成できるようです。

【mySummarize関数の処理フロー】

 ①データ型のチェック、および、array配列への変換
 Excelのセル1つだけを選択するとchar型、2つ以上を選択するとcell型だったので、それぞれarrayに変換させています。それ以外の型は追いきれなかったので、とりあえず'Unsupported data type'としています。

 ②トークン化
 tokenizedDocument関数を使用しています。

 ③句読点の削除、および、ストップワードの削除
 erasePunctuation関数とremoveStopWords関数を使用。

 ④文書のサマリー取得
 extractSummary関数を使用。MATLAB R2020aから新しく出たの機能のようです。

 ⑤ワードクラウドの表示
 wordcloud関数を使用。

それでは、この後のセクションで、どのようにExcel上の関数を作成したのか、手順をご紹介します。

Excel関数を作成する方法

1.MATLAB上で関数を記載

いつもの要領でMATLAB関数を作成します。このMATLAB関数の名前が、Excel上の関数名になるようです。

function mySummarize(str)
    %MYSUMMARIZE この関数の概要をここに記述
    if isa(str,'cell')
        str = cell2table(str);
        str = table2array(str);
    elseif isa(str,'char')
        str = cellstr(str);
        str = cell2table(str);
        str = table2array(str);
    else
        error('Unsopported data type');
    end
    document = tokenizedDocument(str);
    document = erasePunctuation(document);
    document = removeStopWords(document);
    summary = extractSummary(document);
    figure;
    wordcloud(summary);
end

2.ライブラリコンパイラアプリを使ってExcelアドインを作成

こちらのページの手順を参考に、Excelアドインを作成します。

実際に試してみた学びとして、
・MATLAB Runtimeが必要
・Microsoft Visual Studioが必要
 筆者は2017を入れていますが、それ以外のバージョンでもOKだと思います。
・Microsoft Visual Studio 2017 for Use with Intel Compilersなるものが必要
 バージョンは2017でなくてもOKだと思いますが、筆者は2017を入れていたのでこのように記載しています。こちらのインストラクションを参考にしました。
・エクセルのマクロのセキュリティ設定を下げる必要がある
・Excelが立ち上がっている状態でコンパイルを試みるとエラーになった
などなどがありましたが、こちらのエラーと解決策のページに色々とトラブルシューティングが載っているので、ご参考にされると良いかと思います。
どこでエラーになっているのかは「ログファイル」を選択することで確認できます。

3.作成された.xlaファイルをドラッグ&ドロップ

まず、解析したいエクセルファイルを開きます。
次に、ターゲットフォルダーの場所にfor_redistribution_files_onlyというフォルダが作成されると思いますので、その中の.xlaファイルを、最初に開いたエクセルファイル上にドラッグ&ドロップします。

セキュリティ警告のようなボタンが出ましたがOKを押します。これで、mySummarizeという名前のExcel関数を使えるようになります。

応用編

Google翻訳にアクセスするアプリ

以前の自分の記事を応用してmyGoogleTranslate関数を作成。

function str = myGoogleTranslate(text)
%MYGOOGLETRANSLATE この関数の概要をここに記述
    baseurl = 'https://script.google.com/macros/s/AKfycbweJFfBqKUs5gGNnkV2xwTZtZPptI6ebEhcCU2_JvOmHwM2TCk/exec';

    source = 'ja';
    target = 'en';

    url = [baseurl '?text=' text '&source=' source '&target=' target];
    options = weboptions('Timeout',15); % 任意で設定
    str = webread(url, options);

end

結果はこちら。

webを経由するやつも作れるんですね。これは意外と便利かもしれない!

終わりに

結構長いことMATLABを使用していましたが、こんな機能あったのかと驚きでした。今回の機能に対応していない関数のリストがありましたが、こう見ると、結構なんでもコンパイルできそうに見えます。
ExcelとMATLABのいいとこどりができたら良いですね。

参考文献

[1] 山本周五郎 著 「陽気な客」https://www.aozora.gr.jp/cards/001869/card57784.html