24
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

活Excelのススメ?

Posted at

はじめに

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

環境

MATLAB R2020a
Text Analytics Toolbox
MATLAB Compiler

試したこと

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

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

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が立ち上がっている状態でコンパイルを試みるとエラーになった
などなどがありましたが、こちらのエラーと解決策のページに色々とトラブルシューティングが載っているので、ご参考にされると良いかと思います。
どこでエラーになっているのかは「ログファイル」を選択することで確認できます。
image.png

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

まず、解析したいエクセルファイルを開きます。
次に、ターゲットフォルダーの場所にfor_redistribution_files_onlyというフォルダが作成されると思いますので、その中の.xlaファイルを、最初に開いたエクセルファイル上にドラッグ&ドロップします。
image.png
セキュリティ警告のようなボタンが出ましたが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

結果はこちら。
image.png
webを経由するやつも作れるんですね。これは意外と便利かもしれない!

終わりに

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

参考文献

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

24
25
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?