将文本文件导入Excel工作表

21

我正在编写一个VBA代码,用于删除选择的Excel工作表上的数据,打开一个文本文件选择对话框,然后将数据从该文本文件导入到我已删除数据的同一张工作表中。目前为止,我只能将文本文件打开到新工作簿中,但无法将其打开到我已删除数据的同一张工作表中。

以下是我目前所想到的代码,感谢您的帮助:

Dim Filt As String
Dim FilterIndex As Integer
Dim Title As String
Dim FileName As Variant

Filt = "Cst Files (*.prn),*.prn"
Title = "Select a cst File to Import"
FileName = Application.GetOpenFilename(FileFilter:=Filt, Title:=Title)

If FileName = False Then
MsgBox "No File Was Selected"
Exit Sub
End If

With Application.ActiveSheet
    Cells.Select
Selection.QueryTable.Delete
Selection.ClearContents
End With

Workbooks.Open FileName
3个回答

52

有多种方法可以将文本文件导入当前工作表。以下是三种方法(包括您上面使用的方法):

  1. 使用查询表格
  2. 将文本文件打开到内存中,然后写入当前工作表,并最终根据需要应用“文本到列”功能。
  3. 如果你想使用你目前正在使用的方法,在你打开一个新的工作簿中的文本文件后,简单地使用 Cells.Copy 将其复制到当前工作表中。

使用查询表格

这是我录制的一个简单宏。请根据您的需求进行修改。

Sub Sample()
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;C:\Sample.txt", Destination:=Range("$A$1") _
        )
        .Name = "Sample"
        .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 = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End Sub

在内存中打开文本文件

Sub Sample()
    Dim MyData As String, strData() As String

    Open "C:\Sample.txt" For Binary As #1
    MyData = Space$(LOF(1))
    Get #1, , MyData
    Close #1
    strData() = Split(MyData, vbCrLf)
End Sub

一旦你将数据存储在数组中,就可以将其导出到当前工作表。

使用你已经在使用的方法

Sub Sample()
    Dim wbI As Workbook, wbO As Workbook
    Dim wsI As Worksheet

    Set wbI = ThisWorkbook
    Set wsI = wbI.Sheets("Sheet1") '<~~ Sheet where you want to import

    Set wbO = Workbooks.Open("C:\Sample.txt")

    wbO.Sheets(1).Cells.Copy wsI.Cells

    wbO.Close SaveChanges:=False
End Sub

后续步骤

你可以使用Application.GetOpenFilename来选择相关的文件。例如...

Sub Sample()
    Dim Ret

    Ret = Application.GetOpenFilename("Prn Files (*.prn), *.prn")

    If Ret <> False Then
        With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & Ret, Destination:=Range("$A$1"))

            '~~> Rest of the code

        End With
    End If
End Sub

1
看起来QueryTable方法是最直接的,但是否有一种方法可以向其中添加对话框,以便我可以选择不同来源的文本文件? - Elad Sommer
是的。稍等一下...正在更新帖子。 - Siddharth Rout
更新了帖子 :) 请查看FOLLOWUP - Siddharth Rout
@SiddharthRout 你好,我想问一下上述方法中哪一个是最快的。我希望你已经有答案了,而不是让我一个一个尝试?因为我现在的代码很长,要适应每个样本,我需要调整整个代码才行。我希望能跳过确定部分,直接采用最快的方法并相应地调整我的代码。 - L42
3
@SiddharthRout已经解决了这个问题。最快的方法是使用第三个示例中提到的Workbook.OpenWorkbook.OpenText方法。如果这与您的结论不一致,请告知我。谢谢。 - L42

2

在执行 .Refresh BackgroundQuery:=False 之后,您可以写 .WorkbookConnection.Delete 以删除文本文件的外部连接。


0

我认为我的问题的答案是你想要做的事情的最简单的解决方案:

  1. 选择应该包含文件第一行文本的单元格。

  2. 使用 Data/Get External Data/From File 对话框选择要导入的文本文件。

  3. 按需要格式化导入的文本。

  4. 在打开的 Import Data 对话框中,单击 Properties...

  5. 取消选中 Prompt for file name on refresh 复选框。

  6. 每当外部文件更改时,单击 Data/Get External Data/Refresh All 按钮。

注意:在你的情况下,你可能想跳过第5步。


但是当你按下刷新时,它总是要求你重新选择文件。 - Damian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接