54904
MATLAB のタイマーを使って、プログラムを実行した最後に一度だけ  
excelファイルにデータを書き込もうとしています。

TimerCallback.mとtimer_sample.mを同じフォルダに入れて、timer_sample.mを実行します。  
MATLABは「mac-64bitのバージョンR2017a」です。

以下のエラーメッセージが出て、excelファイルが書き出されず困っています。  
**エラーメッセージ**

```

    >> timer_sample
    Warning: Unable to write to Excel format, attempting to write file to csv format. To write to an Excel file, convert your data to a table and
    use writetable. 
    > In xlswrite (line 179)
      In TimerCallback/callback (line 20)
      In timer_sample>@(varargin)mycallback.callback(varargin{:})
      In timer/timercb (line 34)
      In timercb (line 24) 
    Warning: Unable to write to Excel format, attempting to write file to csv format. To write to an Excel file, convert your data to a table and
    use writetable. 
    > In xlswrite (line 179)
      In TimerCallback/callback (line 21)
      In timer_sample>@(varargin)mycallback.callback(varargin{:})
      In timer/timercb (line 34)
      In timercb (line 24) 
    Callback executed
    
```

TimerCallback.m

```

    classdef TimerCallback < handle
        properties  %public properties
            state;
            x_value;
            y_value;
            filename;
        end
        methods
            %constructor
            function this = TimerCallback(filename)
                if nargin > 0
                    this.filename = filename;
                end
                this.state = true;
            end
    
            %callback function
            function callback(this, ~, ~)
                %consider using writetable instead of xlswrite. At least, use only one xlswrite.
                xlswrite(this.filename, this.x_value, 'sender');
                xlswrite(this.filename, this.y_value, 'receiver');
                this.state = false;
                disp('Callback executed');
            end
        end
    end
    
```

timer_sample.m

```

    mycallback = TimerCallback('data.xlsx');
    mytimer = timer('TimerFcn', @mycallback.callback, 'StartDelay', 30);
    start(mytimer);
    mycallback.x_value = [mycallback.x_value, [1 2 3]];
    mycallback.y_value = [mycallback.y_value, [4 5 6]];
    mycallback.x_value = [mycallback.x_value, [7 8 9]];
    mycallback.y_value = [mycallback.y_value, [10 11 12]];
    %and so on... until the Timer completes
    
```

**試したこと**  
タイマーを使わなければ、以下のプログラムでexcelファイルに問題なく書き出せることは確認しました。

```

    global x_value
    global y_value
    global stat
    stat = true;
    x_value = [x_value [1 2 3]]
    y_value = [y_value [4 5 6]]
    x_value = [x_value [7 8 9]]
    y_value = [y_value [10 11 12]]
    filename = 'data.xlsx';
    x_range = 'sender';
    y_range = 'receiver';
    xlswrite(filename, x_value, x_range) 
    xlswrite(filename, y_value, y_range)
    
```
CC BY-SA 4.0
2019-05-11T13:50:19.613
54899
2019-05-12T01:35:24.850
32568
question
c excel matlab
MATLAB のタイマーを使用して excel ファイルを作成するプログラムのエラー
[xlswriteのオンラインヘルプ](https://jp.mathworks.com/help/matlab/ref/xlswrite.html)によると、下の方に

> ### 制限
>
>   * コンピューターに Windows® 版 Excel が搭載されていない場合、または MATLAB® Online™ を使用している場合、関数
> xlswrite は以下を行います。
>
>     * 配列 A をコンマ区切り値 (CSV) 形式でテキスト ファイルに書き込みます。A は数値行列でなければなりません。
>     * 引数 sheet と引数 xlRange を無視します。
>
> この制限は (通常は Excel インストール環境の一部である) COM サーバーが使用できない場合にも適用されます。
>
>

とあります(回答時点では R2018b のもの)。Macに Windows版の Excelはインストールできない (Boot campで
Windowsをインストールすれば Excelもイントールできますが...) ので、CSVでしか書き出せません。sheetか
xlRange引数をお使いのようですが、それも無視されます。

[writetable](https://jp.mathworks.com/help/matlab/ref/writetable.html)という関数があるようなので、試してみてはどうでしょうか。
CC BY-SA 4.0
2019-05-12T01:35:24.850
54904
2019-05-12T01:35:24.850
3605
54899
answer