[あすかぜ・ねっと]あすかぜ・ねっと自作ソフトCassavaヘルプ > マクロ

マクロ

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

基本動作

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

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

文法

このマクロは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 に設定します。
SetColWidth(x,w);
x 列目の幅を w に設定します。
SetColWidth(w);
全ての列の幅を w に設定します。

関数

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 は変化しません。
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の整数が返されます。

メッセージボックス

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)」のように 「ファイル名(パス・拡張子以外).関数名」と書くことにより 利用することが可能です。

組み込み関数と同名の関数定義があった場合、 ユーザー関数が優先的に使用されます。 関数名の前に「::」記号をつけることで明示的に組み込み関数を使用できます。

コメント

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


// コメント

/* 
 * コメント
 */

Menu


Copyright (C) 2000-2007 asukaze, Some Rights Reserved.
mail (at) asukaze.net