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

第 17 章 数式のオートメーション化

セクション 1   セルの数式の操作

Visio® オブジェクト モデルでは、Shape オブジェクトには数多くのセルがあり、各セルに含まれる数式の値によって、オブジェクトの表示状態または動作状態が決定します。

 



Visio オブジェクト モデルの Cell オブジェクトとその上位オブジェクト

たとえば、プログラムから Shape オブジェクトの幅を変更するとします。Visio オブジェクト モデルの Shape オブジェクトでは、幅プロパティは公開されていません。ただし、図形の幅を定義するセルへの参照を取得することで、図形の幅を修正することができます。図形の幅を定義する Cell オブジェクトへの参照を取得したら、その数式を取得して設定することができます。このようにして、オブジェクトのシェイプシート (ShapeSheet®) ウィンドウで使用できるすべての機能は、オートメーションでも使用できます。

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

Cell オブジェクトの取得

Formula プロパティを使用したセルの数式の変更

数式の結果の取得

結果による数式の置き換え

保護された数式のオーバーライド

数式を使用した図形の移動 : 例

Cell オブジェクトの取得

セル名、セクション インデックス、行インデックス、またはセル インデックスで、コレクションから Cell オブジェクトを取得することができます。取得した Cell オブジェクトのメソッドおよびプロパティを使用して、セルの数式またはその値を取得したり、設定できます。

名前による Cell オブジェクトの取得

Cell オブジェクトを取得するには、Shape オブジェクトの Cells プロパティを使用して、セル名を指定します。Cells プロパティには、任意の有効なセル参照を使用できます。

たとえば、図形の [PinX] セルを取得するには、次のように記述します。

Set pinXCellObj = shpObj.Cells("PinX")

図形の 4 番目の接続ポイントの Y 座標を取得するには、次のように記述します。

Set conYCellObj = shpObj.Cells("Connections.Y4")

これらの例では、コレクションから Cell オブジェクトを名前で指定して取得しています。指定に使用しているセル名は、シェイプシート ウィンドウに表示される名前と同じです。

セクション インデックス、行インデックス、およびセル インデックスによる Cell オブジェクトの取得

セクション インデックス、行インデックス、およびセル インデックスで任意のセルを取得するには、CellsSRC プロパティを使用します。

たとえば、図形の [文字の書式] セクションの先頭行の [Font] セルを取得するには、次のように記述します。

Set fontCellObj = shpObj.CellsSRC (visSectionCharacter, visRowCharacter + 0, visCharacterFont)

セクションに複数の行が含まれており、2 行目以降のセルを参照したい場合は、そのセクションの行定数に整数オフセットを追加します。セクションの先頭行を取得する場合はオフセットなしで行定数を使用できますが、行定数を基数として、先頭行が 0 で始まるオフセットを行定数に追加することを習慣にしておくことをお勧めします。例を次に示します。

visRowScratch + 0
visRowScratch + 1
visRowScratch + 2

'First row of the Scratch section
'Second row of the Scratch section
'Third row of the Scratch section

セクションや行に対して操作を行った結果、ほかのセクションや行の位置が変化することがあります。たとえば、[スクラッチ] セクションに 3 つの行がある場合、2 行目を削除すると、3 行目はシフトして 2 行目になります。その結果、そのセクションに 3 行目が存在しないため、visRowScratch + 2 は無効な参照になります。

セクション インデックスおよび行インデックスを使用して、セクションを図形に追加したり、図形から削除したり、セクションの行間で反復処理を実行することもできます。


Visio 5.0 では、[Geometryn.NoFill] セルと [Geometryn.NoShow] セルは、シェイプシート ウィンドウの [図形座標] セクションの開始行の 3 番目と 4 番目のセルに表示され、それぞれ、[Geometryn.A1] および [Geometryn.B1] (Visio 5.0 以前のバージョンでは、それぞれ、[Geometryn.X0] および [Geometryn.Y0]) という名前が付いていました。これらのセルはどちらの名前でも参照できます。


ユーザー定義セルまたはカスタム プロパティ セルの取得

