Visio® 図面内の図形には、さまざまな情報を格納できます。オートメーションを使用して、Visio 図面から情報を抽出するプログラムを作成し、別のアプリケーションで使用できます。たとえば、図面の図形を使用して自動的に発注書を生成することができます。また、特定の製造プロセスに関連するコストを見積もるために、フローチャートの図形からスプレッドシートへ情報を抽出することもできます。ソリューションで使用されているデータ型の情報を抽出し、外部ファイルにデータのコピーを保存することで、図面のデータが誤って変更されてしまったときのためのバックアップを作成することも可能です。
図面から抽出したデータの使用目的にかかわらず、データを収集する基本的なプロセスは同じです。このコード例では、Visio 図面からデータを収集するコードの概要を紹介します。収集した情報をどのように使用するかは、作成するプログラムと他のアプリケーションが相互にどのように機能するかによって決定されます。
このセクションの内容...
発注書を生成するために、図面のネットワーク コンポーネントの情報を収集するアプリケーションを作成するものとします。営業員と顧客は下図のような新しいネットワーク システムを示す図面を共同で制作します。
データの抽出元となる Visio 図面
以下のサンプルのように、図面が保存されたときに実行され、図面上の図形に関する情報を収集し、その情報を配列に保存するオートメーション プログラムを作成することができます。さらに、配列内のデータを使用し、特定のコンポーネントの発注を自動的に生成するコードを記述することもできます。
図面ページの図形に関するデータ
Microsoft Visual Basic for Applications (VBA) を使用して、Visio 図面が保存された場合に実行される、以下のようなコードを作成することもできます。このコードでは、変数を定義し、図面の最初のページに関連する Shapes コレクションを取得した後、コレクション内の図形から収集したデータを保存する OrderInfo 配列を定義しています。各図形の名前は、各図形の部品番号、製造元、価格という 3 つのカスタム プロパティについて収集された情報とともに配列に追加されます。ページの各図形からこの情報が収集された後、確認のためにイミディエイト ウィンドウに表示されます。最後に配列内のデータは別のアプリケーションに渡されるか、テキスト ファイルとしてディスクに保存されます。
このコードの詳細については、「図面からデータを抽出するためのコードの検証」を参照してください。
Private Sub Document_DocumentSaved(ByVal doc As IVDocument)
Dim pagObj As Visio.Page |
'Visio Page Object |
Set pagObj = ActivePage |
'Get the active page |
'Set the array size to hold all of the shape information
'0 based array, 4 by total # of shapes
ReDim OrderInfo(3, iShapeCount - 1)
'For each shape on the page, collect the Name, Part Number
'Manufacturer, and Cost
For i = 1 To iShapeCount
'Get the i'th shape
Set shpObj = shpsObj(i)
'Get the shape name
OrderInfo(0, i - 1) = shpObj.Name
'Get the Part Number Property, then get the value as a string
If shpObj.CellExists("Prop.Part_Number", visExistsLocally) Then
Set celObj = shpObj.Cells("Prop.Part_Number")
OrderInfo(1, i - 1) = celObj.ResultStr("")
End If
'Get the Manufacturer Property, then get the value as a string
If shpObj.CellExists("Prop.Manufacturer", visExistsLocally) Then
Set celObj = shpObj.Cells("Prop.Manufacturer")
OrderInfo(2, i - 1) = celObj.ResultStr("")
End If
'Get the Cost Property, then get the value
If shpObj.CellExists("Prop.Cost", visExistsLocally) Then
Set celObj = shpObj.Cells("Prop.Cost")
OrderInfo(3, i - 1) = celObj.ResultIU
End If
'Release Shape object
Set shpObj = Nothing
Next
'Print to Immediate window to verify data collection
For i = 0 To pagObj.Shapes.Count - 1
Debug.Print OrderInfo(0, i) & "," _
& OrderInfo(1, i) & "," _
& OrderInfo(2, i) & "," _
& OrderInfo(3, i)
Next
'Call a function to write data out to any external
'data storage, pass the array of collected data
'ExportData OrderInfo
End Sub
上記のコード例は、データを含む変数と配列の定義、データを収集して配列に保存するためにページの Shapes コレクションの図形を通るループ、データ コレクションを確認するための画面への結果配列の表示、データの別アプリケーションへのエクスポートを処理する各部分で構成されています。
コードの最初のセクションでは、Dim ステートメントを使用して Page オブジェクト、Shapes コレクション、Shape オブジェクト、Cell オブジェクトの変数が定義されています。さらに、OrderInfo という配列が、後に続くループをカウントするための整数とともに定義されています。
変数が定義されると、ページの変数が図面のアクティブ ページに設定されます。変数 shpsObj はアクティブ ページ上のすべての図形で構成されるコレクションを定義し、iShapeCount は情報の収集対象となる図形の数を記録します。最後に、OrderInfo 配列は、ページの Shapes コレクションにある各図形の 4 つのプロパティについてのデータを保存する配列を定義します。複数のページで構成された図面で作業をしている場合、図面の各ページで継続して同じ処理を行うようにループを定義できます。この場合、複数の Shapes コレクションを格納できるように配列を拡大するか、または各ページに対応する配列を個別に作成します。
コードの次のセクションには、ページ上のすべての図形に関する情報が格納されている OrderInfo 配列が含まれています。iShapeCount 変数はページ上の図形の数を格納します。カウント用の整数は、この値の範囲に対応する値で定義されます。For_Next ステートメントを使用して、整数はコレクションの最初の図形から情報の収集を開始し、その処理が終わると図形を解放して次の図形の情報を収集します。コレクションの最後の図形に至るまで、この処理を繰り返します。
このコードでは、コレクションの各図形について、それぞれ 4 つの情報が配列に追加されます。shpObj.Name プロパティは、単純に図形の名前を収集します。次の 3 つのフィールドの情報は、カスタム プロパティ フィールドから抽出されます。コードでは、まず Prop.Part_Number、Prop.Manufacturer、Prop.Cost の各セルが存在するかどうかがチェックされます。セルが存在した場合、celObj 変数が各セルの値に順番に割り当てられ、抽出された文字列が配列に追加されます。セルが存在しなかった場合、このコードでは該当するフィールドが単純にスキップされます。より高度なソリューションでは、セルが存在しない場合に別の処理を実行するようなコードが必要な場合もあります。
上のコード例の次のセクションでは、再度 For_Next ステートメントを使用し、配列内の各図形の情報をイミディエイト ウィンドウ上にカンマ区切りで表示しています。配列内の情報を使用する方法によっては、この表示情報をトラブルシューティングのために活用することができます。
このコード例には、配列内のデータを別のアプリケーションにエクスポートするためのコードは含まれていません。これは、情報の使用方法と使用するアプリケーションによって、その記述内容が大きく異なるためです。