@stsfrkw (Satoshi Furukawa)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【MATLAB】ActiveXによるファイル形式を指定した保存方法について

解決したいこと

MATLABで、Excelファイルの起動、データ書き込み, 背景色の変更、ファイル保存を
ActiveXを利用してコーディングしています。

csvファイルを 名前を付けて保存する際、
ファイルの種類を Excrel(.xlsx) に指定して保存する方法を教えてください。

発生している問題・エラー

エラー:
Interface.000208DA_0000_0000_C000_000000000046/SaveAs
呼び出しエラー、例外のディスパッチ:
ソース:  Microsoft Excel
説明:  Workbook クラスの SaveAs メソッドが失敗しました。
ヘルプ ファイル:  xlmain11.chm
ヘルプのコンテキスト ID:  0

エラー: Im7_EDM_Datacheck_v2a (line 148)
     t_Workbook.SaveAs(t_filename,'FileFormat', 'xlOpenXMLWorkbook' ); 
 

該当するソースコード

%--------------------------------------------------------------------
% csvファイルを開く
%--------------------------------------------------------------------
ExcelApp = actxserver('Excel.Application');
ExcelApp.Visible = 1;  
t_Workbook = ExcelApp.Workbooks.Open('test.csv');


%--------------------------------------------------------------------
% 処理 
%--------------------------------------------------------------------
% 略

%--------------------------------------------------------------------
% 指定したファイル名で保存する
%--------------------------------------------------------------------
t_filename 'test.xlsx';
t_Workbook.SaveAs(t_filename, 'FileFormat', 'xlOpenXMLWorkbook' );
 
0 likes

2Answer

なんともいえませんが、t_filenameがきちんと定義されていないからな気がします。t_filename'test.xlsx'の間にイコールが必要では?

多分 t_filenameが他の場所で定義されていて存在しないディレクトリや、無効なファイル名が設定されているのではないでしょうか([]:?やempty stringなど)?

追記
t_filename 'test.xls'
は関数t_filenameを引数'text.xls'で呼びだすという文法なので、この行が正常に動作するという事はおそらくどこかでt_filenameという関数が定義されていると思います。すると、

t_Workbook.SaveAs(t_filename,

ここで、ファイル名の代りに関数が渡されるので、エラーを吐きます。

(func inputみたいな構文は昔matlabを6年くらい使っていましたがしりませんでした。。。勉強になりました。でも確かに exit 0;みたいなのをこちょこちょ最後の方に呪文のように書いていたので納得です。)

0Like

Comments

  1. @stsfrkw

    Questioner

    回答ありがとうございます。
    ご指摘の通り、t_filenameと'test.xlsx'の間にイコールが無いのは、単に投稿する際の誤記でした。

    VBAでは、ファイル形式を指定する場合、以下のようにコーディングするようですが、

    ActiveWorkbook.SaveAs Filename:="テスト用", FileFormat:=xlOpenXMLWorkbook

    MATLABにおいて、FileFormatを設定する方法を知りたいです。

    MATLAB関数の中には、引数の他にオプションを設定する場合、
    オプションの Name,Value の引数ペアをコンマ区切りで指定する場合がありますが、
    本件の場合、うまくいきません。
  2. エラーはt_filenameが正しく設定されていないからだと思いますが、まだ同じエラーがでるようでしたら、引数がフォーマットに対応した数字ではなく、ストリングになっているのが問題かと。

    ```
    % エクステンションによってフォーマットを設定する
    switch excelExtension
    case '.xls' %xlExcel8 or xlWorkbookNormal
    xlFormat = -4143;
    case '.xlsb' %xlExcel12
    xlFormat = 50;
    case '.xlsx' %xlOpenXMLWorkbook
    xlFormat = 51;
    case '.xlsm' %xlOpenXMLWorkbookMacroEnabled
    xlFormat = 52;
    otherwise
    xlFormat = -4143;
    end
    t_Workbook.SaveAs(t_filename, xlFormat);
    ```
    こういうことでしょうか?

    フォーマットの番号についての詳細はこちらを参照してください
    https://docs.microsoft.com/en-us/office/vba/api/excel.xlfileformat

    ※昔適当な所からコピペしてきたコードを再コピペした物なので、挙動はあまり保証できません。switch文をif文にする事をオススメします。


    質問用に簡略化されたコードでもテストした後にソースをコピー&ペーストをした方がいいですよ。あとMatlabはバージョンによって挙動が変わる事がままあるので、バージョンものっけた方がいいです。

上の回答のコメントにも書きましたが、同じような壁にあたった人用に、一応回答として投稿しておきます。

% エクステンションによってフォーマットを設定する
excelExtension='xlsx'
switch excelExtension
  case '.xls' %xlExcel8 or xlWorkbookNormal
     xlFormat = -4143;
  case '.xlsb' %xlExcel12
     xlFormat = 50;
  case '.xlsx' %xlOpenXMLWorkbook
     xlFormat = 51;
  case '.xlsm' %xlOpenXMLWorkbookMacroEnabled 
     xlFormat = 52;
  otherwise
     xlFormat = -4143;
end
t_Workbook.SaveAs(t_filename, xlFormat);

フォーマットの番号 (xlFormat) についての詳細はこちらを参照してください
https://docs.microsoft.com/en-us/office/vba/api/excel.xlfileformat

※昔適当な所からコピペしてきたコードを再コピペした物なので、挙動はあまり保証できません。switch文をif文にする事をオススメします。

0Like

Comments

  1. @stsfrkw

    Questioner

    おかげさまで解決できました。
    ご丁寧に回答いただき、ありがとうございました。

Your answer might help someone💌