使用Excel宏更改数据透视表外部数据源路径

时间:2012-08-24 22:24:13

标签: excel vba connection relative-path

我正在使用MS Excel中的一个项目,我有几个数据透视表,使用Microsoft Text从第一行中的列名称(与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

3 个答案:

答案 0 :(得分:2)

好的,所以我开始工作并且认为我会分享。我循环遍历工作簿中的每个连接,并将其路径更改为文本文件的新路径(通过获取活动工作簿的路径并附加文本文件的目录名称来创建)。此外,为了确保每次我需要包含一个' schema.ini'时,它都能正确导入文本文件。带有导入信息的文件(与文本文件在同一目录中)。

答案 1 :(得分:1)

我并不完全熟悉以这种方式创建数据透视表,但通常您可以通过查看QueryTable对象来获取数据透视表的信息,如Connection。看看这个例子:

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字符串,看看如何解析它并为每个数据透视表替换它。

答案 2 :(得分:0)

我找到了这个,并且有很多属性也是如此。

    With ActiveSheet.QueryTables.Add(Connection:= _
    "TEXT;\\Path\To\CSV\Folder\CSV_Data.csv" _
    , Destination:=Range("$A$1"))
    .CommandType = 0
    .Name = "Book1"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 437
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = True
    .TextFileSemicolonDelimiter = True
    .TextFileCommaDelimiter = False
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 1, 1)
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
    End With
    End Sub