%( ) 置換 - 文字列置換

%( ) 置換

文字列式の置換

LabTalkコマンドは数値の式を受け付けますが、文字列の式は受け付けません。そのため文字列を引数とする必要がある場合、%( )置換を使った文字列変数または文字列式を渡して、実行時の値を解釈する必要があります。文字列式の最も簡単な形式は、次の例のような1つの文字列変数です。

string str$ = "Book2";         
win -o %(str$) {wks.ncols=;}

ワークシート列とセルの置換

次の表記は、文字列としてワークシートセルにアクセスしたり、どのブックのシートからでも列のデータセット名を取得できます。Origin 8以前は、各ブックには1つのシートしかなかったので、ブック名だけでその内容を参照できました。最近のバージョンでは、複数のワークシートをサポートしているので、そのブックに1つのシートだけが含まれていることが確実でなければ、[workbookname]sheetNameorsheetIndex の形式で特定のシートにアクセスします。

列データセット名

構文 説明
%(workbookName, column) ブックのアクティブシートに対する古い表記
%([workbookName]sheetNameorsheetIndex, column) シート名またはシートインデックスのいずれかを使用したOrigin8後のブックシート表記

例:

%A = %(%H, 2);           // アクティブブックのアクティブシートの列2
type %A;
%B = %([Book1]Sheet3,2); //  Book1のSheet3の列2
type %B;

上記の例では、アクティブワークシートの列2のデータセットの名前が評価式の右側で置換され、%Aと%Bに割り当てられます。2番目のケースでは、ブックまたはシートが存在しない場合、エラーは起こりませんが、置換は無効となります。

Note: 括弧を使って、文字列レジスタ自体に割り当てを実行するのではなく、文字列レジスタ変数に含まれる名前を持つデータセットで実行される割り当てを強制的に行うことができます。

%A = %(Book1,2);   // 列2のデータセット名を取得
type %A;           // データセットの名前を出力
(%A) = %(Book1,1); //  列1のデータを列2にコピー

個別セルの内容を返す

構文 説明
%(workbookName, column, row) ブックのアクティブシートを参照
%([workbookname]sheetname, column, row) ブックとシートを指定


例えば、Book1のアクティブワークシートの4番目の列の3行目のセルに25という値が含まれている場合、スクリプトウィンドウに次のステートメントを入力すると、Aを25にセットし、その値を2倍して同じワークブックの"Results"シートの1列目4行に入力します。

A = %(Book1, 4, 3);
%([Book1]Results, 1, 4) = 2 * A;


テキストセルの内容を得るには、文字列変数に代入します。

string strVar$ = %(Book1, 2, 5); // Note :ここでは '$' は必須ではありません
strVar$ = ;

"W" および "@WL"を使用した戻り値のフォーマット

  • Origin 8.1より前のバージョンでは、アクティブシートの列および行番号のみ指定でき、数値セルには常にフル精度で値が返されました。
  • Origin 8.1以降、オプションのフォーマット引数でブックおよびシートを指定でき、カスタムフォーマットで値を返すことができます(Originフォーマットを参照)
    %([workbookname]sheetname, column, row[,format])
  • 構文の別のバリエーション(範囲変数を操作するときに必要なもの)では、セル形式カスタム形式、またはセルに保存されている完全な精度値の3つのレベルの形式を返すことができます。
    %([workbookName]sheetName, @WL, column[row][,format])

ここで、オプションフォーマット引数は以下の値のうち一つをとります。

引数 説明
W セルのフォーマットで返す
custom format Originのフォーマットを使用して変更された、セルの完全精度の値を返します。
omitted セルの完全精度の値を返す


サンプル:

Book2のsheet3のcol(Signal)[3]に 12.3456789という数値があるものとしますが、小数点以下2桁が表示されます(この設定は列プロパティダイアログで行います)。

//フォーマット文字列 W で現在の列フォーマットを使用
//12.34を返す
type "Col(Signal)[3] displayed value is %([Book2]Sheet3,Signal,3,W)";
//フォーマット指定なしでフル精度
A=%([Book2]Sheet3,Signal,3);
A=;// 12.3456789を表示
//あるいは他のフォーマット表記
type "Showing 3 decimal places:%([Book2]Sheet3,Signal,3,.3)";
//あるいは、表示フォーマットを維持する@WLを使った他の表現
type "Col(Signal)[3] displayed value is %([Book2]Sheet3, @WL, Signal[3],W)";
//フォーマット指定なしの場合フル精度
B=%([Book2]Sheet3,@WL,Signal[3]);
B=;// 12.3456789を表示

Origin 9.1でのフォーマット文字W は、以前のバージョンのC (つまり、%([workbookName]sheetName, column, row,C))の代わりです。フォーマットパラメータ"C" はサポートされません。

別のシートのデータセットを含めた計算

ブックまたはシートからデータセット名を取得する(データセット置換)機能は、次のような異なるシートにある列間の計算を行うのにとても役立ちます。

// Sheet2とSheet3のcol(1)を合計し、アクティブシートのcol(1)に入れる 
col(1)=%([%H]sheet2, 1) + %([%H]sheet3, 1);
 
