Excel中用于CSV导入的相对路径

时间:2016-11-10 17:55:05

标签: excel excel-vba vba

我希望这可以完成,因为我到目前为止发现的是Excel不支持工作簿连接的相对路径。我们这里有一个Excel工作簿,可以自动更新CSV文件中的工作表。这些从硬编码文件夹(c:\ temp \ premiumreports \ name_of_CSV_file.csv)中提取数据。此方法强制我每次都将所有内容放入c:\ temp \ premiumreports,或者如果我将文件发送给客户,则必须创建相同的目录结构。我想要做的是将我的xlsx文件放入任何文件夹(c:\ report或用户的桌面),并带有必要的CSV文件,当我打开xlsx时,数据会自动导入。这可能吗?

当前工作簿连接

enter image description here 谢谢!

2 个答案:

答案 0 :(得分:1)

如果工作簿文件始终与CSV文件位于同一文件夹中,则可以使用ActiveWorkbook.Path方法设置相对路径。

假设csv文件名和连接名相同的示例:

Sub refreshMsgConnection()
    Dim csvFileName As String
    csvFileName = "msg_by_weeks.csv"

    Dim filePath As String
    filePath = ActiveWorkbook.path

    Dim conString As String
    conString = "TEXT;" & filePath & "\" & csvFileName

    With ActiveWorkbook.Connections("msg_by_weeks").Ranges.Item(1).QueryTable
        .connection = conString
        .TextFilePlatform = 437
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .TextFilePromptOnRefresh = False
        .Refresh BackgroundQuery:=False
    End With
End Sub

您可能必须根据您的配置使用某些设置,例如分隔符等。如果遇到问题,请在设置所需格式的新连接时录制宏,然后复制此子设置中的设置

如果找不到该文件,它将弹出一个文件选择框,供用户找到所需的文件。

答案 1 :(得分:0)

我找到了答案!

您可能会发现当前文件路径在工作簿的任何单元格中添加了公式

=LEFT(CELL("filename",$A$1),FIND("[",CELL("filename",$A$1),1)-1)

以某种方式命名此单元格,说“ FilePath”并在查询中生成绝对路径,例如

let
    FilePath = Excel.CurrentWorkbook(){[Name="FilePath"]}[Content]{0}[Column1],
    FullPathToFile1 = FilePath & "Name1.xlsx"
    Source = Excel.Workbook(File.Contents(FullPathToFile1), null, true)
in

来源:https://techcommunity.microsoft.com/t5/Excel/Power-Query-Source-from-Relative-Paths/m-p/206267/highlight/true#M6836