範囲表記

目次

範囲入門

Originプロジェクト内ではワークシート、行列、グラフ、非接続データセットの4つの主要な場所にデータが存在します。これらのいずれの形式でも、範囲データ型を使用すると、標準的な方法で簡単にデータにアクセスできます。グラフに実際のデータが保存されているわけではありません。

Origin 8.0より前は、データはdattasetscell()col()wcol()関数でアクセスしていました。ただし、この関数はアクティブウィンドウのアクティブシートのデータにアクセスするためにのみ使用できます。

範囲データ型は、Originプロジェクト内のデータにアクセスする一貫した方法を提供するために、Origin 8.0以降に導入されました。アクティブなウィンドウと非アクティブなウィンドウの両方のデータにアクセスするために使用できます。

このチュートリアルでは、Originのさまざまな場所にあるデータの範囲変数の作成と使用について説明します。

Note : すべてのXファンクションが複数列や非隣接列などの複雑な範囲を扱える訳ではありません。論理や文書でサポートが得られない場合は、少し実験してみるとよいでしょう。

Orgin 2023から、ページ名(ワークブック、行列、グラフなど)の範囲参照では、ページのロングネームはダブルクォートし、ページのショートネームはダブルクォートしないでください(これまではロングネームのダブルクォートが必須で、ショートネームのダブルクォートは可能でしたが、推奨されません)。ショートネームのダブルクォートの禁止は、置換による参照(例:[%H] が正しい、 ["%H"]にはしないでください)にも適用されます。この変更により、ページのロングネームの検索では、アクティブなフォルダのウィンドウのロングネームを優先的に検索するようになります。この禁止事項により、フォルダの複製やプロジェクトの追加を行う際、より強固なページ参照が可能になります。ただし、以前の挙動にしたい場合は、システム変数@RQSを使ってこの変更をもとに戻すことができます。

宣言と構文

範囲変数は使用前に宣言する必要があります。しかし、次のような独自性もあります。

  • Originがどのデータを参照しているのかを認識できるように、宣言とともに初期化する必要があります。
  • 他のデータに代入したい場合は、再度宣言して初期化する必要があります。

宣言と初期化のシンタックスは以下の通りです。

range [-option] RangeName = RangeString
  • 角括弧は、オプションであることを示します。
  • データの場所が異なると、使用できるオプションスイッチが異なります。詳細については、以下の範囲データの種類セクションを参照してください。
  • 範囲名は、 Originの変数名の規則に従います。システム変数名は使用しないでください。
  • RangeStringは、範囲が指し示すオブジェクトの種類によって変化します。ただし、[Window]SheetorLayer!ColumnorPlot[subrange]という一貫した表記があります。詳細は範囲データの種類を参照してください。

範囲キーワードは、範囲変数を定義するためにのみ使用されます。式の両側でデータアクセスを行う一般的な表記法としては使用できません。

Originオブジェクトへアクセス

範囲変数は、以下のタイプのOriginオブジェクトに割り当てることができます。

割り当てられると、範囲変数には、指定されたオブジェクトのすべてのプロパティとメソッドが含まれます。rangeVariable.= および rangeVariable.() を使用して、アクセス可能なすべてのプロパティとメソッドを表示できます。

range rA = [Book1]Sheet1!Col(A); //範囲変数 ra as  column A in Book1 Sheet1
rA.=; //全プロパティを表示
rA.(); //全メソッドを表示
rA.lname$=; //ロングネームを出力
rA.nRows=; //行数を出力
rA.unit$="MM/DD/YYYY"; //set unit as "MM/DD/YYYY"
ra.setformat(4);//列を日付に設定


範囲は標準的なOriginオブジェクトのサブセットまたはいくつかの組み合わせで構成されます。 下記のような例があります。

範囲データの型

ワークシートデータ

ワークシートデータに対して、RangeString は次の形式を取ります。

[WorkBookName]SheetNameOrIndex!ColumnNameOrIndex[CellIndex]

  • アクティブブックまたはアクティブシートを参照する場合はWorkBookName および SheetName 部分はスキップできます。
  • ショートネームがデフォルトのプログラミング名であるため、上記のWorkBookNameSheetName は対応するショートネームを参照します。
  • ワークブックやワークシートの範囲表記でロングネームを使用するには、["MyBook"]"MySheet"]のようにロングネームをダブルクォーテーションで囲む必要があります!
  • 逆に、ショートネームをダブルクォーテーションで囲まないでください(これには[%H]のような参照も含みます)。Origin 2023より前では、この方法は推奨されてはいませんでしたが、使えていた可能性があります。Origin2023以降、ショートネームをダブルクォートすると失敗する可能性が高くなりました。以前の挙動(ショートネームをダブルクォートすることを許可する)に戻したい場合は、LabTalkシステム変数@RQSをご覧ください。
  • ショートネームのダブルクオートを禁止する変更に伴い、ページロングネームの検索では、ウィンドウロングネームをアクティブフォルダから優先的に検索するようになりました。これは下記のようなことを可能にします。
  • フォルダを複製し、ワークブックで定義されたローカル変数に依存するようなフォルダ内の操作を保持します。
  • プロジェクトエクスプローラのフォルダをプロジェクトとして保存し、後でそのプロジェクトを別のプロジェクトに追加することができます。その際、ウィンドウのショートネームは名前の衝突を避けるために変更されますが、ウィンドウのロングネームに依存する操作には影響がありません。
  • ColumnName (引用符なし) には、列のロングネームまたはショートネームのいずれかを指定します。 (ロングネームにスペースがある場合は、二重引用符で囲む必要があります)
  • 2022bから、@LNCS=1で列ロングネームは大文字小文字を区別するようになりました。