// Book2の最初のシートでcol "signal"を減算 
// そして、アクティブブックのSheet3の列"calibrated"に結果を入れる
%([%H]sheet3, "calibrated")=col(signal) - %([Book2]1,signal);

ロングネームを使う場合、column 名は引用符で囲む必要があります。引用符が無い場合、Originは最初にショートネームを探し、見つからなければ、ロングネームを使用しようとします。上記のサンプルで、

%([%H]sheet3, "calibrated")

は、強制的にロングネームを探しますが、

%([Book2]1,signal)

は、ショートネームを持つ列が無かった場合のみロングネームを使います。

ワークシート情報の置換

置換表記でのワークシート列とセルへのアクセスと同様、@置換 (ワークシート情報置換)は、@文字を使って、2番目の引数にある列インデックスまたは列名とは区別されます。この表記は、ワークシート情報とメタデータにアクセスできます。

上記のワークシートの列とセルの置換表jきと同様に、1枚のウィンドウにはまだサポートされている古い構文がありますが、新しい表記(Origin 8で導入)を使用することをお勧めします。

ワークシートの情報を返すには

構文 説明
%(workbookName, @option, columnNumber) ブックのアクティブシートを参照
%([workbookName]worksheetName, @option, columnNumber) ブックとシートを指定


ここで、オプション は以下(パラメータcolumnNumberはいくつかのオプションで省略されます)のうち一つになります。

オプション 返される値
@# ワークシートの列の総数を返します。
@CS columnNumber列から右に数えて、一番最初の選択されているY列の列インデックス(columnNumber列を含む)を返します。
@E# columnNumber=1の場合、ワークシート内のYエラー列数を返します。 columnNumber=2の場合、現在選択されている領域内のYエラー列数を返します。 columnNumber が省略されている場合、columnNumber は1と見なされます。
@H# columnNumber=1の場合、ワークシート内のXエラー列数を返します。 columnNumber=2の場合、現在選択されている領域内のXエラー列数を返します。 columnNumber が省略されている場合、columnNumber は1と見なされます。
@P %Hとともに使用して、アクティブウィンドウのプロジェクトエクスプローラ(PE)パスを返します(%(%H, @P))。
@PC ページのコメントを返します。
@PCn ページコメント、n 番目のみ
@PL ページのロングネームを返します。
@PN ページのショートネームを返します。
@SN シート名を返します。
@SC シートコメントを返します。
@OY 選択されている列の1番左のY列から数えた、columnNumber列までのオフセットを返します。
@OYX 選択されている列の1番左のY列から数えた、columnNumber列までのY列のみのオフセットを返します。
@OYY 選択されている列の1番左のY列から数えた、columnNumber列までのX列のみのオフセットを返します。
@T 列のXY属性を返します。 1はY列を、2は無属性を、3はエラーバー列を、4はX列を、5は列ラベルを、6はZ列を、7はXエラーを意味します。
@X ワークシートの最も左にあるX列の列番号を返します。 列は左から右へ、列番号が1から順に大きくなります。 %(worksheetName,@X);という記法を使います。
@Xn ワークシートの最も左にあるX列のショートネームを返します。 %(worksheetName,@Xn);という記法を使います。
@Y 選択されている列の1番左の列から数えた、columnNumber列までのオフセットを返します。
@Y- 指定した列を右に捜していき、最初に見つかったY列の列番号を返します。 指定した列がY列であれば、columnNumberを返します。Y列が見つからなければ、0を返します。 %(worksheetName,@Y-,ColumnNumber);という記法を使います。
@Y# columnNumber=1の場合、ワークシートのY列の数を返します。 columnNumber=2の場合、現在選択されている領域内のY列の数を返します。 columnNumber が省略されている場合、columnNumber は1と見なされます。
@Y+ 指定した列を右に捜していき最初に見つかったY列の列番号を返します。 指定した列がY列であれば、columnNumberを返します。Y列が見つからなければ、0を返します。 %(worksheetName,@Y+,ColumnNumber);という記法を使います。
@YS columnNumber列から右に数えて、一番最初の選択されているY列の番号(columnNumber列を含む)を返します。
@Z# columnNumber=1の場合、ワークシート内のZ列の数を返します。 columnNumber=2の場合、現在選択されている領域内のZ列の数を返します。 columnNumber が省略されている場合、columnNumber は1と見なされます。

このテキストラベルオプションページの@オプションは、ワークシート情報を返すためにも使用されます。

情報の保存とインポートしたファイルの情報

@W変数は、Originのワークブックおよびワークシート、列だけでなく、インポートしたファイルに保存されているメタデータにアクセスします。

String substitution systemdotimport.png
構文 説明
%(workbookName]worksheetName, columnName, @Woption, varOrNodeName) 必要に応じてブック、シート、列を指定します。
%([workbookName]worksheetName!columnName, @Woption, varOrNodeName) 上記と同じですが、範囲スタイル表記を使用

例:

