Vba: импорт текстового файла в лист excel

Я пишу код 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

Спасибо!

Ответы

Ответ 1

Существует много способов импортировать текстовый файл в текущий лист. Вот три (включая метод, который вы используете выше)

  • Использование QueryTable
  • Откройте текстовый файл в памяти, а затем напишите на текущий лист и, наконец, примените Text To Columns.
  • Если вы хотите использовать метод, который вы используете, то после того, как вы откроете текстовый файл в новой книге, просто скопируйте его на текущий лист, используя Cells.Copy

Использование QueryTable

Вот простой макрос, который я записал. Пожалуйста, внесите изменения в соответствии с вашими потребностями.

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

Followup

Вы можете использовать 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

Ответ 2

вы можете написать         .WorkbookConnection.Delete после        .Refresh BackgroundQuery: = False это приведет к удалению внешнего текстового файла.

Ответ 3

Я думаю, мой ответ на мой вопрос - это самое простое решение того, что вы пытаетесь сделать:

  • Выберите ячейку, в которой должна быть первая строка текста из файла.

  • Используйте диалог Data/Get External Data/From File, чтобы выбрать текстовый файл для импорта.

  • Отформатируйте импортированный текст по мере необходимости.

  • В открывшемся диалоговом окне Import Data нажмите Properties...

  • Снимите флажок Prompt for file name on refresh.

  • При изменении внешнего файла нажмите кнопку Data/Get External Data/Refresh All.

Примечание: в вашем случае вам, вероятно, нужно пропустить шаг № 5.