共用方式為


關於在 Visio 中連接到資料

注意事項

資料連線功能僅供取得 Microsoft Visio Professional 2013 授權的使用者使用。

在 Visio 中,資料連接有四種方式:

  • 連接至資料來源

  • 將圖形連結至資料

  • 以圖形方式顯示連結資料

  • 重新整理資料來源中已變更的連結資料、更新連結圖形,以及解決可能產生的後續衝突

一般而言,您會以上述順序採用這些方式,也就是說,您會先將 Visio 繪圖連接到資料來源,然後將繪圖中的圖形連結到資料來源的資料,以圖形方式顯示連結圖形中的資料,必要時重新整理連結資料。 在 Visio 物件模型中,每一種方式都有其相關聯的新物件與成員。 本主題處理第一種方式,將您的 Visio 繪圖連接到資料來源。 如需有關其他資料連接方式的詳細資訊,請參閱下列主題:

若要以程式設計方式將您的 Visio 繪圖連接到資料來源,可以使用 Visio API 來進行資料連線,包括下列物件及其相關成員:

關於資料記錄集與資料連線

每個 Visio Document 物件都有一個 DataRecordsets 集合,在建立資料來源的連接之前,該集合是空的。 若要將 Visio 文件連接至資料來源,您可以將 DataRecordset 物件新增至文件的 DataRecordsets 集合。 然後 DataRecordset 物件具有 DataColumn 物件的 DataColumns 集合,每個集合都對應到資料來源中的一個相對欄 (欄位)。

您可以連接的資料來源包括 Excel 試算表、Access 和 SQL Server 資料庫、SharePoint 清單和其他 OLEDB 或 ODBC 資料來源,例如 Oracle 資料庫。 當您連線到其中一個資料來源來新增 DataRecordset 物件時,Visio 會擷取 DataConnection 物件中的連線,而該 DataRecordset 物件即已連線。

您也可以使用與 ADO Classic (ADO version 2.x) Data Recordset XML 結構描述相容的 XML 檔做為資料來源以新增 DataRecordset 物件。 結果 DataRecordset 物件就稱為 connection-less。 資料來源和 DataRecordset 物件之間的連線僅單向—從資料來源到 Visio 繪圖。 如果來源中的資料變更,您可以重新整理繪圖中的資料以反映變更。 但是,您無法變更繪圖中的資料,然後將變更推送回資料來源。

新增 DataRecordset 物件

若要將 DataRecordset 物件新增到 DataRecordsets 集合,可以根據您想要連接的資料來源,以及您是想要傳遞連接字串和查詢命令字串還是包含連線和查詢資訊的已儲存 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 物件並使用四個參數:

  • ConnectionIDOrString 現有 DataConnection 物件的識別碼,或是用來指定新資料來源連接的連線字串。 如果傳送目前有一個或多個其他資料記錄集正在使用之現有 DataConnection 物件的識別碼,則資料記錄集會變成「交易的群組記錄集」。 每次執行重新整理資料作業時,都會重新整理該群組中的所有資料記錄集。 您可以決定適當的連線字串,方式是先使用 Visio 使用者介面 (UI) 中的 [資料選取器精靈] 建立相同連接,同時在執行精靈時錄製巨集,然後再從巨集程式碼中複製連線字串。

  • CommandString 此字串用來指定資料庫資料表或 Excel 工作表,以及指定該資料表或工作表內包含您要查詢之資料的欄位 (欄)。 在重新整理記錄集內的資料時,也會將這個命令字串傳遞給 DataRecordset.Refresh 方法。

  • AddOptions 來自 VisDataRecordsetAddOptions 列舉一或多個值的組合。 這些值會指定某些資料記錄集行為,並且讓它可用來 (比方說) 防止記錄集中所查詢的資料出現在 Visio UI 的 [外部資料] 視窗,或因使用者動作而重新整理。 指派此值之後,在 DataRecordset 物件的期間即無法變更它。

  • Name 選擇性字串,可為資料記錄集提供顯示名稱。 如果您指定讓來自資料的資料顯示在 Visio UI 中的 [外部資料] 視窗,您傳遞的名稱會出現該與該資料記錄集對應的該視窗的索引標籤上。 在我們的範例中沒有現有的資料連線,因此針對 Add 方法的第一個引數,我們會傳遞我們所定義的連線字串 strConnection。 針對第二個參數,我們會傳遞我們定義的命令字串 strCommand,這會指示 Visio 從我們指定的工作表中選取所有資料行。 針對 Add 方法的第三個參數,我們會傳遞零以指定資料記錄集的預設行為,以及針對最後一個參數,我們會傳遞 OrgData,即我們為資料記錄集定義的顯示名稱。

下列範例程式碼顯示如何取得當我們新增 DataRecordset 物件至 DataRecordsets 集合時建立的 DataConnection 物件。 它會透過存取 DataConnection 物件的 ConnectionString 屬性,在 [即時] 視窗中顯示與 DataConnection 物件相關聯的連線字串。

Public Sub GetDataConnectionObject(vsoDataRecordset As Visio.DataRecordset) 
 
    Dim vsoDataConnection As DataConnection 
    Set vsoDataConnection = vsoDataRecordset.DataConnection 
    Debug.Print vsoDataConnection.ConnectionString 
 
End Sub

就像您可以透過存取 ConnectionString 屬性來取得與 DataConnection 物件相關的連接字串,也可以透過存取 CommandString 屬性來取得與 DataRecordset 物件相關的命令字串。 這兩個屬性均為可指定的,因此您可以隨時變更與 DataRecordset 物件相關的資料來源,或是與 DataConnection 物件相關的查詢,但是直到您重新整理資料,變更才會反映在繪圖中。 如需重新整理資料的相關資訊,請參閱關於將圖形連結至資料

以程式存取資料記錄集中的資料

當您匯入資料時,Visio 會根據原始資料來源中的資料列順序,為結果資料記錄集內的各個資料列指派整數資料列識別碼,從數字 1 開始。 Visio 在連線到圖形以及重新整理資料時,使用資料列識別碼來追蹤資料列。 如果您想要以程式存取資料列,必須使用這些資料列識別碼。 如需資料重新整理作業如何影響資料列順序的詳細資訊,請參閱關於將圖形連結至資料

使用 DataRecordset.GetDataRowIDs 方法來取得資料記錄集內所有資料列的識別碼陣列,資料記錄集內的每個資料列都代表一筆資料記錄。 GetDataRowIDs 方法會將其參數當做準則字串,而此字串必須符合 ActiveX Data Object (ADO) API 中針對設定 ADO.Filter 屬性所指定的指導方針。 您可以藉由指定適當的準則以及使用 AND 與 OR 運算子來分隔子句,以篩選資料記錄集內的資訊,而選擇性地只傳回某些資料記錄集資料列。 若不套用篩選條件 (也就是要取得所有資料列),請傳送空字串 ("")。 如需準則字串的詳細資訊,請參閱 ADO 2.x API Reference 中的 Filter 屬性主題。 擷取資料列識別碼之後,您可以使用 DataRecordset.GetRowData 方法來取得儲存在資料列中各欄內的所有資料。 如需資料欄的詳細資訊,請參閱關於將圖形連結至資料

下列範例程式碼示範如何使用 GetDataRowIDsGetRowData 方法來傳回每一個資料列的資料列識別碼,然後取得儲存在傳入的資料記錄集中每一個資料列的每一欄資料。 它會使用兩個巢狀的 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 支援與意見反應