//ロングネーム使用
range rPage = ["My Book"]; //ページの範囲変数
range rSheet = ["My Book"]"My Sheet"; //シートの範囲変数
range rA = ["My Book"]"My Sheet"!"Amplitude"; //列の範囲変数

//ショートネームを使用
range rPage = [Book1]; //ページの範囲変数
range rSheet = [Book1]Sheet1; //シートの範囲変数
range rA = [Book1]Sheet1!B; //列の範囲変数

//シートおよび列部分でインデックスを使用
range rSheet = [Book1]1; //シートの範囲変数
range rA = [Book1]1!2; //列の範囲変数

//ロングネーム、ショートネーム、インデックス混合
range rSheet = ["My Book"]1; //ブックはロングネーム、シートはインデックス
range rA = [Book1]"My Sheet"!2; //ブックはショートネーム、シートはロングネーム、列はインデックス
range rB = [Book1]1!"Temparature"; //ブックはショートネーム、シートはインデックス、列はロングネーム

//そのほかのサンプル
range rPage =[%H]; //%Hは現在のウィンドウ
range rA=%C; //%Cはシート内の現在の選択
range rSheet = [%H]1; //現在のウィンドウの第一シート
range rA=rSheet!A; //rSheetに基づいてrAを構築

任意のRangeStringにおいて、連続したシート、列、行の長さを指定するには、index1:index2のように、シート、列、行のインデックス(それぞれ)をコロンで区切って指定することができます。 キーワードendは、Originが指示されたオブジェクトをすべてピックアップすることを示すため、index2の代わりに使うことができます。 例えば、

range rs = [Book1]4:end!           // シート 4 から最後までを取得
range rd = [Book2]Sheet3!5:10;     // 列 5から10を取得

行の場合、インデックスは角括弧で囲まなければならないので、ワークシート列の複数の行に対する完全な範囲指定文は次のようになります。

range rc1 = [Book1]Sheet2!Col(3)[10:end];   // 10行目から最後の行まで取得。[10:0] でも可
range rc2 = [Book1]Sheet2!Col(3)[10:20];    // 10から20行目まで取得

セルの内容にアクセスする方法として、従来からあるCell関数もサポートされています。


アクティブなワークシートの列に対して範囲変数を宣言する場合、ブックとシートの部分をドロップすることができます。 識別可能な場合、列ショートネーム、インデックス、ロングネーム、またはcol()を列部分に使用できます。

range r1 = col(3); //アクティブシートの3列目
range r2 = col(C); //アクティブシートのC列
range r3 = col("Sensor Y") //アクティブシートのロングネーム"Sensor Y"の列
range aa=1;        // アクティブシートのcol(1)
range bb=B;        // アクティブワークシートのcol(B)
range cc="Test A"; // アクティブワークシートのロングネーム"Test A」の列

aa = 1! などの式で、アクティブブックの最初のシートを参照します。aa = "1!"では、ロングネームが1!の現在のシートの列を参照します。範囲宣言の引用符の保持または破棄を制御するには、システム変数@RPQを参照してください。

複数の範囲変数をカンマで区切って同じ行に宣言することができます。 上記の例は、次のように書くこともできます。

range aa = 1, bb = B, cc = "Test A";

または、指定した同じシート内で複数の範囲変数を宣言する場合は、ブックとシートの部分を先頭に置くことができます。

range ["MyBook"]Sheet3 aa=1, bb=B, cc="Test A"; // ロングネームが"MyBook"というブックのSheet3の列

Originは列のロングネームを一意にすることを強制しないので(つまり、ワークシート内の複数の列が同じロングネームを持つことができる)、より正確にするためにショートネームとロングネームを一緒に指定することができます。

range dd = D"Test 4";  // Col(D)(ロングネームTest 4)を範囲に割り当て

Origin 2024bでは、新しいオプションスイッチ-sを使用して、不連続な列を持つ範囲を作成できます。

