2012-11-21 35 views
0

我有一个带有外部数据的旧VISIO文件。数据的源文件不再存在。 我试图从visio复制和粘贴数据,以取得成功。如何将visio外部数据导出为ex​​cel

然后我试图通过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吗?

感谢 阿萨夫

更新:增加了源和代码输出:我复查和不知道哪里的数据来自... enter image description here

enter image description here

+0

你对数据的含义是否正确,有时不对?有时候数据有什么不对? –

+0

添加了屏幕截图 - 我相信我的代码引用了错误的地方 - 只有偶数行才有数据,它提醒了原创,但没有更多。 –

回答

0

这个职位是旧的,但我遇到了同样的问题,并有一个解决方案。在您的发布代码中,您引用了每个DataRecordSet并抓取第一行,而不是找到正确的并抓取所有行。

我们还必须避免使用i来计数从0到ExternalData.Count;行ID可以跳过数字,因此您必须使用正确的DataRecordset中的实际ID。

下面的代码不完全漂亮,但它的工作原理。请注意,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