前のトピック     次のトピック

第 4 章 VISIO の数式

セクション 3   Visio 数式の設計

Visio® 数式を有効に設計するには、構文が正しいだけでは不十分です。シェイプ開発者は、シェイプのデフォルト数式の取り出し元、特定セルに数式を保存することの利点と不利な点、カスタムの数式を不注意な変更から保護する方法、最高のパフォーマンスを得るための数式再計算の制御方法を理解する必要があります。

このセクションの内容...

シェイプの数式の継承方法

ユーザー定義セルと「スクラッチ」数式

数式の保護

数式の再計算の制御

シェイプの数式の継承方法

シェイプシート (ShapeSheet®) ウィンドウを開いた場合、マスタシェイプあるいはスタイルから継承した数式がセルに表示されている場合があります。シェイプのあらゆる数式のコピーをローカルに作成するのではなく、マスタシェイプのインスタンスが、マスタシェイプとマスタシェイプに適用されるスタイルから数式を継承します。この方法には 2 つの利点があります。これによって、マスタシェイプの数式あるいはスタイル定義をすべてのインスタンスに反映するように変更できます。また、継承された数式はマスタシェイプで 1 度開くだけですみ、インスタンスごとに開く必要がないので、Visio ファイルを小さくすることができます。

このようなセルに数式を入力すると、継承式はローカル式で上書きされます。ローカルの数式を持つセルは、マスタシェイプからの数式を継承したり、マスタシェイプの数式変更がインスタンスのセルに反映することはなく、シェイプが使用する図面のストレージは大きくなります。スタイルは例外です。スタイルを使用する際にローカルのオーバーライドを保つように選択しておかない限り、スタイルは、毎回対応する シェイプシート セルに新しい数式を書き込みます。詳細については、「第 10 章 スタイル、書式、色の管理」を参照してください。)

数式がローカルであるか、継承したものであるかはテキストの色で知ることができます。セルのテキストが黒の場合は継承式です。青のテキストは、ローカル式であることを示します。つまり、シェイプシート ウィンドウの数式の編集結果、あるいは数式を変更することになったシェイプへの何らかの変更 (たとえば、図面ウィンドウでのサイズ変更) を示します。

継承式をセルに復元するには、ローカル式を削除します。式はマスタシェイプからの対応する数式と置換されます。


  Visio 製品の旧バージョンでは、図形座標数式は常にローカルでした。Visio 2000 では、図形座標数式はマスタシェイプから継承されます。つまり、シェイプの図形座標がローカルに変更されると、継承式のコピーが作成され、シェイプが使用するストレージが大きくなります。Visio 図面をサイズ的に小さくしておくには、シェイプがマスタシェイプから継続して継承されるように、図面ステンシルのマスタシェイプの継承数式を変更します。オートメーションを使用して、シェイプの [図形座標] 数式を変更するソリューションは、設計しなおす必要があります。


TOP へ

ユーザー定義セルと「スクラッチ」数式

シェイプシート セクションのほとんどには事前に定義された目的があります。セルは特定のシェイプ属性あるいは動作を制御します。ただし、中間の計算を行う数式を簡単にするか、他の数式あるいはアドオンで使用される値を保存する必要のある場合があります。オブジェクトの [ユーザー定義セル] セクションまたは [スクラッチ] セクションに、このような数式や値を保存することができます。これらのセクションを シェイプシート ウィンドウに追加するには、[挿入] メニューから [セクション] を選択し、追加するセクションをオンにします。

[ユーザー定義セル] セクションと [スクラッチ] セクションのセルは、特定のシェイプ属性あるいは動作を制御することはないので、これらのセルのいずれか、あるいは両方を使用して数式をその中に設定することができます。ただし、どちらかを選択した方がよい場合もあります。


  シェイプのセルがオートメーションを使用してアクセスされる場合は、数式を [スクラッチ] セルではなく、ユーザー定義セルに設定してください。[スクラッチ] セルにはあらゆるプログラムから書き込むことができるので、設定した数式は上書きされてしまうことがあります。固有名のセルでは、その可能性は低くなります。


ユーザー定義セル

[ユーザー定義セル] セクションに値と名前を指定したセルを追加することができます。ユーザー定義セルには、他の数式で参照される定数やアドオンで使用される計算などのあらゆる数式を設定することができます。たとえば、マスタシェイプはぺージのユーザー定義セルを参照することができます。マスタシェイプのインスタンスが作成されると、ぺージにすでにユーザー定義セルがある場合は、このインスタンスはインスタンスのあるぺージのユーザー定義セルを参照します。そのぺージに該当セルがない場合は、マスタシェイプからコピーされます (図面内のユーザー定義セルの場合も同様です)。シェイプ開発者は転送先にユーザー定義セルがあるかどうかを確認する必要がないので、この機能によりユーザー定義セルは非常に移植性が高くなります。シェイプがそのセルを必要とする場合は、セルはそこに存在します。

ユーザー定義セルに付ける名前は、セクション内で一意である必要があります。同一シェイプのユーザー定義セルの値を参照するには、「User.name」の構文を使用します。たとえば、「User.Constant」と参照します。

