活Excelのススメ？

# はじめに
MATLAB上でとあるExcelファイルを処理しようと思って探していたら、こんなビデオにたどり着きました。
[Getting Started: Excel Add-ins Using MATLAB Compiler](https://jp.mathworks.com/videos/getting-started-excel-add-ins-using-matlab-compiler-100089.html)
Excelの関数（アドイン）をMATLABで作成できるようです。直接的に探していた内容ではないのですが、マクロが苦手な私に朗報だったので早速試してみました。

# 環境
MATLAB R2020a
Text Analytics Toolbox
MATLAB Compiler

# 試したこと

下図のように、Excelの中で使えるmySummarizeという関数を作成しました。（表示されているテキストデータの出典：青空文庫 [陽気な客](https://www.aozora.gr.jp/cards/001869/card57784.html)[1]）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/d1c94212-23aa-6af5-f0c8-749917a12ec3.png)

上記の関数をExcel内で実行することで、こんなワードクラウドが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/991e0aa2-ea1e-8842-fba3-6739bb0a760c.png)

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

【mySummarize関数の処理フロー】

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

　②トークン化
　[tokenizedDocument](https://jp.mathworks.com/help/textanalytics/ref/tokenizeddocument.html)関数を使用しています。

　③句読点の削除、および、ストップワードの削除
　[erasePunctuation](https://jp.mathworks.com/help/textanalytics/ref/tokenizeddocument.erasepunctuation.html)関数と[removeStopWords](https://jp.mathworks.com/help/textanalytics/ref/tokenizeddocument.removestopwords.html)関数を使用。

　④文書のサマリー取得
　[extractSummary](https://jp.mathworks.com/help/textanalytics/ref/extractsummary.html)関数を使用。MATLAB R2020aから新しく出たの機能のようです。

　⑤ワードクラウドの表示
　[wordcloud](https://jp.mathworks.com/help/textanalytics/ref/ldamodel.wordcloud.html)関数を使用。

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

# Excel関数を作成する方法

### １．MATLAB上で関数を記載

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

```matlab
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
```
### ２．ライブラリコンパイラアプリを使ってExcelアドインを作成

こちらのページの[手順](https://jp.mathworks.com/help/compiler/excel/create-an-excel-application-from-matlab-code.html)を参考に、Excelアドインを作成します。

実際に試してみた学びとして、
・MATLAB Runtimeが必要
・Microsoft Visual Studioが必要
　筆者は2017を入れていますが、それ以外のバージョンでもOKだと思います。
・Microsoft Visual Studio 2017 for Use with Intel Compilersなるものが必要
　バージョンは2017でなくてもOKだと思いますが、筆者は2017を入れていたのでこのように記載しています。こちらの[インストラクション](https://software.intel.com/en-us/articles/installing-microsoft-visual-studio-2017-for-use-with-intel-compilers)を参考にしました。
・エクセルのマクロのセキュリティ設定を下げる必要がある
・Excelが立ち上がっている状態でコンパイルを試みるとエラーになった
などなどがありましたが、こちらの[エラーと解決策](https://jp.mathworks.com/help/compiler/excel/errors-and-solutions.html)のページに色々とトラブルシューティングが載っているので、ご参考にされると良いかと思います。
どこでエラーになっているのかは「ログファイル」を選択することで確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/a2ed9eca-5792-e39c-f69b-425f6e91b707.png)

### ３．作成された.xlaファイルをドラッグ＆ドロップ

まず、解析したいエクセルファイルを開きます。
次に、ターゲットフォルダーの場所にfor_redistribution_files_onlyというフォルダが作成されると思いますので、その中の.xlaファイルを、最初に開いたエクセルファイル上にドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/35ac3c21-807f-9d34-2135-d3e349e5d8d6.png)
セキュリティ警告のようなボタンが出ましたがOKを押します。これで、mySummarizeという名前のExcel関数を使えるようになります。

# 応用編

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

以前の自分の[記事](https://qiita.com/aoimidori/items/151cc0a301b938c5bc0f)を応用してmyGoogleTranslate関数を作成。

```matlab
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
```

結果はこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/6ffd14f5-0540-d448-6e2b-826ae94765f4.png)
webを経由するやつも作れるんですね。これは意外と便利かもしれない！



# 終わりに
結構長いことMATLABを使用していましたが、こんな機能あったのかと驚きでした。今回の機能に対応していない[関数のリスト](https://jp.mathworks.com/help/compiler/unsupported-functions.html)がありましたが、こう見ると、結構なんでもコンパイルできそうに見えます。
ExcelとMATLABのいいとこどりができたら良いですね。

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