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

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

セクション 2   セクションおよび行の操作

セクションおよび行を追加、または削除して、図形、スタイル、ページ、マスタシェイプ、または図面ファイルの特定の特性を変更することができます。セクション内または行内で反復処理を実行して、すべての図形の [図形座標] 数式の一覧表示などのように、各項目に対して同じ操作を実行することもできます。

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

セクションおよび行の追加

図形への [図形座標] セクションの追加 : 例

セクションおよび行の削除

線分の種類の変更

セクションおよび行のコレクション内での反復処理 : 例

セクションおよび行の追加

多くの場合、セクション全体を図形に追加します。たとえば、[図形座標] セクションを追加して複数のパスを持つ図形を作成したり、[スクラッチ] セクションを追加して複雑な数式を作成するための作業領域として使用する場合があります。新しく追加したセクションを使用する前に、少なくとも 1 つの行をセクションに追加する必要があります。追加する行の種類によっては、行内にセルの数式の設定が必要な場合もあります。

セクションを追加するには、Shape オブジェクトの AddSection メソッドを使用します。たとえば、[スクラッチ] セクションを図形に追加するには、次のように記述します。

shpObj.AddSection visSectionScratch

セクションに行を追加するには、AddRow メソッドを使用して、セクション、行、および行タグを指定します。[図形座標] セクションに行を追加する場合は、行タグによって追加する行の種類を指定します。たとえば、visTagLineTo を使用して、[LineTo] 行を指定します。行タグの引数は、主に [図形座標] セクションに行を追加するために使用します。その他のほとんどのセクションでは、行タグ 0 をプレースホルダとして使用します。たとえば、[スクラッチ] セクションに行を追加するには、次のように記述します。

shpObj.AddRow visSectionScratch, visRowScratch + 0, 0

行タグ定数は、Visio® タイプ ライブラリの VisRowTags で定義されています。次の表は、行タグとその行タグがシェイプシート (ShapeSheet®) ウィンドウの [図形座標] セクションで表される行を示しています。

行タグ [図形座標] の行
visTagComponent 表示プロパティ
visTagMoveTo [MoveTo] 行 (開始行の [X] セルと[Y] セル)
visTagLineTo [LineTo] 行
visTagArcTo [ArcTo] 行
visTagEllipticalArcTo [EllipticalArcTo] 行
visTagSplineBeg [SplineStart] 行
visTagSplineSpan [SplineKnot] 行
visTagEllipse [Ellipse] 行
visTagInfiniteLine [InfiniteLine] 行
visTagPolylineTo [PolylineTo] 行
visTagNURBSTo [NURBSTo] 行

[図形座標] セクション以外は、複数のセクションを 1 つの図形に含めることはできません。既に図形に特定のセクションが存在するときに、セクションを追加しようとすると、エラーが発生します。SectionExists プロパティを使用すると、図形にセクションが存在するかどうかを確認してから、必要に応じてセクションを追加することができます。


visSectionCharactervisSectionParagraphvisSectionTextField、または visSectionTab セクションに行を追加したり、これらのセクションから行を削除することはできません。


TOP へ

図形への [図形座標] セクションの追加 : 例

Visio 図面の基本図形 (シェイプ) は、任意の数のコンポーネント、つまりパスで構成されます (コンポーネントまたはパスが存在しない基本図形もあります)。各パスは、一連の接続した線分です。ほとんどの図形の線分は、線または円弧 (または楕円弧) です。各パスは、[図形座標] セクションで表され、各線分は、[図形座標] セクションの行で表されます。

図形に [図形座標] セクションを追加するには、visSectionFirstComponent を指定した AddSection メソッドで、既存の [図形座標] セクションの前にセクションを挿入するか、visSectionLastComponent を指定した AddSection メソッドで、既存の [図形座標] セクションの後にセクションを追加します。たとえば、既存の [図形座標] セクションの後に [図形座標] セクションを追加するには、次のように記述します。

