使用宏将 CSV 文件导入 Excel

B-B*_*erl 4 database macros microsoft-excel microsoft-excel-2010

我想开发一个宏,在我的 Excel 工作表中,我在特定单元格中键入日期,然后宏将进入包含文本文件的文件夹。一个你可以说的数据库。我希望它找到写成日期的相应文件名,通过分隔符将数据放入,然后粘贴到我最初放置日期的正下方的单元格中。

该文件夹将始终位于同一位置,文本文件的格式将全部为 DD_MM_YYYY。下面的单元格将永远是空的

一些图片可以让我更容易理解我的要求。

结果 数据输入步骤 1 数据输入步骤 2 数据输入步骤 3

DMA*_*361 5

这比您想象的要简单,因为您可以从宏中调用文本导入向导(或者更确切地说,您可以使用其功能),无需编写 CSV 解析器或任何类似的东西。

事实上,我对下面的宏所做的只是使用内置的记录功能,然后稍微调整一下以满足您的需求。

使用宏:

  1. 备份您当前的 Excel 文件,以防出现问题。

  2. folder将宏中的定义更改为包含所有数据文件的路径 - 确保包含尾部斜杠。

  3. 选择列的标题单元格,其中必须包含您的文件之一的名称 -包括文件扩展名. 如果您希望删除扩展名,您可以在加载数据后编辑此字段。

  4. 运行宏。

行动

它将从当前单元格中获取文件名,查看指定folder并打开单元格中指定的文件。然后它会将其导入为 CSV,正好位于所选单元格下方的一个单元格(启动宏时)。

因此,它可能会在运行宏时覆盖所选单元格下方的单元格 - 建议小心。

如果未找到该文件,或发生其他一些错误,这将失败并显示正常的 VBA 错误框,没有友好的错误消息。

宏代码

其中一些可能可以修剪 - 正如我从录音中得到的,而不是学习如何使用QueryTables自己 - 但它不会受到伤害,并且似乎可以可靠地工作。

Sub LoadFromFile()
    Dim fileName As String, folder As String
    
    folder = "C:\Path\To\Your\Files\"
    fileName = ActiveCell.Value
    
    ActiveCell.Offset(1, 0).Range("A1").Select

    With ActiveSheet.QueryTables _
        .Add(Connection:="TEXT;" & folder & fileName, Destination:=ActiveCell)
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End Sub
Run Code Online (Sandbox Code Playgroud)