TOP - 一覧

デバッグのやり方例

デバッグする際の心構え(作者自身ミスしてびびることがあった内容です)

■マクロ実行前には保存する習慣を付ける

マクロ作成中のブックなどはテスト用だと思うので内容がどうなってもいい状態だとは思いますが
実行前に保存しておくとテストで作ったデータでも戻しやすいと思います。

特にシート指定があるようなマクロを組んでいるとシートの指定を一部のみに行って一部漏れたりすると
思わぬところに思わぬ更新をやってしまうものです。(作者がよくするミス)

UNDOで戻ればいいですがUNDOをoffにしてたりもすると思うので事前に保存しておくという習慣を付けた
ほうが忘れにくいと思います。

■ファイル操作をする場合は作成中は上書き禁止で行いファイル削除は手動で行う

ファイル操作での上書きなどは戻ってこないのでより操作には注意してやってください。
ただ注意はしてもミスするときはします。
一つの方法としてマクロ作成中はファイル書込関数の「上書き有無」の引数はfalse(上書き禁止)にして開発
ファイルの削除は手で削除することをおすすめします。 ちゃんと動くのが確定したら「上書き有無」をtrueに
するという運用を推奨します。

作者のミスの例としてはis_file()でファイルが無ければファイルを作成するという処理を作っていて
最初はフルパスで無い状態で作って正式にフルパスにしたがファイル作成のほうのパスだけ
修正 してis_file()のほうを修正し忘れてました。

// 【間違いのソース、かつマクロ実装中で上書き禁止有無の指定がなかったときの例】
string C_ROOT = "c:\abc\";

// ファイルを作成する関数
void CreateFile(string path)
{
    file_open_crete(union(C_ROOT, path));  // こちらだけフルパスで修正
      :
}

// メイン処理(ファイル名を書いた一覧を調べる処理)
while(nRow <=10)
{
    if(is_file(cell(nRow,1)) == false)  // フルパスにし忘れていた
    {
        CreateFile(cell(nRow,1));
    }
    nRow = nRow + 1;
}



テストのデータなので壊れても問題はないのですがこのミスの仕方をするとファイルがない場合はファイルを書き込むという
処理なのにis_file()側のパスを修正し忘れたため常に新規と判断され既にあるファイルを壊す可能性があったわけです。

このミスをきっかけにfile_open_create()、file_exp()に上書き禁止の引数を追加した経緯があります。
デフォルトもfalseにしてるので確実に問題ないと判断したときに上書き有無のフラグをtrueにするという
風にするほうが安心だなと考えての設計となりました。



どこを動いたかを把握する

■概要

表次郎ではブレイクポイントとか処理の途中で止めたりすることはできません。
どこの処理が実行されたかを知る手段としてfile_log()という関数がVer4.50から用意しました。
仕掛けた場所の変数などの値を書き込むことでログファイルに書き込むことができます。
引数としては3つまで可能ですし、union()で文字列を結合するとかで見やすさは工夫してください。
また、第一引数で"\time"を指定すると処理した日時を返すのでご利用ください。

file_log("\time", "開始");
string strData;
strData = input("メッセージ",50, "");
if(strData == ""){
    file_log("キャンセル");
} else {
    file_log("入力値", strData);
}
file_log("\time", "終了");


実行ファイル直下に「MkHyoEdMcRun.log」ファイルを作ります。
マクロ実行する毎にfile_log()を初回に実行した際に初期化されます。
file_log()が実行されない場合は前のログが残ったままになるので
使用の際は処理の開始にfile_log()を入れておくほうがわかりやすいと思います。
  

表次郎マクロ登録のテキストエディタを使ってさらに外部エディタを指定している場合は
エディタのメニュー[ファイル]-[実行ログを外部エディタで開く]ことで楽にログを開くことが
出来ます。
文字コードはUTF16のBOM有りです。
UTF16なのは変換が不要なので一番早いかなという理由で採用しています。