shpObj.AddSection visSectionLastComponent

[図形座標] セクションを追加したら、セクションに少なくとも 2 行を追加する必要があります(プログラムからセクションを追加した場合、行は自動的に追加されません)。AddRow メソッドには次の行タグを指定します。

visTagLineTovisTagArcTovisTagEllipticalArcTovisTagMoveTovisTagPolylineTo、または visTagNURBSTo の行タグを使用すると、さらに頂点行を追加することができます。各頂点行は、頂点のローカル座標、および頂点とその頂点と前の頂点を接続する線分の種類を定義します。

行タグ visTagSplineBeg および visTagSplineSpan を使用して、スプライン行を追加することができます。スプライン開始行 (visTagSplineBeg) の前に、開始行 (visTagMoveTo) または頂点行を置き、visTagSplineSpan を使用してスプライン ノット行を追加します。

次のプロシージャは、[図形座標] セクションを図形に既に存在する [図形座標] セクションの前に挿入しています。まず、コンポーネント行、[MoveTo] 行、および 4 つの [LineTo] 行を追加しています(これらは、通常、直線を定義するために必要な行です)。次に、図形の幅 - 高さボックスを斜めに横切る線を描くように、各行のセルの数式を設定しています。

Sub AddGeometry ()
     Dim shpObj As Visio.Shape
     Dim iSection As Integer
     Dim i As Integer

     'Set an error handler to catch the error if no shape is selected
     On Error GoTo errNoShp
     Set shpObj = ActiveWindow.Selection(1)
     On Error GoTo 0

     iSection = shpObj.AddSection(visSectionFirstComponent)
     shpObj.AddRow iSection, visRowFirst + 0, visTagComponent
     shpObj.AddRow iSection, visRowVertex + 0, visTagMoveTo
     For i = 1 To 4
          shpObj.AddRow iSection, visRowVertex + i, visTagLineTo
     Next i
     shpObj.CellsSRC(iSection, visRowVertex + 0, visX).Formula = "Width * 0.25"
     shpObj.CellsSRC(iSection, visRowVertex + 0, visY).Formula = "Height * 0.5"
     shpObj.CellsSRC(iSection, visRowVertex + 1, visX).Formula = "Width * 0.5"
     shpObj.CellsSRC(iSection, visRowVertex + 1, visY).Formula = "Height * 0.25"
     shpObj.CellsSRC(iSection, visRowVertex + 2, visX).Formula = "Width * 0.75"
     shpObj.CellsSRC(iSection, visRowVertex + 2, visY).Formula = "Height * 0.5"
     shpObj.CellsSRC(iSection, visRowVertex + 3, visX).Formula = "Width * 0.5"
     shpObj.CellsSRC(iSection, visRowVertex + 3, visY).Formula = "Height * 0.75"
     shpObj.CellsSRC(iSection, visRowVertex + 4, visX).Formula = "Geometry1.X1"
     shpObj.CellsSRC(iSection, visRowVertex + 4, visY).Formula = "Geometry1.Y1"
     'Exit the procedure bypassing the error handler
     Exit Sub
errNoShp:
     MsgBox "Please select a shape then try again.", vbOKOnly, DVS_TITLE
End Sub

次の図は、[図形座標] セクションの挿入前と挿入後の図形を示しています。

 



図形への [図形座標] セクションの挿入

オフセットなし、つまり 0 のオフセットを指定した visRowVertex は、[MoveTo] 行を参照します。頂点行を追加する場合は、1 以上のオフセットを visRowVertex に追加し、誤って [MoveTo] 行を置き換えないようにします。[MoveTo] 行を置き換えると、図形が予想外の動作をする可能性があります。1 つの [図形座標] セクションにさらに [MoveTo] 行を挿入すると、破断を作成することができます。[図形座標] セクションの数式を操作する方法の詳細については、「第 5 章 数式を用いた図形座標の制御」を参照するか、Visio 製品付属のオンライン ヘルプ「[図形座標] セクション」を検索してください。

