簡単な計算や定型動作をマクロを使って実行することができます。
基本動作
起動時や「マクロの検索」の実行時に「Macro」フォルダがスキャンされ、 「*.cms」ファイルの一覧が「マクロ」メニューに追加されます。 「マクロ」メニューから項目を選ぶことで実行できます。 エラー処理は適当なので、ちょっとした間違いで誤動作するかもしれません。 注意して使ってください。
「Macro」フォルダ内に「!startup.cms」というファイル名でマクロを置いておくと、 起動時に自動的に実行されます。 また、「!open.cms」というファイル名でマクロを置いておくと、 ファイルを開いた時に自動的に実行されます。
また、セル内のデータとして「=」に続けて式を書くことで、簡単な表計算も可能です。 この機能を使うには、[表示]-[セル内計算式を処理] をチェックしてください。 セル内計算式内では、変数 x, y でそのセルの座標を取得できます。
文法
このマクロはC言語/JavaScript言語を簡略化しつつ
BASICの影響も受けた独自言語で書かれます。
テキスト形式なのでテキストエディタでCMSファイルを編集してください。
基本的には「関数名(引数,引数…);
」か
「変数 = 値;
」という形の文の羅列になります。
最後の「;」を忘れないようにしてください。
大文字と小文字は区別されます。
数字
「0」〜「9」「.」の文字の連続を数字として認識します。 内部的には整数・小数ともdouble型で計算されます。
文字列
「"」で囲まれた部分を文字列として認識します。 「\」はエスケープシーケンスで、「\"」は「"」を、「\n」は改行を、 「\t」はタブを、「\\」は「\」を表します。 「\xHH」形式で、文字コード HH の文字を表します。 HH は2桁の16進数(0〜9,A〜F,a〜f)です。
保存時の設定に関わらず、セル内改行は「\n」で表されます。
変数
半角英字で始まる、半角英数字の連続を変数名として認識します。 宣言は不要で、一度作った変数はマクロ終了時まで存在し続けます。 関数以外ではスコープは存在しないので、同じ名前の変数は同じものを表します。 関数内は別のスコープとなり、トップレベルの変数も参照できません。
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 です。 全角文字を1文字と数えます。
SetRowHeight(y,h);
- y 行目の高さを h に設定します。
SetRowHeight(h);
- 全ての行の高さを h に設定します。
AdjustRowHeight(y);
- y 行目の高さをセル内容に合わせて最適化します。
SetColWidth(x,w);
- x 列目の幅を w に設定します。
SetColWidth(w);
- 全ての列の幅を w に設定します。
AdjustColWidth(x);
- x 列目の幅をセル内容に合わせて最適化します。
SaveIniSetting();
- 現在の Cassava の状態を設定ファイルに保存します。
LoadIniSetting();
- 前回保存した設定ファイルを読み込み、Cassava の状態を元に戻します。
SetIniSetting(sec,key,val);
- 保存されている設定ファイルを更新し、sec セクションの key キーの値を val にします。 この変更は LoadIniSetting() 実行まで反映されません。
SetFontName(str);
- フォントを str に変更します。
SetFontSize(x);
- フォントサイズを x に変更します。
ShellOpen(filename);
- 指定されたファイルを関連付けられたアプリケーションで開きます。
ShellOpen(appname, filename);
- filename をパラメータとして appname で指定したアプリケーションを実行します。
Open(filename);
- filename を Cassava で読み込みます。
SaveAs(filename);
- 現在開いているファイルを filename に保存します。
SaveAs(filename, type);
- 現在開いているファイルを type で指定した形式で filename に保存します。
Export(filename, type);
- 現在開いているファイルを type で指定した形式で filename にエクスポートします。
関数
cell(x,y) / [x,y]
- (x,y)のセルの内容です。読み書きともできます。
int(x)
- xの値を0方向に丸めた数値を返します。 intの返す値に対して「+」演算子を適用すると加算となります。
double(x)
- xと同じ値の数値を返します。
(x - 0)
と同じ効果です。 doubleの返す値に対して「+」演算子を適用すると加算となります。 str(x)
- xと同じ値の文字列を返します。
(x + "")
と同じ効果です。 strの返す値に対して「+」演算子を適用すると文字列連結となります。 max(a,b,...)
- 引数に渡したもののうち最大の値を返します。
min(a,b,...)
- 引数に渡したもののうち最小の値を返します。
len(str)
- 文字列 str の長さを返します。全角文字を1文字と数えます。
lenB(str)
- 文字列 str の長さを返します。全角文字を2文字と数えます。
left(str,x)
- 文字列 str の最初 x 文字を切り出して返します。全角文字を1文字と数えます。
right(str,x)
- 文字列 str の最後 x 文字を切り出して返します。全角文字を1文字と数えます。
mid(str,x,y)
- 文字列 str の x 文字目から y 文字を切り出して返します。 最初の文字のインデックスは 1 です。 全角文字を1文字と数えます。
mid(str,x)
- 文字列 str の x 文字以降を切り出して返します。 最初の文字のインデックスは 1 です。 全角文字を1文字と数えます。
pos(str1,str2)
- str1 中の str2 の位置を返します。 最初の文字のインデックスは 1 です。 str2 が str1 に含まれなかった場合、 0 が返されます。 全角文字を1文字と数えます。
posB(str1,str2)
- str1 中の str2 の位置を返します。 最初の文字のインデックスは 1 です。 str2 が str1 に含まれなかった場合、 0 が返されます。 全角文字を2文字と数えます。
replace(str1,str2,str3)
- str1 中の str2 を全て str3 に置換した文字列を返します。 元の str1 は変化しません。
asc(str)
- Shift_JIS で str の 1 文字目のコードポイントを返します。
ascW(str)
- Unicode で str の 1 文字目のコードポイントを返します。
chr(x)
- Shift_JIS のコードポイントが x である文字を返します。
chrW(x)
- Unicode のコードポイントが x である文字を返します。
sum(l,t,r,b)
- t行l列からb行r列までの範囲の数値データの合計値を返します。
avr(l,t,r,b)
- t行l列からb行r列までの範囲の数値データの平均値を返します。
random(x)
- 0以上x未満の整数をランダムに返します。
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の整数が返されます。
GetIniSetting(sec,key);
- 保存されている設定ファイルを読み込み、sec セクションの key キーの値を取得します。 この値は設定ファイルに保存された値であり、最新の Cassava の状態とは異なる場合があります。
GetFontName();
- 現在設定されているフォント名を取得します。
GetFontSize();
- 現在設定されているフォントサイズを取得します。
メッセージボックス
MessageBox 関数はメッセージボックスを表示し、押されたボタンを返します。
MessageBox(str);
- str を表示します。OKボタンのみ表示されます。
MessageBox(str, flag);
- str を表示します。ボタンの種類を flag で指定します。
MessageBox(str1, str2, flag);
- メッセージボックス内に str1 を、タイトルに str2 を表示します。 ボタンの種類を flag で指定します。
flag には以下の定数を使用してください。
MessageBox("test", MB_YESNO);
のように、「""」などはつけず直接書いてください。
- MB_ABORTRETRYIGNORE
- MB_OK
- MB_OKCANCEL
- MB_RETRYCANCEL
- MB_YESNO
- MB_YESNOCANCEL
戻り値は押されたボタンによって以下の値が返されます。
- IDABORT
- IDCANCEL
- IDIGNORE
- IDNO
- IDOK
- IDRETRY
- IDYES
InputBox 関数はインプットボックスを表示し、入力された文字列を返します。
InputBox(str);
- str を表示します。 「OK」が押されれば入力された文字列を、 「キャンセル」が押されれば "" を返します。
InputBox(str, def);
- str を表示します。 「OK」が押されれば入力された文字列を、 「キャンセル」が押されれば def を返します。
InputBox(str1, str2, def);
- インプットボックス内に str1 を、タイトルに str2 を表示します。 「OK」が押されれば入力された文字列を、 「キャンセル」が押されれば def を返します。
InputBoxMultiLine 関数は複数行のテキストを入力可能なインプットボックスを表示し、 入力された文字列を返します。
InputBoxMultiLine(str);
- str を表示します。 「OK」が押されれば入力された文字列を、 「キャンセル」が押されれば "" を返します。
InputBoxMultiLine(str, def);
- str を表示します。テキストボックスのデフォルト値は def です。 「OK」が押されれば入力された文字列を、 「キャンセル」が押されれば def を返します。
InputBoxMultiLine(str1, str2, def);
- インプットボックス内に str1 を、タイトルに str2 を表示します。 テキストボックスのデフォルト値は def です。 「OK」が押されれば入力された文字列を、 「キャンセル」が押されれば def を返します。
InputBoxMultiLine(str1, str2, def1, def2);
- インプットボックス内に str1 を、タイトルに str2 を表示します。 テキストボックスのデフォルト値は def2 です。 「OK」が押されれば入力された文字列を、 「キャンセル」が押されれば def1 を返します。
メニューコマンド
キーカスタマイズのデータを保存して、その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)」のように 「ファイル名(パス・拡張子以外).関数名」と書くことにより 利用することが可能です。
組み込み関数と同名の関数定義があった場合、 ユーザー関数が優先的に使用されます。 関数名の前に「::」記号をつけることで明示的に組み込み関数を使用できます。
コメント
「//」から行末までと、「/*」から「*/」まではコメントとなります。
// コメント /* * コメント */
ステータスバー表示
ステータスバーの表示内容はマクロで記述されています。 マクロフォルダ内の !statusbar.cms を編集することで、 ステータスバーの表示を変更できます。
!statusbar.cms は次のような構造をとります。
function init(){ // 初期化コード } // 表示更新用コード
init 関数内の初期化コードは Cassava 起動時に一度だけ実行されます。 関数外の表示更新用コードは、移動時・更新時など、頻繁に実行されます。 表示更新用コードにはあまり時間のかかる処理は記述しないでください。
!statusbar.cms 内では、セルの更新を除くほぼ全てのマクロの機能が使用できます。 また、ステータスバーの表示を取得・更新するため、以下のコマンド・関数が使用できます。 (実際にはこれらの関数も通常のマクロ内で使用できますが、通常マクロ内での使用は推奨しません)
SetStatusBarCount(x)
- ステータスバー内の表示領域の個数を設定します。
SetStatusBarText(x,str)
- x 番目の領域に str を表示します。
SetStatusBarWidth(x,w)
- x 番目の領域の幅を w に設定します。デフォルト値は 50 です。
GetStatusBarCount()
- ステータスバー内の表示領域の個数を取得します。
GetStatusBarText(x)
- x 番目の領域に表示された文字列を取得します。
GetStatusBarWidth(x)
- x 番目の領域の幅を取得します。
ステータスバーの一番左には Cassava 本体が使用する表示領域があります。 この領域の表示内容は自動的に更新されますが、 0 番領域としてアクセスすることで値の取得・上書きをすることができます。
ユーザーマクロフォルダに !statusbar.cms がある場合には、 共有マクロフォルダ内のファイルよりも優先されます。 共有マクロフォルダ内の !statusbar.cms は Cassava 更新時に上書きされるので、 ユーザーマクロフォルダに設置するほうが安全です。