別のシェイプ、ぺージ、図面のユーザー定義セルを参照するには、「User.name」の前に該当範囲を付けます。例を次に示します。

Sheet.2!User.Constant
ThePage!User.Constant
TheDoc!User.Constant


ヒント  [User.Prompt] セル、[Action.Prompt] セル、その他の特定セルは、デフォルトで特定の文字列になるように設計されています。シェイプシート ウィンドウにこれらのセルを入力すると、テキストは自動的に引用符で囲まれます。数式を等号 (=) から始めて、Visio に数式として認識させます。オートメーションを使用してこれらのセルのどれかの数式を設定している場合には、Visio は自動的にはテキストを引用符で囲みません。


スクラッチセル

[スクラッチ] セクションには、X、Y と、A から D までのラベルがつけられた 6 つの列があります。X セルと Y セルは図面の測定単位を使用するので、これらのセルには寸法あるいは図形の座標に関する計算を入れます。A から D までのセルは固有の単位がなく、これらの結果の種類を示すために使用するのが妥当です。[スクラッチ] セクションのセルを参照するには、セクション名と列・行のラベルを、たとえば、Scratch.A1 のように指定します。

[スクラッチ] セルは、あるシェイプにとってローカルで、オートメーションが関与していない中間計算を一時的に保存するような場合に最適です。[スクラッチ] セルはユーザー定義セルなどのような内容を表す名前を付けることはできず、また、移植性もありません。シェイプがぺージあるいは図面の [スクラッチ] セルを参照しており、このシェイプを別のぺージあるいは図面にコピーした場合、元のぺージまたは図面からの [スクラッチ] 数式はコピー先にはコピーされないので、この参照数式は #REF エラーとなります。

TOP へ

数式の保護

それぞれの シェイプシート セルの数式を保護する方法としては、GUARD 関数を使用して変更不可にするしかありません。GUARD 関数は、セルの数式全体を保護することはできますが、数式の一部だけを保護することはできません。図面ウィンドウのアクションは、GUARD 関数で保護された数式を上書きすることはできません。GUARD 関数では、次の構文を使用します。

GUARD(式)

ここで、「式」は保護対象の数式です。GUARD 関数で保護されている数式も、GUARD 関数で保護されていない数式と全く同じ結果を得られます。

シェイプが、移動、サイズ変更、グループ化、あるいはグループ解除されると、Visio によって シェイプシート セルに変更が書き込まれ、カスタムの数式は上書きされます。このような操作の影響を受けやすいセルは、[図形情報] セクションの [Width]、[Height]、[PinX]、[PinY]です。たとえば、シェイプを反転しないようにするには、次のような数式を入力できます。

FlipX = GUARD(FALSE)
FlipY = GUARD(FALSE)

図面ウィンドウの 1 つのアクションが複数の シェイプシート セルに影響することもあります。シェイプに対する予定外の変更を禁止する場合は、これらのセルそれぞれの数式をガードする必要があります。もちろん、ユーザーがシェイプシートのセクションを削除すると、ガードされている数式も含めて、このセクション内のすべての数式が削除されます。

TOP へ

数式の再計算の制御

デフォルトでは、別のセルを参照する数式は、参照先セルが変更されたときに再計算されます。たとえば、ある数式が、シェイプの [PinX] セルを参照しており、そのシェイプがぺージ上で移動した場合は、[PinX] が変更されるので、この数式は再計算されます。多くの場合、これは意図したとおりに動作し、Visio 数式はこのパワーと多様性に大きく依存しています。

再計算の中には、単純な原因と結果だけに見えるものもありますが、多くの要因が数式の再計算順序に影響を及ぼします。特定の再計算順序に依存することのないように、数式を作成してください。

ただし、すべての再計算が必要なわけではありません。たとえば、SETF 関数は別のセルに数式を設定することができる強力な関数ですが、この関数をトリガする条件が発生するまでは再計算の必要はありません。しかし、数式が頻繁に変更されるセルを参照する場合は、不必要でも頻繁に再計算される場合があります。再計算は、時間がかかり、シェイプのパフォーマンスに影響します。

不要な再計算をなくし、ソリューションのパフォーマンスを向上させるには、次の関数のどちらかで、セル参照を囲んでください。

GETREF の大きな利点は、ターゲット セル参照を引用符で囲む必要がないということです。Visio 旧バージョンの製品では、SETF 関数で使用するターゲットセル参照は、引用符で囲む必要があったので、ソリューションのローカライズの際に数式を翻訳することが必要でした。

GETREF と GETVAL はどちらも、セル参照が変更された場合、数式によるセル参照の追跡ができます。たとえば、先行の行が削除されたり、セル自体が削除された場合に、参照先セルが変更されたときにも参照元数式は再計算されません。

たとえば、次の数式は [Width] が変更されると再計算されますが、[PinX] と [PinY] が変更された場合には再計算されません。

= GETVAL(PinX) + GETVAL(PinY) + Width

次の数式は、SETF 関数を含むセルが (たとえば、ユーザーがショートカット メニューからアクションを選択することによって) トリガされると再計算されますが、[PinX] が変更されても再計算されません。

= SETF(GETREF(PinX), 7)

Top