ユーザーまたはシェイプ開発者が名前を付けたセルが図形に含まれることがあります。ユーザー定義セルは、図形の [ユーザー定義セル] セクションで定義されます。カスタム プロパティ セルは、図形の [カスタム プロパティ] セクションで定義されます。[ユーザー定義セル] セクションまたは [カスタム プロパティ] セクションの各行には、ユーザー定義セルまたはプロパティの値が格納される [Value] セル、および文字列を格納できる [Prompt] セルがあります。カスタム プロパティ行には、カスタム プロパティの使用方法を制御する追加のセルがあります。

[Value] セルはユーザー定義セル行またはカスタム プロパティ行のデフォルトのセルであるため、行のセクションと名前を指定するだけで取得できます。たとえば、[Vanishing_Point] という名前のユーザー定義セルの [Value] セルを取得するには、次のように記述します。

Set celObj = shpObj.Cells("User.Vanishing_Point")

ユーザー定義セルの行またはカスタム プロパティの行のその他のセルを取得するには、セルの名前を指定する必要があります。たとえば、[Serial_Number] という名前のカスタム プロパティ行の [Prompt] セルを取得するには、次のように記述します。

Set celObj = shpObj.Cells("Prop.Serial_Number.Prompt")

シェイプシート ウィンドウのカスタム プロパティを定義する方法の詳細については、「第 7 章 図形動作の機能強化」の「セクション 3   ユーザー設定プロパティ」を参照してください。

TOP へ

Formula プロパティを使用したセルの数式の変更

セルの数式を変更するには、Cell オブジェクトの Formula プロパティに、そのセルに対して有効な数式である文字列を設定します。たとえば、図形の [LocPinX] セルの数式として = 2 * Width を設定するには、次のように記述します。

Set celObj = shpObj.Cells("LocPinX")
celObj.Formula = "2 * Width"

数式の文字列から等号を省略すると、数式に自動的に等号が追加されます。

たとえば、「inches」や「in.」ではなく「"」でインチが指定されている場合など、数式の文字列に二重引用符が含まれる場合は、二重引用符を 2 つ続ける ("") ことで、1 つの二重引用符のみが Visio エンジンに渡されます。また、カスタム プロパティ行の [Prompt] セルに数式を入力するには、次のように記述します。

shpObj.cells("prop.row_1.prompt").Formula = """Enter property"""

TOP へ

数式の結果の取得

すべてセルには数式があり、すべての数式は評価され、1 つの結果に導かれます。シェイプシート ウィンドウの [表示] メニューから [数式] または [値] を選択すると、数式の評価結果を表示できます。数式を表示している場合、セルには Width * 0.5 のような数式が表示されます。[Width] の値が 10cm のときに同じセルで値を表示すると、数式の計算結果が「5cm」と表示されます。

数式の結果を取得するには、次のプロパティを使用します。

たとえば、図形の回転の中心のローカル座標を決定する数式は、[LocPinX] セルと [LocPinY] に格納されます。次のステートメントは、[LocPinX] セル内の数式の結果を取得します。

Set celObj = shpObj.Cells("LocPinX")
localCenterX = celObj.Result("centimeters")

Result および ResultIU プロパティは、浮動小数点数を返します。特定の図形の数式の結果を取得する場合、特に図形の寸法または頂点を決定する数式の結果を取得する場合は、この精度のレベルを保持したいことがあります。これを実行するには、その結果を Variant 変数または Double 変数に代入します。これにより、四捨五入による誤差が発生する可能性が低くなり、その数値を使用して他の図面で図形を作り直す場合は、同じレベルの精度を維持することができます。

Visio エンジンで利用可能な任意の文字列を使用して、単位を指定することができます。Visio の内部単位を指定するには、Null 文字列 ("") を単位として指定するか、Result プロパティではなく ResultIU プロパティを使用します。

文字列で単位を指定する代わりに、Visio タイプ ライブラリで定義されている単位定数を使用することもできます。たとえば、単位としてセンチメートルを指定するには、次のように定数 visCentimeters を使用します。

localCenterX = celObj.Result(visCentimeters)

ページ用に定義された単位を指定するには visPageUnits を、図面用に定義された単位を指定するには visDrawingUnits を使用します。

