0

外部データを含む古い VISIO ファイルがあります。データのソース ファイルはもう存在しません。Visio から Excel にデータをコピー アンド ペーストしようとしましたが、成功しませんでした。

次に、VBA を介してデータにアクセスしようとしましたが、得られる結果がわかりません: (行の量は正確ですが、データが適切な場合とそうでない場合があります)

Sub test()
    Dim i, j As Integer
    Dim r As Variant
    Dim a() As Variant
    Dim rowSTR As String
    Dim vsoDataRecordset As Visio.DataRecordset
    For i = 1 To Visio.ActiveDocument.DataRecordsets.Count
        rowSTR = ""
        a = Visio.ActiveDocument.DataRecordsets(i).GetRowData(1)
        For j = 0 To UBound(a) - 1
            rowSTR = rowSTR & vbTab & a(j)
        Next j
        Debug.Print i & ")" & rowSTR
    Next i
End Sub

このデータを Visio から Excel に取得する方法を知っていますか?

ありがとうアサフ

更新: ソースとコード出力を追加しました: 再確認しましたが、データがどこから来たのかわかりません... ここに画像の説明を入力

ここに画像の説明を入力

4

1 に答える 1

0

この投稿は古いですが、同じ問題に遭遇し、解決策があります。投稿されたコードではDataRecordSet、正しい行を見つけてすべての行を取得するのではなく、それぞれを参照して最初の行を取得しています。

iまた、0 から までカウントするために使用することも避ける必要がありExternalData.Countます。行 ID は番号をスキップできるため、正しいDataRecordset.

次のコードはきれいではありませんが、機能します。linkedブール値は実際にはデータ セットの一部ではないことに注意してください。ただし、これは [外部データ] ウィンドウの "チェーン" アイコンと同等です。

これは Visio 2013 向けに書かれていますが、他のバージョンでも機能すると思います。%これを実行すると、区切り記号として使用してファイルを Excel にインポートできます。

    Sub WriteDataSourceToFile()

    ' REQUIRES: Microsoft Scripting Runtime (C:\Windows\SysWOW64\scrrun.dll)

    ' Below we'll intentionally cause array length errors to test each Row
    On Error Resume Next

    ' Use this to put the drawing name in the first column of each row
    Dim DrawingLabel As String
    DrawingLabel = "DRAWING_NAME_HERE"

    ' Used for getting the External Data from a specific window
    Dim PagObj As Visio.Page
    Dim vsoDataRecordset As Visio.DataRecordset

    ' Used for grabbing all shapes with a link to the current Row
    Dim shapeIDs() As Long
    Dim testLong As Long

    ' Currently only using the above as a test (linked or not linked)
    Dim linked As Boolean

    ' Stores all Row IDs from the DataRecordset and loops through each
    Dim dataRowIDs() As Long
    Dim dataRowID As Variant

    ' Stores the actual Row information and appends to rowSTR for the delimited line
    Dim rowData() As Variant
    Dim rowDataInt As Integer
    Dim rowSTR As String

    ' Used for text file output
    Dim fso As FileSystemObject
    Set fso = New FileSystemObject

    ' Create a TextStream and point it at a unique filename (based on the active document)
    Dim stream As TextStream
    Set stream = fso.CreateTextFile("C:\Users\Public\Documents\GEN_" & ActiveDocument.Name & ".txt", True)

    ' Look through each window and find External Data (matches 2044)
    For Each win In Visio.ActiveWindow.Windows
        If win.ID = 2044 Then
            Set vsoDataRecordset = win.SelectedDataRecordset
            Exit For
        End If
    Next win

    ' Get each Row ID from the DataRecordSet
    dataRowIDs = vsoDataRecordset.GetDataRowIDs("")

    ' Use each Row ID as a reference
    For Each dataRowID In dataRowIDs
        linked = False

        ' Look through all pages and attempt to get Shape IDs linked to the active Row
        For Each PagObj In ActiveDocument.Pages
            PagObj.GetShapesLinkedToDataRow vsoDataRecordset.ID, dataRowID, shapeIDs

            ' Attempting to reference a 0-length array will throw an error here
            testLong = UBound(shapeIDs)
            If Err.Number Then
                Err.Clear
            Else
                ' If it didn't throw an error referencing the array, there's at least one linked shape
                linked = True
                Exit For
            End If
        Next PagObj

        ' Build the output
        rowSTR = linked

        ' Get the array of Row Data
        rowData = vsoDataRecordset.GetRowData(dataRowID)

        ' Go through each column and append the value to the output string
        For rowDataInt = 0 To UBound(rowData)
            ' Using % as a delimeter to prevent text with commas causing a separated column
            rowSTR = rowSTR & "%" & rowData(rowDataInt)
        Next rowDataInt

        'Output the string to the file, putting the label at the beggining of the row
        stream.WriteLine DrawingLabel & "%" & rowSTR
    Next dataRowID

    stream.Close
End Sub
于 2015-08-11T13:04:32.557 に答える