StringArray sa = {2,4,6,8};
range -s rr=sa;
del rr;

列の範囲が決まったら、それを使って列のプロパティにアクセスし、変更します。

range rColumn = [Book1]1!2;       // 範囲は列です
rColumn.digitMode = 1;            // 表示する小数点以下の桁数を設定する
rColumn.digits = 2;               // 小数点桁数を2桁に

あるいは計算を行います。

// アクティブワークブックのsheet1, 2, 3の列1をポイント
workbook:
range aa = 1!col(1);
range bb = 2!col(1);
range cc = 3!col(1);
cc = aa+bb;

存在しない列を範囲変数に割り当てる場合、その列に値が割り当てられるまで表示されません。 存在しないシートまたはブックの列にも同じルールが適用されます。

newbook; //デフォルトの二列のみの新規ブック
range aa=1, bb=2, cc=3; //3つの範囲変数を3列に割り当て。3番目の列は存在しない
aa=data{0, 10, 0.5}; //aaに値を割り当て
bb=sin(aa); //bbに値を割り当て
cc=cos(bb); //ccに値を割り当て。3列目が表示

範囲指定でカラムラベル行にアクセスしたい場合は、メタデータへのアクセス列ラベル行の参照表をご覧ください。

異なるシートのデータに対して演算を行う場合、範囲変数を使用する必要があります。 範囲文字列の直接参照はまだサポートされていません。 例えば、スクリプトSheet3!col(1) = Sheet1!col(1) + Sheet2!col(1);は、動作しません。もし本当に範囲変数を宣言せずに1行で書く必要があるなら、Dataset Substitution使用します。

ページとシート

データの1列だけでなく、ページおよびシートオブジェクトにアクセスするために、範囲を使用することができます。

ワークブック全体にアクセスするには、範囲変数を使用します。

// 'rPage'は'Book1'という名前のワークブックを指定
range rPage = [Book1]; 
// 'Book1'のロングネームを"My Analysis Worksheets"に設定                   
rPage.LongName$ = My Analysis Worksheets; 
rPage.nlayers=; //シート数を出力
rPage.active=3; //三番目のシートをアクティブシートに設定

ワークブックにアクセスするには、範囲変数を使用します。

// 'rSheet'はロングネームMyBookのブックにある、MySheetというロングネームのシートを指定
range rSheet = ["MyBook"]"MySheet"!;
rSheet.name$ = "Statistics";        // シート名を "Statistics"に変更
page.xlcolname = 0;               //スプレッドシートセル表記をオフ
rSheet.AddCol(StdDev);              // 列名StdDevの列を追加

ワークブックのスプレッドシートセル表記については、FAQ-849 を参照してください。

列の部分範囲

列の部分範囲を指定するには、次のような範囲変数を使用します。

//MyBook(ロングネーム)、sheet2のcol(a)の部分範囲
range cc = ["MyBook"]sheet2!col(a)[3:10];

また、目的のワークブックとワークシートがアクティブな場合は、短縮表記を使用することができます。

// book1のsheet2のcol(a)の部分範囲
range cc = col(a)[3:10];

他の範囲の部分範囲を作成

range ra=[book1]Sheet1!A;
range subra=ra[10:20];

列の一部に対して計算やその他の操作を行うことができます。例えば、

range r1=1[5:10];
range r2=2[1:6];
r1 = r2; //2列目の1行目から6行目までの値を1列目の5行目から10行目にコピーする。
r1[1]=; 
// この場合、1列目の5行目に値が出力され、2列目の1行目と等しくなるはずです。

セルブロック

次のように、範囲を使用して、1つのセルまたはセルブロック(多くの行と列にまたがる場合があります)にアクセスします。

range aa = 1[2];  // (列1, 行2), 1つのセル
range bb = 1[1]:3[10];  // (列1, 行1) から (列3, 行10)

Note:セルブロックを表す範囲変数は、Xファンクションの引数としてのみ使用でき、直接計算はサポートされていません。

Originのjoin()関数で、複数の非連続範囲を1つのデータセットに結合できます。

オプションスイッチ-v

必要なOriginのバージョン: 9.1 SR0以降

ワークシートデータの場合、-vスイッチで1つのブロックを範囲として定義し、その値を一時ベクトルに格納することで、同じサイズでブロック形状が異なるブロック間でのデータ割り当てが可能になります(例えば、行から列への値の割り当てが可能です)。

次の例では、ワークシートの特定の列の行にあるすべてのエントリをスケーリングします。

// 最後の列を除くすべての列の最初の要素を係数でスケーリング
range -v r=1[1]:$(wks.ncols-1)[1];
r*=10;
// すべての列の最初の要素をスケーリング
range -v r=1[1]:end[1];
r*=10;

以下のサンプルで、このオプションスイッチの使用方法をご紹介します。

