【发布时间】: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