他の結果プロパティと同様、ResultStr プロパティには単位引数を指定できるため、任意の単位間の変換を効率的に行うことができます。また、ResultStr を使用して、カスタム プロパティ行の [Prompt] セルなど、文字列を含むセルの数式にアクセスしたり、ユーザー インターフェースにコントロールを表示するために文字列を取得することもできます。

TOP へ

結果による数式の置き換え

図形のパフォーマンスを向上させるため、または数式を保持する必要がなくなったために、定数として示された結果で数式を置き換えたい場合があります。Visio エンジンでは、数式に関係する図形を変更するたびに、数式が評価されます。プログラムの実行中に数式が頻繁に評価されることによって、プログラムのパフォーマンスが大きく影響される可能性もあります。評価された結果で数式を置き換えるには、そのセルの Result プロパティを使用し、数式を設定します。セルの Formula プロパティを設定する操作にも似ていますが、数式を評価し、その結果に相当する定数をセルの新しい数式として簡単に指定できます。

たとえば、図形の [LocPinX] セルの数式が = 3 mm + 1 cm/2 であるとします。評価結果は 8 mm です。この数式を評価結果で置き換えるには、次のステートメントを使用します。

celLocPinX.Result("Centimeters ") = celLocPinX.Result("Centimeters ")

このステートメントを実行すると、[LocPinX] セルの数式は、= 8 mm になります。

数式内の依存関係の数を減らすことで、パフォーマンスを向上させることもできます。数式を設計する方法の詳細については、「第 4 章 Visio の数式」の「数式の再計算の制御」を参照してください。

TOP へ

保護された数式のオーバーライド

Visio には、セルの数式が変更されないように保護する GUARD という関数があります。セルの数式が GUARD 関数で保護されている場合は、FormulaResult、または ResultIU、といったプロパティを使用して数式を設定しようとすると、エラーが発生します。ただし、次のように別のプロパティを使用してセルの数式を変更することができます。

保護された数式をオーバーライドする場合は、注意が必要です。通常、シェイプの開発者は、ユーザーが誤ってマスタシェイプの動作を変更するのを防ぐため、マスタシェイプの数式を保護します。これらの数式をオーバーライドすると、シェイプが元の設計どおりに動作しなくなることがあります。

TOP へ

数式を使用した図形の移動 : 例

このサンプル プログラムは、2 次元 (2-D) 図形の Pin に数式を設定するか、1 次元 (1-D) 図形に始点と終点を設定して、アクティブなウィンドウ内で選択された図形を移動します。このプログラムが使用するユーザー フォームには、表示されたパラメータによって Nudge サブルーチンを呼び出す 4 つのボタンがあります。

Sub Nudge (dx As Double, dy As Double)
     'Call Nudge as follows:
     'Nudge 0, -1 (Move down one unit)
     'Nudge -1, 0 (Move left one unit)
     'Nudge 1, 0 (Move right one unit)
     'Nudge 0, 1 (Move up one unit)
     On Error GoTo lblErr
     Dim selObj As Visio.Selection
     Dim shpObj As Visio.Shape
     Dim unit As Double
     Dim i As Integer

     'Establish a base unit as one cm
     unit = 1
     Set selObj = ActiveWindow.Selection
     'If the selection is empty, there's nothing to do.
     'Otherwise, move each object in the selection by the value of unit
     For i = 1 To selObj.Count
          Set shpObj = selObj(i)
          Debug.Print "Nudging " ; shpObj.Name; " ("; shpObj.NameID; ")"
          If (Not shpObj.OneD) Then
               shpObj.Cells("PinX").ResultIU = (dx * unit) + shpObj.Cells("PinX").ResultIU
               shpObj.Cells("PinY").ResultIU = (dy * unit) + shpObj.Cells("PinY").ResultIU
          Else
               shpObj.Cells("BeginX").ResultIU = (dx * unit) + _
                    shpObj.Cells("BeginX").ResultIU
               shpObj.Cells("BeginY").ResultIU = (dy * unit) + _
                    shpObj.Cells("BeginY").ResultIU
               shpObj.Cells("EndX").ResultIU = (dx * unit) + shpObj.Cells("EndX").ResultIU
               shpObj.Cells("EndY").ResultIU = (dy * unit) + shpObj.Cells("EndY").ResultIU
          EndIf
     Next i
     Exit Sub
lblErr:
End Sub

Top