//新しいブックにサンプルデータをインポート
fname$=system.path.program$ + "\Samples\Statistics\automobile.dat"; 
newbook;
impasc;
//列BCの全ての行をブロックとして定義
range -v r1 = B[1]:C[end];
//新しいシートを作成
newsheet;
//列ABの大きさでブロックを定義
range -v r2 = 1[1]:2[r1.GetSize()/2]; // ブロックのサイズは2列×行数
//1つ目のブロックの値を2つ目のブロックに割り当て
r2 = r1;

ベクターはデータを列方向に格納し、「形」に関係なく宛先ブロックを埋めます。

// 新しいブックにサンプルデータをインポート
fname$=system.path.program$ + "\Samples\Statistics\abrasion_raw.dat"; 
newbook;
impasc;
// 列ABの全ての行をブロックとして定義
range -v ra1 = 1[1]:2[end];
//新しいシートを作成
newsheet;
// ra1のブロックの大きさを使って1列のブロックを定義
range -v ra2 = 1[1:ra1.GetSize()];
//1つ目のブロックの値を2つ目のブロックに割り当て
ra2 = ra1;
col(1)[L]$ = Combined;

Note:目的のブロックで定義される列は割り振られる前に存在する必要があります。

行列データ

行列データではRangeStringは下記のようになります。

[MatrixBookName]MatrixSheetNameOrIndex!MatrixObject

Note: ショートネームがデフォルトのプログラミング名であるため、上記のWorkBookNameSheetName は対応するショートネームを使用しました。行列ブックと行列シートで範囲変数にロングネームを使用するには、["MyMatrixBook"]"MyMatrixSheet"!のように、ロングネーム を二重引用符で囲みます。

変数の代入は、以下の構文で行うことができます。

// MBook1, MSheet1の2番目のオブジェクト
range mm = [MBook1]MSheet1!2;
// 行列ブックMatBook1(ロングネーム)の行列シートMatSheet1(ロングネーム)の
// ロングネームMatObject1の行列オブジェクト
range mo = ["MatBook1"]"MatSheet1"!Mat("MatObject1");

RangeName[row, col]の表記を使って行列範囲のセルの内容にアクセスします。 例えば、

range mm=[MBook1]1!1;    
mm[2,3]=10;

行列が複素数を含む場合,複素数を表す文字列は以下のようにアクセスすることができます。

string str$;
str$ = mm[3,4]$;

グラフデータ

グラフデータではRangeStringは下記のようになります。

[GraphWindowName]LayerNameOrIndex!DataPlot

割り当ての例はこのようになります。

range ll = [Graph1]Layer1!2;       // Graph1、Layer1の2番目の曲線
range mm = %C; //現在のアクティブプロットまたは選択したプロットを取得

オプションスイッチ-w, -wx, -wy, -wz

グラフウィンドウでは、range -w とrange -wx, range -wy, range -wzオプションを使って、プロットデータセットのワークシート列範囲を取得することができます。

range -w は、常に、最も依存性の高い変数のワークシート範囲を取得します - これは、2DプロットのY値、3DプロットのZ値または行列オブジェクトです。Origin9.0 Sr0からrange -wで複数範囲がサポートされるようになっています。

range -wx, range -wy, range -wz は、それぞれ対応する X, Y, Z 値のワークシート範囲を取得します。

range -wx, range -wz 必要なOriginのバージョン: 9.0 SR0

// グラフウィンドウをアクティブウィンドウにする
// 最初のデータプロットのY値のワークシート範囲を取得
range -w rW = 1;
type %(rw); //範囲文字列を出力

// 対応するX値のワークシート範囲を取得
range -wx rWx = 1;

//対応するY値のワークシート範囲を取得
range -wy rWy = 1;

//対応するZ値のワークシート範囲を取得
range -wz rWz = 1;

// 最初のデータプロットのグラフ範囲を取得   
range rG = 1;      

// 現在の選択内容を取得 (%C)
range -w rC = %C;

上記のスクリプトで、rW = [Book1]Sheet1!B ですが、rG = [Graph1]1!1であることに注意して下さい。

グラフ上のデータセレクタの範囲

データセレクタツールを使用すると、グラフ上の1つまたは複数の範囲を選択し、LabTalkから参照することができます。選択された1つの範囲に対して、MKS1、MKS2システム変数を使用することができます。v8.0 SR6以降では、新しいXファンクション get_plot_sel が追加され、解析するために選択範囲を文字列に取得できます。 次の例は、現在のグラフの各範囲を選択する方法を示しています。

