マクロ

簡単な計算や定型動作をマクロを使って実行することができます。

基本動作

 起動時や「マクロの検索」の実行時に「Macro」フォルダがスキャンされ、 「*.cms」ファイルの一覧が「マクロ」メニューに追加されます。 「マクロ」メニューから項目を選ぶと、 対応するCMSファイルからCMBファイルが製作され、実行されます。 CMBファイルは消しても何の問題もありません。 エラー処理は適当なのであまりエラーメッセージは出ずに誤動作します。 重要なファイルに対してはあまり使わないでください。

 「Macro」フォルダ内に「!startup.cms」というファイル名でマクロを置いておくと、 起動時に自動的に実行されます。

文法

 このマクロはC言語/JavaScript言語を簡略化しつつ BASICの影響も受けた独自言語で書かれます。 テキスト形式なのでテキストエディタでCMSファイルを編集してください。
基本的には「関数名(引数,引数…);」か 「変数 = 値;」という形の文の羅列になります。
最後の「;」を忘れないようにしてください。 大文字と小文字は区別されます。

数字

 「0」〜「9」「.」の文字の連続を数字として認識します。  内部的には整数・小数ともdouble型で計算されます。

文字列

 「"」で囲まれた部分を文字列として認識します。 「\」はエスケープシーケンスで、「\"」は「"」を、「\n」は改行(LF)を、 「\t」はタブを、「\\」は「\」を表します。 「\xHH」形式で、文字コード HH の文字を表します。 HH は2桁の16進数(0〜9,A〜F,a〜f)です。

変数

 半角英字で始まる、半角英数字の連続を変数名として認識します。 宣言は不要で、一度作った変数はマクロ終了時まで存在し続けます。 関数以外ではスコープは存在しないので、 同じ名前の変数は常に同じものを表します。

x, y の2つの変数にはマクロ開始時にカーソルの座標がセットされます。 x, y を変更してもカーソル位置は変更されないので、 普通の変数としても使えます。

以下の変数は特別な意味を持ちます。 値を変更するとカーソル位置や選択範囲が変わります。 もちろん値の参照も可能です。
Col
カーソル位置の x 座標
Row
カーソル位置の y 座標
Right
データが何列目まであるか(一番右の空白列は数えない)
Bottom
データが何行目まであるか(一番下の空白行は数えない)
SelLeft
選択範囲の左端の x 座標
SelTop
選択範囲の上端の y 座標
SelRight
選択範囲の右端の x 座標
SelBottom
選択範囲の下端の y 座標

以下の定数・予約語は変数名に使えません。
if else while for For function return true True TRUE false False FALSE null Null NULL MB_ABORTRETRYIGNORE MB_OK MB_OKCANCEL MB_RETRYCANCEL MB_YESNO MB_YESNOCANCEL IDABORT IDCANCEL IDIGNORE IDNO IDOK IDRETRY IDYES

セル操作

val = [x,y];
と書くと y 行 x 列のデータが val に代入されます。逆に
[x,y] = val;
と書くと val の内容が y 行 x 列に書かれます。  以下の表記も可能です。
val = cell(x,y);
cell(x,y) = val;

演算子

 数値に関しては、「+」「-」「*」「/」の四則演算ができます。 整数では「%」で割った余りが求められます。
 変数に対しては、「=」で代入、 「++」で1を足す、「--」で1を引くことができます。 「=」,「++」,「--」は値を返さないので注意してください。
 条件文には以下のブール演算子が使えます。
「==」(等しい)「!=」(等しくない) 「<」「>」「<=」「>=」(数値の大小比較) 「!」(NOT)「&&」(AND)「||」(OR)

組み込み関数

マクロに組み込まれたコマンド・関数と、メニューを実行するものがあります。

コマンド

write(str);
カーソル位置のセルの内容をstrにし、カーソルを右に移動します。
エクスポートマクロ中ではファイルに書き出します。
writeln(str);
カーソル位置のセルの内容をstrにし、カーソルを次の行に移動します。
エクスポートマクロ中ではファイルに書き出します。
move(vx, vy);
カーソル位置を(vx,vy)だけ移動します。
moveto(x,y);
カーソル位置を(x,y)に設定します。
swap(a,b);
a と b の値を交換します。
InsertRow(y);
y 行目に新しい行を挿入します。
DeleteRow(y);
y 行目を削除します。
InsertCol(x);
x 列目に新しい列を挿入します。
DeleteCol(x);
x 列目を削除します。
mid(str1,x,y) = str2;
文字列 str1 の x 文字目から y 文字を str2 に置き換えます。 最初の文字のインデックスは1です。
SetRowHeight(y,h);
y 行目の高さを h に設定します。
SetRowHeight(h);
全ての行の高さを h に設定します。
SetColWidth(x,w);
x 列目の幅を w に設定します。
SetColWidth(w);
全ての列の幅を w に設定します。

関数

