2012-08-24 72 views
0

我正在处理MS Excel中的一个项目,其中有几个数据透视表从第一行中的列名称中读取制表符分隔的文本文件中的数据目录作为Excel文件)使用Microsoft Text Driver。我遇到了一个问题,当我将文本和Excel文件复制到新目录并尝试刷新数据时,它说它无法找到文本文件。不幸的是,似乎没有办法告诉Excel我希望文本文件的路径是相对的,而不是绝对的。所有的数据透视表都使用相同的数据连接,所以我认为编写一个宏可以更新数据连接来引用正确的文本文件,并且有一个链接到宏的按钮将会更新文件路径并为我刷新数据。使用Excel宏更改数据透视表外部数据源路径

我对VBA不太熟悉,而且在线文档似乎很糟糕,所以我一直无法得到这个工作 - 我可以创建正确的文件路径并刷新数据,但我一直未能弄清楚如何更新连接以使用新的文件路径,但保留其所有旧的导入/文件分析设置。我也尝试录制一个宏,同时手动更新数据源,但由于某种原因,总会给我带来中断录制的错误,所以这没有帮助。

以下是当前使用连接的连接字符串和命令文本,但没有什么有关如何解析/导入数据的(该文件被制表符分隔或具有第一列等标题),所以我我不确定如何确保连接保持这些数据。

连接字符串:

DefaultDir=C:/directoryPath;Driver={Microsoft Text Driver (*.txt; *.csv)}; 
    DriverId=27;FIL=text;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5; 
    SafeTransactions=0;Threads=3;UserCommitSync=Yes; 

命令文本:

SELECT * 
FROM tableName.txt tableName 

如果有人知道如何编写一个宏,将在连接到文本文件更新路径,请共享代码,或如果你知道如何做出相对的路径,那也会很棒。任何帮助将不胜感激!

编辑:

我一直用它乱搞了一点,我是能够改变连接字符串以使用新的路径。但是,当我刷新数据透视表时,它将所有数据作为文本导入,而不是猜测它是否应该是数字等等(尽管它至少从文本文件的第一行获取列标题)。关于如何告诉它猜测数据类型(或只保留旧数据类型)的任何想法?我现在使用的代码是:

Public Sub Test() 
    Dim wb As Excel.Workbook 
    Dim pc As PivotCache 
    Dim path As String 

    Set wb = ActiveWorkbook 
    path = wb.path 

    For Each pc In wb.PivotCaches 
     'Debug.Print pc.Connection 
     pc.Connection = "ODBC;DBQ=" & path & ";DefaultDir=" & path & ";Driver={Microsoft Text Driver (*.txt; *.csv)};DriverId=27;FIL=text;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UserCommitSync=Yes" 

    Next 
End Sub 
+0

'MsgBox(ThisWorkbook.Path)'should help – enderland

+0

@enderland这有什么用? – scaevity

+0

我认为@enderland想说的是,当你使用Thisworkbook.Path时,它会给你它所在的完整目录名称(我认为对于服务器而言,它会给你一个映射的驱动器名称而不是满的UNC路径)。你不能拿这个加上文件名来得到你的新的DefaultDir变量。为了访问这个变量,我建议记录一个宏并再次执行与文本文件的连接,以便看到Excel如何访问它。 –

回答

1

好吧,所以我得到它的工作,并认为我会分享。我循环遍历工作簿中的每个连接,并将其路径更改为文本文件的新路径(通过获取活动工作簿的路径并附加文本文件的目录名称创建)。此外,为了确保每次需要将包含导入信息的“schema.ini”文件(与文本文件位于同一目录中)一起导入文本文件时,该文件正确导入。

1

我不完全熟悉这种方式创建数据透视表准确,但通常你可以通过看得到像连接枢轴表的信息QueryTable对象。看看这个例子:

Option Explicit 

Public Sub UpdatePivotTableConnections() 
    Dim ws As Excel.Worksheet 
    Dim qt As Excel.QueryTable 
    Dim fileName As String 

    For Each ws In ThisWorkbook.Worksheets 
     For Each qt In ws.QueryTables 
      fileName = GetFileName(qt) 
      MsgBox "The file name for PivotTable '" & qt.Name & "' is: " & fileName 
     Next 
    Next 
End Sub 

Public Function GetFileName(ByRef qt As QueryTable) As String 
    Dim s() As String 
    s = Split(qt.Connection, "\") 
    GetFileName = s(UBound(s)) 
End Function 

这不是一个完整的答案,但它是一个开始看看你会得到什么(我不喜欢发布不完整的答案,但它向你展示一个代码示例的唯一方式。)有了这些信息,如果您可以从那里访问信息,请尝试查看QueryTable.Connection字符串,并查看如何解析它并将其替换为每个数据透视表。

+0

好吧,所以我只是尝试了这一点,它对正常表格正常工作,但它没有看到数据透视表。还有其他建议吗? – scaevity

+0

它没有看到那些数据透视表?真奇怪。当您在表格内单击时,是否会在功能区中显示“数据透视表工具”菜单?你可以右键单击表格并进入“数据透视表选项”菜单?即使当我尝试使用数据 - >来自文本并使用CSV文件时,它仍然会创建一个我可以访问的QueryTable(不是数据透视表)。你可以发布你如何创建表吗? –

+0

我正在使用数据透视表向导(alt + d + p)来创建表格。我实际上已经想出了如何编辑连接字符串,但现在我遇到了一个新问题(请参阅上面的问题中的编辑)。建议将不胜感激! – scaevity