string strRange;
get_plot_sel str:=strRange;
StringArray sa;
sa.Append(strRange$,"|"); // トークン化
int nNumRanges = sa.GetSize();
if(nNumRanges == 0)
{
	type "there is nothing selected";
	return;
}
type "Total of $(nNumRanges) ranges selected for %C";
for(int ii = 1; ii <= nNumRanges; ii++)
{
	range -w xy = sa.GetAt(ii)$;
	string strWks$ = "Temp$(ii)";
	create %(strWks$) -wdn 10 aa bb;
	range fitxy = [??]!(%(strWks$)_aa, %(strWks$)_bb);
	fitlr iy:=xy oy:=fitxy;
	plotxy fitxy p:=200 o:=<active> c:=color(red) rescale:=0 legend:=0;
	type "%(xy) fit linear gives slope=$(fitlr.b)";
}
//  完了したら、すべてのデータマーカーをクリアする
mark -r;

Create (コマンド) (非接続データセットを作成する)、[??] 範囲表記 (非接続データセットから範囲を作成する)、fitlrX-FunctionStringArray (オブジェクト) (特に、AppendメソッドはOrigin 8.0 SR6で導入)の追加ドキュメントが利用できます。

X値を使用した部分範囲指定

XY範囲で作業する場合、X値を使用して部分範囲を指定できます。この構文は次のようになります。

  1. ワークシートから
    [WorkBookName]SheetNameOrIndex!YColumnNameOrIndex[xX1:X2]

サンプル:

// XとYに列1と2を使用してX=0.15~0.2の部分範囲を指定
range rxy = (1, 2)[x0.15:0.2];
  1. グラフから
    [GraphWindowName]LayerNameOrIndex!DataPlot[xX1:X2]

サンプル:

// Graph1, Layer1の2番目の曲線のXY部分範囲
range rxy2 = [Graph1]Layer1!2[x5:20];

次の例では、Xファンクション plotxyを使用してグラフをプロットし、Xファンクション smoothを使用してデータの部分範囲をスムージングします。

// 新規ブックにデータをインポート
newbook;
fname$ = system.path.program$ + "\Samples\Signal Processing\EMG Recording.dat";
impasc;

// XY部分範囲X=5~5.5および9.3~9.8を定義
range rxy1 = (1, 2)[x5:5.5];
range rxy2 = 2[x9.3:9.8];
plotxy rxy1 plot:=200;  // 1番目のXY部分範囲の線図
smooth -r 2 rxy2 method:=le;  // 2番目のXY部分範囲をLoessでスムージング

X値に基づいて部分範囲を指定する場合、Xデータは単調である必要があります。

非接続データセット

非接続データセットは、ワークシートの列に似ていますが、ブック・シート・列構成のようなオーバーヘッドを持ちません。これは、通常、 create コマンド で作成されるか、Dataset 宣言せずに代入文で自動的に作成されます。

非接続データセットのRangeStringはこのようになります。

[??]!LooseDatasetName

割り当ては、構文を使って行うことができます。

range xx = [??]!tmpdata_a;       // 非接続データセット 'tmpdata_a'

この動作を示すために、plotxyXファンクション を使って、緩やかなデータセットのグラフを描いてみます。

// 2つの非接続データセットを作成
create tmpdata -wd 50 a b;
tmpdata_a=data(50,1,-1);
tmpdata_b=normal(50);
// 範囲を宣言し、非接続データセットを明示的に指し示す
range aa=[??]!(tmpdata_a, tmpdata_b);
// これを使って散布図を作成
plotxy aa;


非接続データセットはプロジェクトに属するので、宣言され、セッションまたはローカルスコープを持つDataset変数とは異なります。データセット変数も内部的には非接続データセットですが、計算のみに使用するよう制限されており、例えばプロット作成には使用できません。

範囲メソッド

範囲変数が作成されると、この範囲から以下のメソッドが使用できるようになります。

