Importar archivo de texto en hoja de Excel

Estoy escribiendo un código VBA que se supone que debe eliminar los datos en una hoja de Excel seleccionada, abrir un cuadro de diálogo para la selección de archivos de texto y luego importar los datos de ese archivo de texto a la misma hoja exacta de la que eliminé los datos. Hasta ahora, solo puedo abrir el archivo de texto en un nuevo libro de trabajo, pero no puedo abrirlo en la misma hoja de la que eliminé los datos.

Esto es lo que vine con hasta ahora, agradeceré su ayuda:

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

preguntado el 29 de junio de 12 a las 19:06

3 Respuestas

Hay muchas formas de importar un archivo de texto a la hoja actual. Aquí hay tres (incluido el método que está utilizando arriba)

  1. Uso de una tabla de consulta
  2. Abra el archivo de texto en la memoria y luego escriba en la hoja actual y finalmente aplique Texto a columnas si es necesario.
  3. Si desea usar el método que está usando actualmente, luego de abrir el archivo de texto en un nuevo libro de trabajo, simplemente cópielo en la hoja actual usando Cells.Copy

Uso de una tabla de consulta

Aquí hay una macro simple que grabé. Por favor modifíquelo para satisfacer sus necesidades.

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

Abre el archivo de texto en la memoria.

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

Una vez que tenga los datos en la matriz, puede exportarlos a la hoja actual.

Usando el método que ya estás usando

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

SEGUIMIENTO

Puede utilizar el Application.GetOpenFilename para elegir el archivo correspondiente. Por ejemplo...

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

Respondido el 29 de junio de 12 a las 20:06

Parece que el método QueryTable es el más sencillo, pero ¿hay alguna manera de agregarle un cuadro de diálogo para tener la opción de elegir archivos de texto de diferentes fuentes? - Elad Sommer

Sí. Un momento... actualizando la publicación - Huida de Siddharth

Actualicé la publicación :) Ver FOLLOWUP - Huida de Siddharth

@SiddharthRout Hola, me preguntaba cuál es el más rápido entre los métodos presentados anteriormente. Solo espero que ya tengas la respuesta aparte de que yo intente cada uno de ellos uno por uno. Debido a que el código actual que tengo es largo y para adaptarlo a cada muestra, necesito modificar todo el código para alinearlo. Tenía la esperanza de omitir la parte determinante y proceder de la manera más rápida y ajustar mi código en consecuencia. - L42

@SiddharthRout ya lo solucionó. La más rápida sería la tercera muestra. Utilizando el Workbook.Open or Workbook.OpenText método. Si esto de alguna manera no se alinea con su conclusión, por favor infórmeme. Gracias. - L42

puede escribir .WorkbookConnection.Delete después de .Refresh BackgroundQuery:=False esto eliminará la conexión externa del archivo de texto.

Respondido el 22 de junio de 16 a las 17:06

Creo que el mi respuesta a mi propia pregunta Aquí está la solución más simple para lo que está tratando de hacer:

  1. Seleccione la celda donde debería estar la primera línea de texto del archivo.

  2. Use el Data/Get External Data/From File cuadro de diálogo para seleccionar el archivo de texto a importar.

  3. Formatee el texto importado según sea necesario.

  4. En la Import Data cuadro de diálogo que se abre, haga clic en Properties...

  5. Desmarque la Prompt for file name on refresh encajonar.

  6. Cada vez que cambie el archivo externo, haga clic en el Data/Get External Data/Refresh All

Nota: en su caso, probablemente debería omitir el paso 5.

respondido 20 mar '17, 10:03

Pero siempre le pide que seleccione el archivo nuevamente cuando presiona actualizar: Damián

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.