Visio のデータへの接続について
注:
データ接続機能は、Microsoft Visio Professional 2013 のライセンスを取得したユーザーのみが使用できます。
Visio でのデータ接続には、4 つの側面があります。
データ ファイルに接続する
図形のデータにリンクする
リンクされたデータのグラフィック表示
データ ソースで変更されたリンク済みデータの更新、リンクされた図形の更新、以後に発生する可能性のある競合の解決
通常は、ここに示される順序でこれらの側面にアプローチします。つまり、最初に Visio 図面をデータ ソースに接続し、次に図面に含まれる図形をデータ ソース内のデータにリンクさせ、その図形のデータをグラフィック表示し、必要に応じてリンクされたデータを更新します。 Visio オブジェクト モデルには、上記の 4 つの側面それぞれについて、関連する新しいオブジェクトやメンバーがあります。 このトピックは、第 1 の、Visio 図面をデータ ソースに接続することに関するものです。 データ接続の他の側面については次のトピックを参照してください。
Visio の図面をプログラムでデータ ソースに接続するときは、データ接続用の Visio API を使用できます。この API には、次のオブジェクトと関連メンバーが含まれます。
DataRecordsets コレクション
DataRecordset オブジェクト
DataConnection オブジェクト
DataRecordsetChangedEvent オブジェクト
DataColumns コレクション
DataColumn オブジェクト
データ レコードセットとデータ接続について
Visio の Document オブジェクトにはそれぞれ DataRecordsets コレクションがあり、データ ソースと接続するまでは空のままです。 Visio 図面をデータ ソースに接続するには、DataRecordset オブジェクトを図面の DataRecordsets コレクションに追加します。 次に、DataRecordset オブジェクトには DataColumns コレクションがあり、その要素である DataColumn オブジェクトそれぞれが、データ ソースの対応する列 (フィールド) にマップされます。
接続できるデータ ソースとしては、Excel のスプレッドシート、Access および SQL Server のデータベース、SharePoint のリスト、さらに Oracle データベースなどの OLEDB または ODBC データ ソースがあります。 いずれかのデータ ソースに接続することにより DataRecordset オブジェクトを追加すると、Visio はその接続を DataConnection オブジェクトに抽象化し、DataRecordset オブジェクトに接続されたと考えて処理できるようにします。
また、ADD Classic (ADD バージョン 2.x) Data Recordset XML スキーマ準拠の XML ファイルをデータ ソースとして使用し、DataRecordset オブジェクトを追加することもできます。 その結果得られる DataRecordset オブジェクトは、「接続なし」になります。 データ ソースと DataRecordset オブジェクトの接続は、データ ソースから Visio 図面への一方通行です。 データ ソースの変更は、図面の側でデータを更新することにより反映できますが、 逆に図面データに変更があっても、それをデータ ソースに反映させることはできません。
DataRecordset オブジェクトを追加する
DataRecordset オブジェクトを DataRecordsets コレクションに追加するメソッドは 3 つあり、接続先データ ソースと、メソッドに情報を渡す方法 (接続文字列とクエリ コマンド文字列を渡す方法、または接続情報やクエリ情報が格納された Office Data Connection (ODC) ファイルを渡す方法) によって選択するようになっています。
次の Visual Basic for Applications (VBA) マクロ例は、Add メソッドを使って Visio の図面を Excel のワークシートに接続する方法を示します。この例ではワークシートとして、Visio に付属のサンプル ブック ORGDATA.XLS を使用しています。
Public Sub AddDataRecordset()
Dim strConnection As String
Dim strCommand As String
Dim strOfficePath As String
Dim vsoDataRecordset As Visio.DataRecordset
strOfficePath = Visio.Application.Path
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" _
& "User ID=Admin;" _
& "Data Source=" + strOfficePath + "SAMPLES\1033\ORGDATA.XLS;" _
& "Mode=Read;" _
& "Extended Properties=""HDR=YES;IMEX=1;MaxScanRows=0;Excel 12.0;"";" _
& "Jet OLEDB:Engine Type=34;"
strCommand = "SELECT * FROM [Sheet1$]"
Set vsoDataRecordset = ActiveDocument.DataRecordsets.Add(strConnection, strCommand, 0, "Data")
End Sub
注:
このコードを英語版以外の Visio で動かす場合、ファイル ORGDATA.XLS のパスが "Samples\1033\ORGDATA.XLS" ではない可能性があります。 お手元の Visio のバージョンに合わせ、コード中のパスを修正してください。
Add メソッドは DataRecordset オブジェクトを返し、次の 4 つのパラメーターを指定します。
ConnectionIDOrString 新しいデータ ソース接続を指定するための既存の DataConnection オブジェクトの ID または接続文字列です。 現在は他の 1 つ以上のデータ レコードセットによって使用されている既存の DataConnection オブジェクトの ID を渡すと、すべてのデータ レコードセットがトランザクション処理されたグループ レコードセットになります。 グループのすべてのデータ レコードセットは、データ更新操作が実行されるたびに更新されます。 適切な接続文字列は、Visio ユーザー インターフェイス (UI) でデータ選択ウィザードを使用して同じ接続を作成し、ウィザードの実行中にマクロを記録し、マクロ コードから接続文字列をコピーすることによって特定できます。
CommandString データベース テーブルまたは Excel ワークシートを指定し、照会するデータを含むテーブルまたはワークシート内のフィールド (列) を指定するクエリ文字列です。 このコマンド文字列は、レコードセットのデータがリフレッシュされたときに DataRecordset.Refresh メソッドにも渡されます。
AddOptionsVisDataRecordsetAddOptions 列挙の値を 1 つまたは複数組み合わせたものです。 これらの値はデータ レコードセットの特定の挙動を指定します。検索されたレコードセット内のデータを Visio UI の [外部データ] ウィンドウに表示されないようにしたり、このデータがユーザーの操作により更新されないようしたりできます。 この値を一旦割り当てると DataRecordset オブジェクトの存続期間中は変えることはできません。
Name データ レコードセットに表示名を付与する文字列です (省略可)。 レコードセットからのデータを Visio UI 内の [外部データ] ウィンドウに表示させるように指定している場合、渡した名前はそのウィンドウの、データ レコードセットに対応するタブに表示されます。 この例では、既存のデータ接続がないため、指定した接続文字列である strConnection を Add メソッドの最初のパラメーターに渡します。 2 番目のパラメーターでは、定義したコマンド文字列 strCommand を渡します。この文字列は、指定したワークシートからすべての列を選択するように Visio に指示します。 Add メソッドの 3 番目のパラメーターにはゼロを渡してデータ レコードセットの既定の動作を指定し、最後のパラメーターにはデータ レコードセットに指定した "Org Data" という表示名を渡します。
次のコード例は、DataRecordset オブジェクトを DataRecordsets コレクションに追加する際に作成される、DataConnection オブジェクトを取得する方法を示します。 さらに、DataConnection オブジェクトと関連付けられている接続文字列を [イミディエイト] ウィンドウに表示するため、DataConnection オブジェクトの ConnectionString プロパティにアクセスしています。
Public Sub GetDataConnectionObject(vsoDataRecordset As Visio.DataRecordset)
Dim vsoDataConnection As DataConnection
Set vsoDataConnection = vsoDataRecordset.DataConnection
Debug.Print vsoDataConnection.ConnectionString
End Sub
DataConnection オブジェクトに関連付けられた接続文字列が ConnectionString プロパティから取得できるのと同様に、DataRecordset オブジェクトに関連付けられたコマンド文字列は、CommandString プロパティにアクセスすることにより取得できます。 どちらのプロパティも値の設定が可能なので、DataRecordset オブジェクトに関連付けられたデータ ソース、DataConnection オブジェクトに関連付けられたクエリ文字列をいつでも変更できますが、図面にはデータを更新しない限り反映されません。 データの更新について詳しくは、「図形からデータへのリンクについて」を参照してください。
プログラムでデータ レコードセット内のデータにアクセスする
データをインポートすると、Visio は 1 から始まる行 ID (整数) を、結果として得られるデータ レコードセットの各データ行に、元のデータ ソースでの行順に基づき割り当てます。 Visio はデータ行 ID を、図形にリンクしたりデータを更新したりする際、行を追跡するために使います。 プログラムでデータ行にアクセスする場合、このデータ行 ID を使用する必要があります。 データを更新すると行 ID にも影響がありますが、これについて詳しくは、「図形からデータへのリンクについて」を参照してください。
DataRecordset.GetDataRowIDs メソッドを使用して、データ レコードセットのすべての行の ID の配列を取得します (ここでは、それぞれの行が 1 つのデータ レコードを表します)。 GetDataRowIDs メソッドにはパラメーターとして条件文字列を渡すことができます。その文字列は、ActiveX Data Object (ADO) API で規定された、ADO.Filter プロパティに指定できる条件文字列のガイドラインに従います。 適切な条件を指定して AND 演算子、OR 演算子で句を区切ることにより、データ レコードセット内の情報をフィルタリングし、データ レコードセットの特定の行だけを選択的に取得することができます。 条件なし (すべての行を取得) の場合は空文字列 ("") を渡します。 条件文字列の詳細については、「ADO 2.x API Reference」内のトピック「Filter Property」を参照してください。 データ行 ID がわかれば、DataRecordset.GetRowData メソッドを使用して、データ行の各列に格納されたデータをすべて取得できます。 データ列について詳しくは、「図形からデータへのリンクについて」を参照してください。
次のコード例は、GetDataRowIDs メソッドおよび GetRowData メソッドを使用して、各行の行 ID を取得し、指定したデータ レコードセットの各行の各列に格納されたデータを取得する方法を示します。 入れ子になった For…Next ループを使用して、レコードセット内のすべての行、その各行に含まれるすべての列について処理を繰り返しています。 取得した情報を [イミディエイト] ウィンドウに表示します。 GetDataRowIDs メソッドに空文字列を渡すことにより、フィルターを回避し、レコードセットのすべての行を取得します。 プロシージャを実行すると、(最初のデータ行に対応する) 最初のデータセットには、データ レコードセットのすべてのデータ列の見出しが含まれていることに注意してください。
Public Sub GetDataRecords(vsoDataRecordset As Visio.DataRecordset)
Dim lngRowIDs() As Long
Dim lngRow As Long
Dim lngColumn As Long
Dim varRowData As Variant
'Get the row IDs of all the rows in the recordset
lngRowIDs = vsoDataRecordset.GetDataRowIDs("")
'Iterate through all the records in the recordset.
For lngRow = LBound(lngRowIDs) To UBound(lngRowIDs)
varRowData = vsoDataRecordset.GetRowData(lngRow)
'Print a separator between rows
Debug.Print "------------------------------"
'Print the data stored in each column of a particular data row.
For lngColumn = LBound(varRowData) To UBound(varRowData)
Debug.Print vsoDataRecordset.DataColumns(lngColumn + 1).Name _
& Trim(Str(lngColumn)) & " = " & VarRowData(lngColumn)
Next lngColumn
Next lngRow
End Sub
サポートとフィードバック
Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。