メソッド 説明
range.getSize() 範囲の大きさを返します。このメソッドは、列、行列オブジェクト、グラフプロット、セルブロック、非接続データセットなどのデータセット範囲に対して動作します。セルブロックの場合、範囲宣言で指定された最初の部分範囲のサイズのみを返すことに注意してください。
range.setSize() 範囲の大きさを設定します。このメソッドは、列、行列オブジェクト、グラフプロット、セルブロック、非接続データセットなどのデータセット範囲に対して機能します。範囲がセルブロックである場合、範囲宣言で指定された最初の部分範囲のサイズのみを設定します。
range.getLayer() 範囲にレイヤ(グラフレイヤ、ワークシート、行列レイヤ)が添付されている場合、このメソッドはレイヤのuidを返します。レイヤの名前を取得するには、メソッドの後に$記号が必要で、例えば "rng.getLayer()$ = ".となります。
range.getPage() 範囲に添付されたページ(グラフページ、ワークブック、または行列ブック)がある場合、このメソッドはページのuidを返します。ページの名前を取得するには、「rng.getPage()$ =」のように、メソッドの後に$記号を付ける必要があります。
range.getop() 範囲がワークシート列またはグラフのプロットの場合、このメソッドは範囲に関連付けられた操作のuidを返します。範囲がワークシート(階層シートを含む)の場合、このシート範囲に接続されている最初の操作のuidを返します。
range.sub(name/index) このメソッドは、名前またはインデックスを指定して、データ範囲から部分範囲を取得するために使用されます。このメソッドは仮想行列の場合にのみ便利です。例えば、ztitle という名前の仮想行列の場合、 ztitle.sub(y); (by name) または ztitle.sub(1); (by index) という式でYの値のデータセットを返すことができます。さらに、 ztitle.sub(y)[3]=; または ztitle.sub(y)[3]$=;という式でこのデータセットの3番目の値を返すことができます。
range.reverse() このメソッドは、列、行列オブジェクト、グラフプロット、セルブロック、非接続データセットなどのデータセット範囲に対して機能します。範囲のデータ順序を逆にします。範囲がセルブロックである場合、範囲宣言で指定された最初の部分列のデータ順序を逆転させるだけになります。XファンクションcolReverseで同じことができます。
range.empty() このメソッドは、列、行列オブジェクト、セルのブロック、ラベル行などのラベル領域とデータ領域に対して機能します。範囲内のデータとラベルをクリアします。範囲がデータ領域の場合、この範囲のデータは欠損値に設定されます。GUIでは、選択した範囲を右クリックして、コンテキストメニューで「クリア」を選択することもできます。

範囲の特殊な使い方

範囲データの編集

列の範囲は、データを直接操作するために使用することができます。 列名を直接指定するのではなく、範囲を指定する大きなメリットは、どのページやレイヤがアクティブであるかを意識する必要がないことです。

例えば、

// 2つの範囲変数, v1とv2を宣言
range [Book1]Sheet1 r1=Col(A), r2=Col(B);
 
// [book1]sheet1がアクティブな場合、col(A)=data(1,30)と同じになる 
r1 = data(1,30);                          
r2 = uniform(30);
 
// [Book1]Sheet1 がアクティブにならないように新しいウィンドウを作成
plotxy 2;                                 
sec -p 1.5;            // 遅延
r2/=4;                 // col(A)/=4は動かないが、定義した範囲は動く
sec -p 1.5;            // 遅延
r2+=.4;
sec -p 1.5;            // 遅延
r1=10+r1/3;

セル範囲を指定する列範囲変数に対する直接計算がサポートされています。例えば、

range aa = Col(A)[10:19]; // Row 10 to 19 of column A
aa += 10;                 // aaの全ての要素が10増加します

列内の部分範囲のサポートが拡張されました。

// 列1の7行目から13行目と列2の3行目から4行目で構成される範囲
// 括弧とカンマの区切りを使用
range rs = (1[7:13], 2[3:4]); 
del rs; // Sv8.0 SR6以降でサポート

 
//  部分範囲間をコピー
range r1 = 1[85:100];
range r2 = 2;
// r1 を列2の先頭にコピー
r2 = r1; //  v8.1でサポート
// v8.1も部分範囲に完全/不完全コピー
range r2 = 2[17:22];
r2 = r1; // r1から6つの値のみコピー
range r2 = 3[50:200];
r2 = r1; // 元は16個の値があるので、65行までのみコピー

動的な範囲の割り当て

変数の列番号や他の範囲変数の名前を使って、実行時に自動で新しい範囲を作成できることが有益な場合があります。

列インデックスについての式を使用して新しい範囲を定義

wcol()関数は、次のように実際の列インデックスを実行時に解決できるようにするために使用します。

int nn = 2;
range aa=wcol(2*nn +1);

既存範囲を使って新しい範囲を定義

次のスクリプトは、%( ) 置換表記wks (オブジェクト)メソッドを使って、別の範囲変数に基づいた1つの範囲を作成する方法を示しています。範囲変数で%( ) 置換が使用されると、範囲文字列に解決されます。%()はスキップする場合もあります。

range rpage=[book1] //ページの範囲変数を定義
range rwks = %(rpage)sheet1!; //%(rpage)に基づいて rwks を定義

type %(rwks); //範囲文字列 [book1]sheet1! を出力

range r1= rwks!A; //rwksに基づいてr1を定義。%(rwks)A も機能しますが%() はスキップ
type %(r1); //範囲文字列[Book1]Sheet1!Aを出力
r1=data(0,100,2); //r1に0, 2, 4, ..., 100を入力

range subr1=r1[10:20] //r1に基づいてsubr1を定義。%()はスキップ、%(r1)[10:20] も機能する
type %(subr1); //範囲文字列出力 [Book1]Sheet1!A[10:20]

より高いレベルの範囲に基づいて新しい範囲を作成するこの方法は、コードの集中化に非常に役立ちます。

rpage.longname$="My Book"; //ページロングネームを再命名
rwks.addcol();//指定したシートに列を追加
range r2 = rwks!wcol(rwks.ncols); //r2をrwksの最後列 (右端) として定義
r2=subr1; // r2をsubr1の値で埋める

