0

我正在 MS Excel 中处理一个项目,其中有几个数据透视表,它们使用 Microsoft 文本驱动程序从制表符分隔的文本文件中读取数据,第一行中的列名(与 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
4

3 回答 3

2

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

于 2012-09-18T01:35:07.893 回答
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 字符串,看看如何解析它并为每个数据透视表替换它。

于 2012-08-25T02:52:07.847 回答
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
于 2018-03-27T20:15:55.870 回答