filename$ = %(Book1,@W,system.import.filename$);
filename$=; // S15-125-03.datを返す
filename$=%([Book1]"Trial Run 1"!,@W,system.import.filename$);
filename$=; // S15-125-03.datを返す
オプション 返される値
@W varOrNodeName の情報を返します。この変数はそのワークブックレベルにあると理解され、ワークブックオーガナイザで確認できます。使用されている場合worksheetName!ColumnNameで特定する必要はありません。
@WFn n番目のインポートしたファイルに対してvarOrNodeNameの情報を返します。変数はワークブックオーガナイザで確認できます。
@WS varOrNodeName の情報を返します。この変数はそのワークブックレベルにあると理解され、ワークシートオーガナイザで確認できます。使用されている場合、ColumnNameで特定する必要はありません。
@WC varOrNodeName の情報を返します。この変数はその列レベルにあると理解され、列プロパティダイアログで確認できます。


この構文が機能しているか確認する方法の1つとして、ファイルをワークブックにインポート後、テキストツールを使用して、ワークシート列の右側の灰色のスペースでテキストラベルを開始することです。右クリックして情報変数の挿入を選択します。情報タブをクリックして、SYSTEM.IMPORTノードを開き、変数を選択して挿入をクリックします。ここでは、使用中の「@W」オプションと、varOrNodeNameに格納されている情報を確認できます。変数を挿入ダイアログを閉じてラベルの外側でクリックすると、表記は解決され、ワー​​クブックのメタデータを表示するテキストラベルが作成されます。

LT Information Storage Substitution.png

@置換の例

次のスクリプトは、現在選択されている範囲の最初の列の列名を返します。(selc1数値システム変数に関する情報に関しては、システム変数 を参照してください。)

%N = %(%H, @col, selc1);  %N =;

このスクリプトは、アクティブウィンドウのプロジェクトエクスプローラーパスを返します。

%P = %(%H, @P); %P=;

次の行は、アクティブページのロングネームを文字列変数に返します。

string PageName$ = %(%H, @PL);

以下のスクリプトはBook2、Sheet3の4番目の列に対して列の種類を返します。

string colType$ = %([Book2]Sheet3, @T, 4);  
colType$=;

インポートフィルタは、ワークブックと一緒に保存されるインポートファイルについての情報のツリー構造を作成することができます。 ここで、複数ファイルのインポートに対して、現在のブックにインポートされた3番目のデータセットのポイント数を返します。

%z=%(%H,@WF3,variables.header.noofpoints);
%z=

現在のアクティブワークシートが6つの列(XYYYYY)を持っているとします。もし、列2,4,5が選択されているとすると、以下のスクリプトは、columnNumber列(3つ目の引数)から右に数えて、1番最初の選択されたY列番号(columnNumber列を含む)を返します。

loop(ii,1,6)
{
    type -l %(%H, @YS, ii),;
}
type;

次のように出力されます。

   2,2,4,4,5,0,

凡例と軸タイトルの置換

グラフの凡例と軸タイトルも %( )置換を使うことができます。最初の引数は整数値で、最初の引数がワークシート指定子(プロット番号など)であるような他の%( )置換とは区別されなければなりません。最も一般的で基本的な形式の凡例と軸タイトルの構文は以下の通りです。

%(PlotIndex[, @option])

ここで、PlotIndex は現在のレイヤにあるデータプロットのインデックスあるいは、クエスチョンマーク("?")です。

  • 多くのオプションをPlotIndex の後に指定でき、通常、データセットと結びついているプロット属性の文字(X, Y, Z)であり、指定していなければ、Yと見なされます。
  • @optionパラメータは、凡例の内容を制御するオプションの引数です。 例:
// 現在のグラフレイヤの凡例で
// 最初の従属データセットのロングネームを表示
legend.text$ = %(1Y, @LL)  
 
// 同等のコマンド(デフォルトのYが使われる)
legend.text$ = %(1, @LL)
  • 次のスクリプトは、凡例に2番目の独立データセット(例; X)のショートネームを表示します。
legend.text$ = %(2X, @LS)

この凡例の変更スタイルは、単一の凡例項目のみの変更に限られますが、作図の詳細ダイアログで使用することができるよう構成されています。

Yデータのロングネームとそれに続く単位を左Y軸のタイトルとして<>内に表示するには、次のようにします。

yl.text$ = %(?Y,@(@LL<@LU>));


グラフ凡例と軸タイトルはテキストラベルで指定されます。これらについての詳細な情報は、LabTalkのリファレンスページを参照してください。

legendupdate Xファンクションは、スクリプトから凡例を編集するより簡単で包括的な方法を提供します。

キーワード置換

%( )置換表記は、タブや改行コードなどの 非出力文字 (制御文字とも言う)を挿入するためにも使われます。 LabTalkキーワードを使って、これらの非出力文字にアクセスします。 例えば、

// 改行、ラインフィード(CRLF)を文字列に挿入
string ss$ = "Hello%(CRLF)Goodbye";
ss$=;     // ANS:'Hello', 'Goodbye' が別の行に出力
// 直接入力可能
type ss$;
// または%()置換を使って、文字列変数を表示
ty I say %(ss$) you say;