0を使用して最後の行/列/シートを参照

0表記は、ある範囲の最後のインデックス(最後の行、最後の列、または最後のシート)を参照します。例えば、

range rsheet=0!; //最後のシート
range right = 0!0; //最後のシートの最後(右端)の列
range sub = 0!0[10:0]; ///最後のシートの行0から最終列の最終行までのセル
range r2 = [Book1]Sheet1!2[3]:0[0]; //2列目3行目から最終列最終行まで

Xファンクション引数

多くのXファンクションが引数として範囲を使っています。例えば,statsXファンクションはベクトルを入力とし,指定した範囲について記述統計量を計算します。以下のように入力できます。

stats [Book1]Sheet2!(1:end); // book1の2シート目の統計量
stats Col(2);                // アクティブなワークシートの列2の統計量
 
// 列1-2, 5-10行目のセルブロックの統計量
stats 1[5]:2[10];

あるいは、範囲変数を定義したあと範囲変数を引数として使用することもできます。

// 1枚目と2枚目のシートのcol(2)の3行目から5行目までのセルに範囲変数を定義
range aa = (1,2)!col(2)[3:5]; 
//範囲に統計を実行
stats aa;

そして、このXファンクションの入力ベクター引数は、範囲変数で指定します。

Xファンクションの中にはXYRangeと呼ばれる特別なタイプの範囲を使用するものがあり、これは基本的にXとY、そしてエラーバーの範囲を含む複合的な範囲です。
XYRangeの一般的なシンタックスはこのようになります。

(rangeX, rangeY)

ただし、rangeX 部分をスキップして、標準の範囲表記を使用して XYRange を指定することもできます。この場合、デフォルトの Xデータが仮定されます。
次の2つの表記はXYRangeと同じです。

(, rangeY)
rangeY

例えば、nteg1 Xファンクションは、入力と出力の両方で XYRange を使います。

// col(1) をX、col(2)をYとして積分
// 列3をX, 列4をYとして積分曲線を出力
integ1 iy:=(1,2) oy:=(3,4);
 
// 結果の積分曲線を列3にY, 列1の入力Xを共有することを除き、
// 上記と同じ
integ1 iy:=2 oy:=3;

範囲変数の一覧、削除、変換

範囲変数の一覧

listLabTalk コマンドを使用して、範囲変数を含むすべてのセッション変数の名前とその定義済み本体のリストを出力します。例えば、

list a; // すべてのセッション変数を一覧表示

コマンドウィンドウでこのコマンドを発行すると、次のようなリストが出力されます。

Session:
 1       MYRANGE   [book1]sheet1!col(b)
 2         MYSTR  "abc"
 3            PI   3.1415926535898

Origin8.1以降、特定のセッション変数を一覧表示するためのスイッチが追加されました (以下を参照してください)。

オプション リストで得られるもの オプション リストで得られるもの
a すべてのセッション変数 aa 文字配列(セッション)
ac 定数(セッション) af ローカル関数(セッション)
afc 全てのコンテンツを含んだローカル関数(セッション) afp ローカル関数のプロトタイプ(セッション)
ag グラフオブジェクト(セッション) ar 範囲変数(セッション)
as 文字列変数(セッション) at ツリー変数(セッション)
av 数値変数(セッション) -- --

範囲変数の削除

範囲変数を削除するには、-ra スイッチを指定して del LabTalk コマンドを使用します。 例えば、

range aa=1;  // aa = アクティブワークシートのCol(1)
range ab=2;  // ab = アクティブワークシートのCol(2) 
range ac=3;  // ac = アクティブワークシートのCol(3) 
range bb=4;  // bb = アクティブワークシートのCol(4) 
list a;      //aa, ab, ac, bbを含むすべてのセッション変数を一覧表示
del -ra a*;  // 文字"a"で始まるすべての範囲変数を削除
 
// 最後のコマンドは aa, ab, acを削除

次の表に、変数を削除するためのオプションを示します。

オプション 削除/クリアされるもの オプション 削除/クリアされるもの
ra すべてのローカル/セッション変数 al -raと同じ
rar 範囲変数 ras 文字列変数
rav 数値変数 rac 定数
rat ツリー変数 raa 文字列配列
rag グラフオブジェクト raf ローカル/セッション関数

範囲をUIDに変換

各Originオブジェクトは、ショートネーム、ロングネーム、ユニバーサル識別子(UID)を持ちます。 範囲変数とそのUID間を変換することができ、関数 range2uid, uid2name, uid2rangeを使って、ページとレイヤの名前を取得できます。 使用例については、LabTalkオブジェクト をご覧下さい。

特別な範囲表記

複数シートを指定

