【问题标题】:Changing pivot table external data source path with Excel macro使用 Excel 宏更改数据透视表外部数据源路径
【发布时间】:2012-08-24 22:24:13
【问题描述】:

我正在处理 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

【问题讨论】:

  • MsgBox (ThisWorkbook.Path) 应该有帮助
  • @enderland 这有什么帮助?
  • 我认为@enderland 想说的是,当您使用 Thisworkbook.Path 时,它会为您提供其所在位置的完整目录名称(我认为对于服务器,它会给您一个映射的驱动器名称而不是完整的 UNC 路径)。你不能把它加上文件名来得到你的新 DefaultDir 变量。要访问该变量,我建议记录一个宏并再次执行与文本文件的连接,以便您了解 Excel 如何访问它。
  • @joseph4tw 好的,但是在我上面的问题中,我说我已经知道如何获取路径。我还提到我尝试录制宏,但我不断收到阻止宏录制的错误(我能够连接到文本文件,但是当我尝试录制该过程时,由于某种原因它不再起作用 - 也许录音干扰了连接什么的,我不知道)。
  • @scae 哇,我很抱歉。我完全忽略了那些句子。您可以尝试遍历 QueryTables。我将发布一个示例。

标签: excel vba connection relative-path


【解决方案1】:

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

【讨论】:

  • 我很感激你的帖子已经超过 8 年了,你可能已经继续前进了......但如果你有机会分享你的最终代码(也使用 ini )文件 - 那将是太好了,因为我相信我遇到的问题与您最初的问题完全相同!?
【解决方案2】:

我并不完全熟悉以这种方式创建数据透视表,但通常您可以通过查看 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 字符串,看看如何解析它并为每个数据透视表替换它。

【讨论】:

  • 好的,所以我刚刚尝试过,它适用于常规表,但它看不到数据透视表。还有其他建议吗?
  • 它没有看到那些数据透视表?那很奇怪。当您在表格内单击时,您是否会在功能区中看到“数据透视表工具”菜单?您可以右键单击表格并进入“数据透视表选项”菜单吗?即使我尝试 Data->From Text 并使用 CSV 文件,它仍然会创建一个我可以访问的 QueryTable(不是数据透视表)。你能发布你是如何创建表格的吗?
  • 我使用数据透视表向导 (alt + d + p) 创建表。我实际上想出了如何编辑连接字符串,但我现在遇到了一个新问题(请参阅上面我的问题中的编辑)。建议将不胜感激!
【解决方案3】:

我已经找到了这个,并且有很多相同的属性..

    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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    相关资源
    最近更新 更多