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

マクロ

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

基本動作

「マクロ」メニューにマクロフォルダ内の「*.cms」ファイルの一覧が表示されるので、項目を選ぶことで実行できます。 マクロフォルダにはユーザーマクロフォルダ (C:\Users\(ユーザ名)\AppData\Roaming\Asukaze\Cassava\Macro) と アプリケーションマクロフォルダ(Cassava.exe のあるフォルダ内の「Macro」フォルダ)があり、 どちらに保存したマクロも実行できます。 エラー処理は適当なので、ちょっとした間違いで誤動作するかもしれません。 注意して使ってください。

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

また、セル内のデータとして「=」に続けて式を書くことで、簡単な表計算も可能です。 この機能を使うには、[表示]-[セル内計算式を処理] をチェックしてください。 セル内計算式内では、変数 x, y でそのセルの座標を取得できます。

文法

このマクロは JavaScript 言語風の独自言語で書かれます。 テキスト形式なのでテキストエディタで CMS ファイルを編集してください。 CMS ファイルの文字コードは Shift_JIS もしくは BOM つきの UTF-8 としてください。 マクロファイルの内容は基本的には「関数名(引数,引数…);」か 「変数 = 値;」という形の文の羅列になります。 最後の「;」を忘れないようにしてください。 大文字と小文字は区別されます。

コメント

「//」から行末までと、「/*」から「*/」まではコメントとなります。 コメントはマクロの動作に影響しません。


// コメント

/* 
 * コメント
 */

数値

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

文字列

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

保存時の設定に関わらず、セル内改行は「\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 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)

組み込み関数

Cassava Editor の状態を設定・取得する関数や、 文字列処理・数値処理用の関数が組み込み関数として定義されています。

組み込み関数の一覧

組み込み関数の一覧はマクロリファレンスを参照してください。

メッセージボックス

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 を表示します。テキストボックスのデフォルト値は 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が0以外ならブロック2が、 そうでなければブロック3が実行されます。


while (条件) {
  ブロック;
}

条件が0以外である間実行されます。


for (文1; 条件; 文2) {
  ブロック;
}

最初に式1を実行し、条件が0以外である間実行されます。 ループの最後で文2が実行されます。

関数定義

function 文により、自分で関数を定義することができます。


function 関数名(引数名1, 引数名2, ...) {
  ...
  return 戻り値;
}

という形になります。

例えば、次のマクロは x と y の積を表示します。


function mult(x, y){ return x * y; }

MessageBox(mult(x,y));

関数を呼び出す部分は関数を定義した場所より下に置いてください。

戻り値を使用しない場合は return 文は不要です。 また、戻り値を省略して return; のみにもできます。 return 文は関数の最後だけではなく任意の箇所で使用できます。 関数内でなくトップレベルで return 文を実行するとマクロが終了します。

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

オブジェクト

複数の値や関数の集まりをオブジェクトとしてまとめて扱うことができます。 文頭以外で次のように記述するとオブジェクトとして認識されます。


{ キー1: 値1, キー2: 値2, ... }

オブジェクト内の値には「obj.key」もしくは「obj[key]」の形でアクセスできます。 [] を用いる場合、[] 内の計算結果がキーとして扱われます。 関数の引数・戻り値にオブジェクトを渡す場合はポインタ渡しとなり、値の変更は関数外部にも反映されます。

次のような構文でクラスを宣言できます。


class クラス名 {
  constructor() {
    ...
  }
  メソッド名1() {
    ...
  }
  メソッド名2() {
    ...
  }
  ...
}

クラスが宣言されている場合、「new クラス名()」でオブジェクトを生成できます。 生成されたオブジェクトはクラスで定義されたメソッドを持ちます。 メソッドは「obj.method()」とすると実行できます。 オブジェクト生成時には constructor が定義されていれば自動的に実行されます。 constructor やメソッド内では「this」という変数でオブジェクト自身を参照できます。

constructor やメソッドは引数を持つことができます。 オブジェクト生成時やメソッド実行時の引数の個数は宣言時と一致している必要があります。 引数の数が異なっても同じ名前のメソッドはオブジェクト内に 1 つしか持てません。

インポート

マクロの先頭で次のように記述すると、他のファイルで定義された関数やクラスを再利用できます。


import { 関数名, クラス名, ... } from "ファイル名.cms";

「ファイル名.cms」はマクロフォルダからの相対パスで、読み込むファイルを指定します。

次のように「as 別名」を付加することで、関数やクラスに別名をつけて読み込むことができます。 別名をつけた場合には元の名前では関数やクラスを参照できません。


import { 元の名前 as 別名 } from "ファイル名.cms";

また、ファイル名から「.cms」を除いた名前が半角英数字のみであり、かつ変数として使われていない場合、 インポートをせずに「ファイル名.関数名()」という形でも他のファイルの関数を実行できます。 この場合、読み込むファイルは拡張子「.cms」でマクロフォルダ直下に配置する必要があります。 「ファイル名」部分が変数として使われていた場合はオブジェクトのメソッド呼び出しとなります。

ユーザーマクロフォルダとアプリケーションマクロフォルダに同名のファイルがある場合、 ユーザーマクロフォルダ内のファイルが優先されます。

フォーマットマクロ

マクロフォルダ内に「!format.cms」という名前のマクロを作成することで、 データの表示の仕方を自由に変更することができます。

セルが再描画される時に x と y が設定された状態でこのマクロが呼ばれます。 差し替えたい内容を return 文で返すと、 実際のデータではなく return 文で返された内容が画面に表示されます。 行番号・列番号に対しても x = 0 および y = 0 としてこのマクロが呼ばれます。 通常のセルについては [x,y] で、行番号と列番号については y や x で対象のデータを取得できます。 「!format.cms」が起動時に存在しなかった場合や、 return 文が実行されなかった場合、 もしくは return 文で空文字 "" が返された場合は通常通りセルの内容が表示されます。

[x,y] では「セル内計算式を処理」を適用後の結果が返されます。 一方、「数値を右寄せ」「数値を 3 桁区切り表示」「小数を省略表示」オプションは フォーマットマクロの実行後に適用されます。 フォーマットマクロの実行結果は画面表示と印刷時のみに適用されます。 通常のマクロからはフォーマットマクロの適用結果は参照できません。

ユーザーマクロフォルダに !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 です。
GetStatusBarCount()
ステータスバー内の表示領域の個数を取得します。
GetStatusBarText(x)
x 番目の領域に表示された文字列を取得します。
GetStatusBarWidth(x)
x 番目の領域の幅を取得します。

ステータスバーの一番左には Cassava 本体が使用する表示領域があります。 この領域の表示内容は自動的に更新されますが、 0 番領域としてアクセスすることで値の取得・上書きをすることができます。

ユーザーマクロフォルダに !statusbar.cms がある場合には、 アプリケーションマクロフォルダ内のファイルよりも優先されます。

Menu


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