cell(x,y) / [x,y]
(x,y)のセルの内容です。読み書きともできます。
max(a,b,...)
引数に渡したもののうち最大の値を返します。
min(a,b,...)
引数に渡したもののうち最小の値を返します。
len(str)
文字列 str の長さを返します。
left(str,x)
文字列 str の最初 x 文字を切り出して返します。
right(str,x)
文字列 str の最後 x 文字を切り出して返します。
mid(str,x,y)
文字列 str の x 文字目から y 文字を切り出して返します。 最初の文字のインデックスは1です。
mid(str,x)
文字列 str の x 文字以降を切り出して返します。 最初の文字のインデックスは1です。
pos(str1,str2)
str1 中の str2 の位置を返します。 最初の文字のインデックスは1です。 str2 が str1 に含まれなかった場合、0が返されます。
replace(str1,str2,str3)
str1 中の str2 を全て str3 に置換した文字列を返します。 元の str1 は変化しません。
GetRowHeight(y)
y 行目の高さを返します。 y を省略すると標準の行の高さが返されます。
GetColWidth(x)
x 列目の幅を返します。 x を省略すると標準の列の幅が返されます。
GetFileName()
編集中のCSVファイルのファイル名を返します。 新規作成中したデータを編集中は空の文字列が返されます。
GetFilePath()
編集中のCSVファイルの絶対パスを返します。 新規作成中したデータを編集中は空の文字列が返されます。 それ以外の場合、必ず「\」で終わる文字列が返されます。
GetYear()
実行時の日付の「年」を返します。4桁の整数が返されます。
GetMonth()
実行時の日付の「月」を返します。1〜12の整数が返されます。
GetDate()
実行時の日付の「日」を返します。1〜31の整数が返されます。
GetHours()
実行時の時間の「時」を返します。0〜23の整数が返されます。
GetMinutes()
実行時の時間の「分」を返します。0〜59の整数が返されます。
GetSeconds()
実行時の時間の「秒」を返します。0〜59の整数が返されます。
random(x)
0以上x未満の整数をランダムに返します。

メッセージボックス

MessageBox 関数はメッセージボックスを表示し、押されたボタンを返します。
MessageBox(str);
str を表示します。OKボタンのみ表示されます。
MessageBox(str, flag);
str を表示します。ボタンの種類を flag で指定します。
MessageBox(str1, str2, flag);
メッセージボックス内に str1 を、タイトルに str2 を表示します。 ボタンの種類を flag で指定します。
flag には以下の定数を使用してください。 MessageBox("test", MB_YESNO); のように、「""」などはつけず直接書いてください。 意味は定数名を見ればだいたいわかるかと思います。 戻り値は押されたボタンによって以下の値が返されます。 これも意味は定数名を見ればだいたいわかるかと思います。

InputBox 関数はインプットボックスを表示し、入力された文字列を返します。
InputBox(str);
str を表示します。 「OK」が押されれば入力された文字列を、 「キャンセル」が押されれば "" を返します。
InputBox(str, def);
str を表示します。 「OK」が押されれば入力された文字列を、 「キャンセル」が押されれば def を返します。
InputBox(str1, str2, def);
インプットボックス内に str1 を、タイトルに str2 を表示します。 「OK」が押されれば入力された文字列を、 「キャンセル」が押されれば def を返します。

メニューコマンド

 キーカスタマイズのデータを保存して、そのcsvファイルを開いてみてください。 2列目の内容の、頭の「mn」を除いたものが関数名になります。
引数を渡すことはできません。「();」だけをつけてください。
これで、メニューのクリック動作を行うことができます。
New();
新規テーブルの作成
CutRow();
1行削除
InsertCellRight();
セルの挿入
Refresh();
列幅を調整して再描画
などです。  ダイアログを開くようなメニューも多いですが、 マクロからはダイアログの入力を行えません。

構文

if(条件){
 ブロック;
}
条件が0以外なら実行されます。
if(条件1){
 ブロック1;
}else if(条件2){
 ブロック2;
}else{
 ブロック3;
}
条件1が0以外ならブロック1が、条件2が0以外ならブロック2が、 そうでなければブロック3が実行されます。
while(条件){
 ブロック;
}
条件が0以外である間実行されます。 一定回数ループを行うと無限ループとみなして処理を中断します。
for(文1;条件;文2){
 ブロック;
}
最初に式1を実行し、条件が0以外である間実行されます。 ループの最後で文2が実行されます。 一定回数ループを行うと無限ループとみなして処理を中断します。
for(x=1; x<=max; x++){
 ブロック;
}
は以下の略記が可能です。
For(x to max){
 ブロック;
}

関数定義

 function 文により、自分で関数を定義することができます。
function 関数名(引数名1, 引数名2,...){
 ...
 return 戻り値;
}
という形になります。
 例えば、次のマクロは x と y の積を表示します。
function mult(x, y){ return x * y; }

MessageBox(mult(x,y));
関数を呼び出す部分は関数を定義した場所より下に置いてください。

 また、上のマクロが「Math.cms」という名前で保存されていれば、 他のファイルからも「Math.mult(x,y)」のように 「ファイル名(パス・拡張子以外).関数名」と書くことにより 利用することが可能です。

コメント

 「//」から行末までと、「/*」から「*/」まではコメントとなります。
// コメント

/*
 * コメント
 */