簡単な計算や定型動作をマクロを使って実行することができます。
基本動作
「マクロ」メニューにマクロフォルダ内の「*.cms」ファイルの一覧が表示されるので、項目を選ぶことで実行できます。 マクロフォルダにはユーザーマクロフォルダ (C:\Users\(ユーザ名)\AppData\Roaming\Asukaze\Cassava\Macro) と アプリケーションマクロフォルダ(Cassava.exe のあるフォルダ内の「Macro」フォルダ)があり、 どちらに保存したマクロも実行できます。 エラー処理は適当なので、ちょっとした間違いで誤動作するかもしれません。 注意して使ってください。
マクロフォルダ内に「!startup.cms」というファイル名でマクロを置いておくと、 起動時に自動的に実行されます。 また、「!open.cms」というファイル名でマクロを置いておくと、 ファイルを開いた時に自動的に実行されます。
また、セル内のデータとして「=」に続けて式を書くことで、簡単な表計算も可能です。 この機能を使うには、[表示]-[セル内計算式を処理] をチェックしてください。 セル内計算式内では、変数 x, y でそのセルの座標を取得できます。
文法
このマクロは JavaScript 言語風の独自言語で書かれます。
テキスト形式なのでテキストエディタで CMS ファイルを編集してください。
CMS ファイルの文字コードは UTF-8 としてください
(UTF-8 として読み込めないファイルは Shift_JIS として解釈されます)。
マクロファイルの内容は基本的には「関数名(引数,引数…);
」か
「変数 = 値;
」という形の文の羅列になります。
最後の「;」を忘れないようにしてください。
大文字と小文字は区別されます。
簡単なマクロは マクロジェネレーター でも作成できます。
コメント
「//」から行末までと、「/*」から「*/」まではコメントとなります。 コメントはマクロの動作に影響しません。
// コメント /* * コメント */
数値
「0」~「9」「.」の文字の連続を数値として認識します。 内部的には整数・小数ともdouble型で計算されます。
文字列
「"」で囲まれた部分を文字列として認識します。 「\」はエスケープシーケンスで、「\"」は「"」、「\n」は改行、「\r」は復帰、 「\t」はタブ、「\\」は「\」を表します。 また、「\xHH」形式で Shift_JIS で文字コード HH の文字を、 「\uHHHH」形式で Unicode で文字コード HHHH の文字を表します。 HH は2桁の16進数(0~9, A~F, a~f)、HHHH は4桁の16進数です。
セルのデータを読み書きする場合、保存時の設定に関わらずセル内改行は「\n」で表されます。 write() や WriteToFile() 等でのファイルへの直接出力時は 「\n」は LF コード(\x0A)、「\r」は CR コード(\x0D)に対応します。 CR+LF を出力させたい場合にはマクロコード内で改行を「\r\n」に変換してください。
変数
半角英字で始まる、半角英数字の連続を変数名として認識します。 宣言は不要です。 スコープは関数単位で、同じ関数内では同じ名前の変数は同じものを表します。 グローバル変数はなく、関数内から外側のスコープの変数は参照できません。
以下の変数にはマクロ開始時に値がセットされます。 値を変更してもカーソル位置や固定セルは変更されないので、 普通の変数としても使えます。
x
- カーソル位置の x 座標(セル内計算式の場合にはそのセルの座標)
y
- カーソル位置の y 座標(セル内計算式の場合にはそのセルの座標)
Left
- データが何列目から始まるか(固定セルを含まない)
Top
- データが何行目から始まるか(固定セルを含まない)
以下の変数は特別な意味を持ちます。 値を変更するとカーソル位置や選択範囲が変わります。 値の参照も可能です。
Col
- カーソル位置の x 座標
Row
- カーソル位置の y 座標
Right
- データが何列目まであるか(一番右のダミー列は数えない)
Bottom
- データが何行目まであるか(一番下のダミー行は数えない)
SelLeft
- 選択範囲の左端の x 座標
SelTop
- 選択範囲の上端の y 座標
SelRight
- 選択範囲の右端の x 座標
SelBottom
- 選択範囲の下端の y 座標
以下の定数・予約語は変数名に使えません。 true は 1 を、false と null は 0 を表します。
if else while 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)
三項演算子「条件 ? 式1 : 式2」は、条件が真(0以外)の場合式1を、条件が偽(0)の場合式2を評価して返します。
組み込み関数
Cassava Editor の状態を設定・取得する関数や、 文字列処理・数値処理用の関数が組み込み関数として定義されています。
組み込み関数の一覧
組み込み関数の一覧はマクロリファレンスを参照してください。
メッセージボックス
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 を表示します。テキストボックスのデフォルト値は def です。 「OK」が押されると入力された文字列を返します。 「キャンセル」が押されるとマクロを終了します。
InputBox(str1, str2, def);
- インプットボックス内に str1 を、タイトルに str2 を表示します。 「OK」が押されると入力された文字列を返します。 「キャンセル」が押されるとマクロを終了します。
InputBoxMultiLine 関数は複数行のテキストを入力可能なインプットボックスを表示し、 入力された文字列を返します。
InputBoxMultiLine(str);
- str を表示します。 「OK」が押されると入力された文字列を返します。 「キャンセル」が押されるとマクロを終了します。
InputBoxMultiLine(str, def);
- str を表示します。テキストボックスのデフォルト値は def です。 「OK」が押されると入力された文字列を返します。 「キャンセル」が押されるとマクロを終了します。
InputBoxMultiLine(str1, str2, def);
- インプットボックス内に str1 を、タイトルに str2 を表示します。 テキストボックスのデフォルト値は def です。 「OK」が押されると入力された文字列を返します。 「キャンセル」が押されるとマクロを終了します。
メニューコマンド
キーカスタマイズのデータを保存して、そのcsvファイルを開いてみてください。 2列目の内容の、頭の「mn」を除いたものが関数名になります。 引数を渡すことはできません。「();」だけをつけてください。 これで、メニューのクリック動作を行うことができます。
New();
- 新規テーブルの作成
CutRow();
- 1 行削除
InsertCellRight();
- セルの挿入
Refresh();
- 列幅を調整して再描画
制御構文
if (条件) { ブロック; }
条件が真(0以外)なら実行されます。
if (条件1) { ブロック1; } else if (条件2) { ブロック2; } else { ブロック3; }
条件1が真(0以外)なら ブロック1が、条件2が真ならブロック2が、そうでなければブロック3が実行されます。 「else if」は任意の個数記述できます。
while (条件) { ブロック; }
条件が真(0以外)である間実行されます。 ブロック内で「break;」を実行するとループを終了します。 ブロック内で「continue;」を実行すると条件のチェックに戻ります。
for (文1; 条件; 文2) { ブロック; }
最初に文1が実行され、条件が真(0以外)である間ブロック内の処理が実行されます。 ループの最後で文2が実行されます。 ブロック内で「break;」を実行するとループを終了します。 ブロック内で「continue;」を実行すると文2が実行されて条件のチェックに戻ります。
for (変数 of 式) { ブロック; }
式の評価結果が後述のオブジェクトであり、 キーに「length」および 0 から length - 1 までが含まれている場合、 obj[0] から obj[length - 1] までを順に変数に代入し、それぞれブロックを実行します。 ブロック内で「break;」を実行するとループを終了します。 ブロック内で「continue;」を実行すると次の値に進みます。
関数定義
function 文により、自分で関数を定義することができます。
function 関数名(引数名1, 引数名2, ...) { ... return 戻り値; }
という形になります。
例えば、次のマクロは x と y の積を表示します。
function mult(x, y){ return x * y; } MessageBox(mult(x, y));
関数を呼び出す部分は関数を定義した場所より下に置いてください。
戻り値を使用しない場合は return 文は不要です。 また、戻り値を省略して return; のみにもできます。 return 文は関数の最後だけではなく任意の箇所で使用できます。 関数内でなくトップレベルで return 文を実行するとマクロが終了します。
組み込み関数と同名の関数定義があった場合、 ユーザー関数が優先的に使用されます。 関数名の前に「::」記号をつけることで明示的に組み込み関数を使用できます。
最後の引数の前に「...」記号をつけると可変長引数の関数を定義できます。 この場合、「引数名.length」で引数の個数を、「引数名[i]」で i 番目の値を取得できます。
function getSum(...args){ sum = 0; for (i = 0; i < args.length; i++) { sum += args[i]; } return sum; } MessageBox(getSum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
for (変数 of 式) 構文も使用できます。
function getSum(...args){ sum = 0; for (value of args) { sum += value; } return sum; }
オブジェクト
複数の値や関数の集まりをオブジェクトとしてまとめて扱うことができます。 文頭以外で次のように記述するとオブジェクトとして認識されます。
{ キー1: 値1, キー2: 値2, ... }
オブジェクト内の値には「obj.key」もしくは「obj[key]」の形でアクセスできます。 [] を用いる場合、[] 内の計算結果がキーとして扱われます。 関数の引数・戻り値にオブジェクトを渡す場合はポインタ渡しとなり、値の変更は関数外部にも反映されます。 obj が key を含むかどうかは「in」演算子を使って「key in obj」のように調べられます。 これは obj が key を含む場合に true を返します。
次のような構文でクラスを宣言できます。
class クラス名 { constructor() { ... } メソッド名1() { ... } メソッド名2() { ... } ... }
クラスが宣言されている場合、「new クラス名()」でオブジェクトを生成できます。 生成されたオブジェクトはクラスで定義されたメソッドを持ちます。 メソッドは「obj.method()」とすると実行できます。 オブジェクト生成時には constructor が定義されていれば自動的に実行されます。 constructor やメソッド内では「this」という変数でオブジェクト自身を参照できます。
constructor やメソッドは引数を持つことができます。 オブジェクト生成時やメソッド実行時の引数の個数は宣言時と一致している必要があります。 引数の数が異なっても同じ名前のメソッドはオブジェクト内に 1 つしか持てません。
インポート
マクロの先頭で次のように記述すると、他のファイルで定義された関数やクラスを再利用できます。
import { 関数名, クラス名, ... } from "ファイル名.cms";
「ファイル名.cms」はマクロフォルダからの相対パスで、読み込むファイルを指定します。
次のように「as 別名」を付加することで、関数やクラスに別名をつけて読み込むことができます。 別名をつけた場合には元の名前では関数やクラスを参照できません。
import { 元の名前 as 別名 } from "ファイル名.cms";
また、ファイル名から「.cms」を除いた名前が半角英数字のみであり、かつ変数として使われていない場合、 インポートをせずに「ファイル名.関数名()」という形でも他のファイルの関数を実行できます。 この場合、読み込むファイルは拡張子「.cms」でマクロフォルダ直下もしくは「lib」フォルダ内に配置してください。 「ファイル名」部分が変数として使われていた場合はオブジェクトのメソッド呼び出しとなります。 マクロフォルダ直下と「lib」フォルダ内に同名のファイルがある場合、マクロフォルダ直下のファイルが優先されます。
ユーザーマクロフォルダとアプリケーションマクロフォルダに同名のファイルがある場合、 ユーザーマクロフォルダ内のファイルが優先されます。
関数オブジェクト
次の形の式(ラムダ式)で関数オブジェクトを生成できます。 関数オブジェクトは変数に代入したり他の関数の引数として渡したりすることができます。
(引数名1, 引数名2, ...) => { ... return 戻り値; }
関数本体が return 文のみの場合、{} と return を省略して次のように記述できます。
(引数名1, 引数名2, ...) => 戻り値
変数 f に関数オブジェクトが代入されている場合、 通常の関数呼び出しと同じように「f()」の形で関数を実行できます。 このとき引数の個数はラムダ式の引数の個数と一致している必要があります。
ラムダ式の内部からは外側のスコープの変数を参照できます。 ただし、変数の値はラムダ式の評価時にコピーされるため、ラムダ式評価後の変更は反映されません。 また、ラムダ式内で外側のスコープの変数への代入はできません。
フォーマットマクロ
マクロフォルダ内に「!format.cms」という名前のマクロを作成することで、 データの表示の仕方を自由に変更することができます。
セルが再描画される時に x と y が設定された状態でこのマクロが呼ばれます。 差し替えたい内容を return 文で返すと、 実際のデータではなく return 文で返された内容が画面に表示されます。 行番号・列番号に対しても x = 0 および y = 0 としてこのマクロが呼ばれます。 通常のセルについては [x,y] で、行番号と列番号については y や x で対象のデータを取得できます。 「!format.cms」が起動時に存在しなかった場合や、 return 文が実行されなかった場合、 もしくは return 文で空文字 "" が返された場合は通常通りセルの内容が表示されます。
文字列ではなく text、color、background、align を持つオブジェクトを返すことで、 文字色・背景色・配置も指定できます。 text は表示する文字列を表します。 color と background は "#RRGGBB" 形式の文字列で、それぞれ文字色と背景色を表します。 align には "left" または "right" または "center" が指定でき、それぞれ左揃え・右揃え・中央揃えを表します。 キーが省略された場合や値が正しい形式でない場合には標準の値が使われます。
return { text: replace([x,y], " ", "_"), color: "#0000ff", background: "#ffff00", align: "right" };
[x,y] では「セル内計算式を処理」を適用後の結果が返されます。 「数値を右寄せ」はフォーマットマクロで配置が指定されなかった場合、 フォーマットマクロの実行後の文字列に対して適用されます。 「数値を 3 桁区切り表示」、「小数を省略表示」、「URL 文字色」、「検索結果背景色」、選択範囲の色は 常にフォーマットマクロの実行後に適用されます。 フォーマットマクロの実行結果は画面表示と印刷時のみに適用されます。 通常のマクロからはフォーマットマクロの適用結果は参照できません。
ユーザーマクロフォルダに !format.cms がある場合には、 アプリケーションマクロフォルダ内のファイルよりも優先されます。
ステータスバー表示
ステータスバーの表示内容はマクロで記述されています。 マクロフォルダ内の !statusbar.cms を編集することで、 ステータスバーの表示を変更できます。
!statusbar.cms は次のような構造をとります。
function init(){ // 初期化コード } // 表示更新用コード
init 関数内の初期化コードは Cassava 起動時に一度だけ実行されます。 関数外の表示更新用コードは、移動時・更新時など、頻繁に実行されます。 表示更新用コードにはあまり時間のかかる処理は記述しないでください。
!statusbar.cms 内では、セルの更新を除くほぼ全てのマクロの機能が使用できます。 また、ステータスバーの表示を取得・更新するため、以下のコマンド・関数が使用できます。 (実際にはこれらの関数も通常のマクロ内で使用できますが、通常マクロ内での使用は推奨しません)
SetStatusBarCount(x)
- ステータスバー内の表示領域の個数を設定します。
SetStatusBarText(x, str)
- x 番目の領域に str を表示します。
SetStatusBarWidth(x, w)
- x 番目の領域の幅を w に設定します。デフォルト値は 50 です。
SetStatusBarPopUp(x, str, lambda)
- x 番目の領域を右クリックした時に表示されるポップアップメニューを設定します。 str にはポップアップメニューに表示する項目を改行区切りの文字列で指定します。 lambda には引数を 1 つとるラムダ式でメニュー項目がクリックされた時の処理を記述します。 引数にはクリックされた項目が渡されます。 このラムダ式では外側のスコープの変数は参照できません。
GetStatusBarCount()
- ステータスバー内の表示領域の個数を取得します。
GetStatusBarText(x)
- x 番目の領域に表示された文字列を取得します。
GetStatusBarWidth(x)
- x 番目の領域の幅を取得します。
ステータスバーの一番左には Cassava 本体が使用する表示領域があります。 この領域の表示内容は自動的に更新されますが、 0 番領域としてアクセスすることで値の取得・上書きをすることができます。
ユーザーマクロフォルダに !statusbar.cms がある場合には、 アプリケーションマクロフォルダ内のファイルよりも優先されます。