TOP へ

セクションおよび行の削除

セクションを削除すると、そのセクションのすべての行およびセルは自動的に削除されます。visSectionObj 以外のセクションはすべて削除できます。また、visSectionObj セクションからも、行を削除することは可能です。セクションを削除するには、Shape オブジェクトの DeleteSection メソッドを使用します。たとえば、次のステートメントでは、図形の [スクラッチ] セクションを削除しています。

shpObj.DeleteSection visSectionScratch

存在しないセクションを削除しようとしても、エラーは発生しません。

また、visSectionParagraphvisSectionCharactervisSectionTextField、および visSectionTab 以外のセクションから、行を削除することもできます。たとえば、図形の [図形座標] セクションから、頂点を定義する行を削除することで、図形から頂点を削除することができます。次のステートメントでは、長方形の最後の頂点を削除しています。

shpObj.DeleteRow visSectionFirstComponent + 0, visRowVertex + 3

 



頂点行の削除

  1. この頂点は、visRowVertex + 3 で表されています。
  2. 頂点行を削除すると、図形の外観が変化します。

TOP へ

線分の種類の変更

線分を表す行の種類または行を設定することで、線分を線、円弧、楕円弧、スプライン、楕円、無限線、ポリライン、MoveTo、または NURBS として、定義することができます。プログラムからこれを定義するには、Shape オブジェクトの RowType プロパティを設定します。

たとえば、次のステートメントでは、図形の最初の線分を線に変換しています。

shpObj.RowType(visSectionFirstComponent + 0, visRowVertex + 1) = visTagLineTo

 



頂点行の行の種類の変更

  1. この円弧は、visRowVertex + 1 で表されています。
  2. 行の種類を変更すると、図形の外観が変化します。

TOP へ

セクションおよび行のコレクション内での反復処理 : 例

複数のセクションまたは行内で反復処理を実行することで、複数のセクションまたは行に対して同じ操作を実行することができます。これを実行するには、Shape オブジェクトの次のプロパティを使用して反復ループを制限します。

次の例では、まず、図形の [図形座標] セクションの行およびセル間で反復処理を実行し、CellsSRC を使用して各セルを取得します。次に、各セルの数式をユーザー フォームのリスト ボックスに表示します。

Sub IterateGeometry ()
     'This example assumes the active
     'page contains a shape
     Dim shpObj As Visio.Shape
     Dim curGeomSect As Integer
     Dim curGeomSectIndx As Integer
     Dim nRows As Integer
     Dim nCells As Integer
     Dim curRow As Integer
     Dim curCell As Integer
     Dim nSects As Integer




     'Shape object
     'Section number for accessing geometry section
     'Loop variable for geometry sections
     'Number of rows in section
     'Number of cells in row
     'Current row number (0 based)
     'Current cell index (0 based)
     'Number of geometry sections in shape

     Set shpObj = ActivePage.Shapes(1)
     UserForm1.ListBox1.Clear
     nSects = shpObj.GeometryCount
     For curGeomSectIndx = 0 To nSects - 1
          curGeomSect = visSectionFirstComponent + curGeomSectIndx
          nRows = shpObj.RowCount(curGeomSect)
          For curRow = 0 To (nRows - 1)
               nCells = shpObj.RowsCellCount(curGeomSect, curRow)
               For curCell = 0 To (nCells - 1)
                    UserForm1.ListBox1.AddItem _
                    shpObj.CellsSRC(curGeomSect, curRow, curCell).LocalName & _
                    ": " & shpObj.CellsSRC(curGeomSect, curRow, curCell).Formula
               Next curCell
          Next curRow
     Next curGeomSectIndx
     UserForm1.Show
End Sub

論理位置定数の一覧表については、「付録 B シェイプシートのセクション、行、セル インデックス」を参照してください。

Top