MATLABといえばセル配列なのですが、よく使う2次元のセル配列はエクセルのセルとよく似ています。
そしてMATLABにはセル配列をエクセルファイルに変換する関数が備わっているため、MATLABで計算した結果を簡単にエクセルファイルとして出力することが可能です。
エクセルファイルであればMATLABが入っていなくてもエクセルさえあれば誰でも開くことができますし扱いやすいため、MATLABのデータをエクセルに出力することは頻繁にあります。
私が従事しているモデルベース開発の現場でも、例えばSImulinkで作成したモデルの出力信号がどこで使用されているかを調査し、それをエクセルに出力するといった使い方をしています。
とはいえ、エクセルファイルに出力できるといっても以下のように文字列を出力できるだけです。
これでも自分で使う分には特に問題ないかもしれませんが、このまま人様に渡すのは少々躊躇われます。
また、これをツールとしてお客さんに納めるということであれば、ある程度見た目が綺麗なファイルが出力されないとよろしくありません。
そこで今回はMATLABで出力したエクセルの体裁を変更するテクニックを紹介したいと思います。
エクセルファイルを整形するには?
MATLABではActiveXを使用してエクセルの操作が行えるので、こんな感じでMATLABのコードとしてVBAを記載することができます。
xlsobj = actxserver('Excel.Application');
wb = xlsobj.Workbooks.Open("G:\Users\Documents\MATLAB\work\Book1.xlsx");
ws = wb.Sheets
:
:
このようにMATLABエディタ上に整形するためのコードを書くことが可能・・・
なのですが、以下の理由でお勧めしかねます。
- MATLABエディタはVBAを作るためにできていないのでコードを書きにくい
- とにかく重い
特に2は致命的で、僅かの処理であれば耐えられますが、大きなファイルをがっつり整形となるととても使用に耐えられないレベルで重いです。
数分とかではなく数時間というレベルなので現実的ではありません。
MATLABからエクセルのマクロを呼び出す
そこでお勧めしたいのは、マクロが書かれたエクセルファイルを別途準備しておき、MATLABからマクロを呼び出すという方法です。
やはりエクセルのことはエクセルに任せるのが一番です。
マクロの準備
まずエクセルファイルを整形するVBAのマクロを準備します。
VBAには引数も渡すことができるので、MATLABで出力したファイル名を渡して、そのファイルをVBA側でロードすると良いかと思います。
サンプルとして引数で渡されたファイルをオープンし、A1セルを塗りつぶすという超簡単なマクロが書かれたエクセルファイル”macrotest.xlsm”を作成しました。
Sub forming(filename As String)
Dim wb As Workbook
' MATLABで作成したエクセルを開く
Set wb = Workbooks.Open(filename)
' A1セルを赤色に
wb.Sheets(1).Cells(1, 1).Interior.Color = RGB(255, 0, 0)
' 保存して閉じる
Application.DisplayAlerts = False
wb.Save
wb.Close
Set wb = Nothing
Application.DisplayAlerts = True
End Sub
マクロの呼び出し
あとはMATLABのツール側から作成したVBAマクロをキックしてやります。
以下のように記載するだけでOKです。
function forming_excel
% エクセルに出力するセル配列
outputCell = {'AAA'; 'BBB'; 'CCC'; 'DDD'};
% エクセルに出力
xlswrite('Test.xlsx', outputCell)
% マクロが書かれたエクセルファイルを開く
xlsobj = actxserver('Excel.Application');
xlsobj.Workbooks.Open([pwd, '\macrotest.xlsm']);
% マクロ実行
xlsobj.Run('forming', [pwd, '\Test.xlsx']);
% オブジェクトの削除
xlsobj.Quit;
xlsobj.release;
なお、マクロが終わるまでMATLABツールは次の命令を実行しないのでマクロが終わるまで所定時間ウエイトする必要はありません。
実際に動かしてみると以下のようにマクロが実行されたエクセルファイルが出来上がります。
まとめ
MATLABとエクセルマクロの連携について解説しました。
モデルベース開発の現場でもモデルの内容をエクセルファイルに出力したいというニーズは結構ありますので、知っておいて損はないと思います。
それ以外にも様々なシーンで使えるテクニックだと思いますので是非参考にしてみてください。
コメント