セクションおよび行を追加、または削除して、図形、スタイル、ページ、マスタシェイプ、または図面ファイルの特定の特性を変更することができます。セクション内または行内で反復処理を実行して、すべての図形の [図形座標] 数式の一覧表示などのように、各項目に対して同じ操作を実行することもできます。
このセクションの内容...
多くの場合、セクション全体を図形に追加します。たとえば、[図形座標] セクションを追加して複数のパスを持つ図形を作成したり、[スクラッチ] セクションを追加して複雑な数式を作成するための作業領域として使用する場合があります。新しく追加したセクションを使用する前に、少なくとも 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 プロパティを使用すると、図形にセクションが存在するかどうかを確認してから、必要に応じてセクションを追加することができます。
注 visSectionCharacter、visSectionParagraph、visSectionTextField、または visSectionTab セクションに行を追加したり、これらのセクションから行を削除することはできません。
Visio 図面の基本図形 (シェイプ) は、任意の数のコンポーネント、つまりパスで構成されます (コンポーネントまたはパスが存在しない基本図形もあります)。各パスは、一連の接続した線分です。ほとんどの図形の線分は、線または円弧 (または楕円弧) です。各パスは、[図形座標] セクションで表され、各線分は、[図形座標] セクションの行で表されます。
図形に [図形座標] セクションを追加するには、visSectionFirstComponent を指定した AddSection メソッドで、既存の [図形座標] セクションの前にセクションを挿入するか、visSectionLastComponent を指定した AddSection メソッドで、既存の [図形座標] セクションの後にセクションを追加します。たとえば、既存の [図形座標] セクションの後に [図形座標] セクションを追加するには、次のように記述します。
shpObj.AddSection visSectionLastComponent
[図形座標] セクションを追加したら、セクションに少なくとも 2 行を追加する必要があります(プログラムからセクションを追加した場合、行は自動的に追加されません)。AddRow メソッドには次の行タグを指定します。
visTagLineTo、visTagArcTo、visTagEllipticalArcTo、visTagMoveTo、visTagPolylineTo、または 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 製品付属のオンライン ヘルプ「[図形座標] セクション」を検索してください。
セクションを削除すると、そのセクションのすべての行およびセルは自動的に削除されます。visSectionObj 以外のセクションはすべて削除できます。また、visSectionObj セクションからも、行を削除することは可能です。セクションを削除するには、Shape オブジェクトの DeleteSection メソッドを使用します。たとえば、次のステートメントでは、図形の [スクラッチ] セクションを削除しています。
shpObj.DeleteSection visSectionScratch
存在しないセクションを削除しようとしても、エラーは発生しません。
また、visSectionParagraph、visSectionCharacter、visSectionTextField、および visSectionTab 以外のセクションから、行を削除することもできます。たとえば、図形の [図形座標] セクションから、頂点を定義する行を削除することで、図形から頂点を削除することができます。次のステートメントでは、長方形の最後の頂点を削除しています。
shpObj.DeleteRow visSectionFirstComponent + 0, visRowVertex + 3
頂点行の削除
線分を表す行の種類または行を設定することで、線分を線、円弧、楕円弧、スプライン、楕円、無限線、ポリライン、MoveTo、または NURBS として、定義することができます。プログラムからこれを定義するには、Shape オブジェクトの RowType プロパティを設定します。
たとえば、次のステートメントでは、図形の最初の線分を線に変換しています。
shpObj.RowType(visSectionFirstComponent + 0, visRowVertex + 1) = visTagLineTo
頂点行の行の種類の変更
複数のセクションまたは行内で反復処理を実行することで、複数のセクションまたは行に対して同じ操作を実行することができます。これを実行するには、Shape オブジェクトの次のプロパティを使用して反復ループを制限します。
次の例では、まず、図形の [図形座標] セクションの行およびセル間で反復処理を実行し、CellsSRC を使用して各セルを取得します。次に、各セルの数式をユーザー フォームのリスト ボックスに表示します。
Sub IterateGeometry () |
|
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 シェイプシートのセクション、行、セル インデックス」を参照してください。