【问题标题】:Importing text file into excel sheet将文本文件导入excel工作表
【发布时间】:2012-07-01 07:40:49
【问题描述】:

我正在编写一个 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

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    您可以通过多种方式将文本文件导入当前工作表。这里有三个(包括你上面使用的方法)

    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
    

    【讨论】:

    • 看起来 QueryTable 方法是最直接的,但有没有办法向它添加一个对话框,以便我可以选择来自不同来源的文本文件?
    • 是的。等一下……更新帖子
    • 更新了帖子 :) 见FOLLOWUP
    • @SiddharthRout 嗨,我很惊讶,这是上述方法中最快的。我只是希望除了我一一尝试之外,您已经有了答案?因为我的当前代码很长,并且要采用每个示例,我需要调整整个代码以对齐。我希望跳过确定部分并以最快的方式继续并相应地调整我的代码。
    • @SiddharthRout 已经解决了。最快的是第三个样本。使用Workbook.OpenWorkbook.OpenText 方法。如果这与您的结论不一致,请通知我。谢谢。
    【解决方案2】:

    我认为my answer to my own question 这是您尝试做的最简单的解决方案:

    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 步。

    【讨论】:

    • 但是当你按刷新时它总是要求你再次选择文件
    【解决方案3】:

    你可以写 .WorkbookConnection.Delete 后 .刷新背景查询:=假 这将删除文本文件外部连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-17
      • 2020-11-20
      • 2019-10-10
      • 2023-03-21
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多