複数のシートを参照する場合は、ワークシートのデータ範囲文字列の一般的な形式を使用し、カンマとコロンを組み合わせて範囲を指定します。


[Workbook](SheetA,SheetN:SheetM)!colBegin[rowIndex]:colEnd[rowIndex]

// 3つの範囲の基本的な組合せ
(range1, range2, range3)  

// 複数シートからの共通の列
(sheet1,sheet2,sheet3)!range1
(sheet1,sheet3:5)!range1
 
// シート範囲からの共通の列範囲  
(sheet1:sheetn)!range1

例えば、

// 2つのシートから A(X)B(Y) を同じグラフにプロット
plotxy (1:2)!(1,2); 
 
// ワークブックを再びアクティブにし、シートを追加して、それらにデータを入力
//2行目から10行目までの全てのシートからA(X)B(Y)をプロット
plotxy (1:end)!(1,2)[2:10];
// アクティブなブック内のすべてのワークシートをブック内の新しいシートに追加
wappend irng:=(1:end)!;

詳細は、下の複合範囲を参照してください。

XY、XYZ Range

特定の X ファンクションへの入力として設計された XY Rangeは、ワークシートの 2 つの列を XY データとして指定する順序付けられたペアです。また、XY部分範囲は、X値を使用して指定できます。同様に、(XYZ Range) は、XYZ データを表す 3 つのワークシート列を含む順序付きトリプルです。


例えば、fitpolyX ファンクションは、入力と出力の両方に XY Rangeを使います。

// 1 列目と 2 列目の XY データに 2 次多項式を当てはめます。
// 係数を3列目に、XYフィットデータを4,5列目に入れます。
fitpoly iy:=(1,2) polyorder:=2 coef:=3 oy:=(4,5);

Xで # や ? を使ったXY Range

Xファンクションの引数として範囲を使うため (8.0 SR3) で2つの特殊文字'?' と '#' が導入されました。''?'は、強制的にワークシート指定を使用することを示し、範囲指定が要件を満たさない場合は、失敗します。'#' は、範囲が指定を無視し、行番号をX指定として使用することを意味します。 ただし、Y列がサンプリング情報まで持っている場合は、そのサンプリング情報を使ってXを提供します。

例えば、

plotxy (?, 5);        //  col(5) がX 列であった場合、呼び出しに失敗します
plotxy (#, 3);        // col(3) を Y としてプロットし、行番号を X として使用します

これらの表記法は、plotxyXファンクションにおいて特に便利ですので、ここで紹介します。

//  ワークシートのすべての列を列指定でプロットする。
plotxy (?,1:end);

範囲出力のタグ表記

多くのXファンクションは、テンプレート名前インデックスなどのタグで出力範囲を変更することができます。 以下は、離散周波数Xファンクション、discfreqsで使用できる例です。

discfreqs irng:=1 freq:=1 rd:="[Result]<new template:=table.otw index:=3>";

これは、TABLE.OTWというテンプレートをロードして、Resultというワークブックの3番目のシートに直接出力されます。

タグ表記のサポートは特定のXファンクションに依存するので、プロダクションコードに含める前にタグ表記がサポートされていることを確認してください。

複合範囲

複合範囲は、複数の部分範囲で構成される範囲です。 以下の構文で複合範囲を構築することができます。

// 3つの範囲の基本的な組合せ
(range1, range2, range3)         

// 複数シートからの共通の列
(sheet1,sheet2,sheet3)!range1
(123)!range1

//シート範囲からの共通の列範囲 
(sheet1:sheet3)!range1           
(1:3)!!range1

この動作を示すために、wcellcolorXファンクションを使って範囲を表示し、plotxyを使ってXYRangeを表示します。少なくとも4つの列が数値データで入力されているアクティブなブック/シートを操作しているものとします。

//  いくつか異なるブロックを青にする

wcellcolor (1[1]:2[3], 1[5]:2[5], 2[7]) color(blue); 
 
// その内いくつかをフォントの色を赤にセット
wcellcolor (1[3]:4[5], 2[6]:3[7]) color(red) font;

plotxyを試すには、最初のシートにいくつか数値を入れ、新しいシートを追加し、2番目のシートにはより多くの数値を入れます。

// 両方のシートから A(X)B(Y) を同じグラフにプロット
plotxy (1:2)!(1,2); 
 
// ワークブックを再びアクティブにし、シートを追加して、それらにデータを入力
//2行目から10行目までの全てのシートからA(X)B(Y)をプロット
plotxy (1:end)!(1,2)[2:10];

Note: 複合範囲には特有の不明瞭さがあります。例えば、(r1,r2)のように範囲 r1 と範囲 r2 で構成される範囲、 r1r2という名前の列で構成される XY範囲、例えば、(r1,r2)です。 したがって、ある範囲変数にどのような種類のオブジェクトが割り当てられているかを覚えておくことが重要です!