Title
En Excel, una de las opciones para
importar un fichero de texto es conectarse a él (obtener datos externos) mediante el asistente para importar texto:
Alt+D+F+X. El conectarnos a datos externos en lugar de abrirlos, nos permitirá poder actualizarlos en el futuro.
Si queremos automatizar este proceso y evitar el uso repetido del asistente, podemos emplear un código similar al que he creado:
Importar CSV seleccionándolo con un cuadro de diálogo
Sub ImportarCSV()
Dim t As Single
t = Timer
Sheets("DATOS").Cells.ClearContents
strFile = Application.GetOpenFilename("CSV, *.csv")
If strFile = Empty Then
Response = MsgBox("Ningún fichero seleccionado", _
vbOKOnly, "Error")
Exit Sub
Else
End If
With Sheets("DATOS").QueryTables.Add(Connection:= _
"TEXT;" & strFile _
, Destination:=Sheets("DATOS").Range("$A$1"))
.Name = "fichero"
.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 = True
.TextFileSemicolonDelimiter = True 'CSV: punto y coma
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1) '5 columnas
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
MsgBox Timer - t
End Sub
En la primera parte iniciamos el cronómetro. Limpia los contenidos de la hoja DATOS en la que importaremos el fichero de texto CSV desde la celda A1. Abre un cuadro de diálogo que nos permite seleccionar el fichero a importar y nos alerta si no seleccionamos ninguno. Finalmente, importa el fichero de texto delimitado por punto y coma de 5 columnas, y nos indica el tiempo empleado en la importación.
Deliberadamente he dejado todas las propiedades que se detallan al grabar una macro usando el asistente de importación. Sin entrar a explicar todas las propiedades del objeto QueryTable, que casi se explican por sí solas, vamos a detenernos en tres:
.RefreshStyle Establece cómo se agregan o eliminan filas de la hoja de cálculo especificada. Si se sobreescriben las filas o no.
.TextFileStartRow Nos permite especificar la fila a partir de la que comienza la importación. Es 1 por defecto.
.TextFileColumnDataTypes Para especificar los tipos de datos de las columnas importadas mediante constantes. El 1 (xlGeneralFormat) las importa con formato general y el 9 (xlSkipColumn) para saltar esa columna. Ej.: TextFileColumnDataTypes = Array(1, 9, 1, 1, 1) saltaría la segunda columna. Si especifica más elementos para la matriz que columnas disponibles, se omiten esos valores.
Anexar nuevos CSV
Además, si necesitamos anexar nuevos ficheros CSV (asumimos la misma estructura que el anterior) podemos usar el siguiente código:
Sub AnexarCSV()
Dim t As Single
t = Timer
Sheets("DATOS").Select
Dim LastRow As Long
LastRow = Range("A1").End(xlDown).Row + 1
With Sheets("DATOS").QueryTables.Add(Connection:= _
"TEXT;" & ThisWorkbook.Path & "\fichero.csv" _
, Destination:=Sheets("DATOS").Range("A" & LastRow))
.Name = "fichero"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertEntireRows ' Inserta filas
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 2 ' Salta 1ª línea con encabezado
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = True 'CSV: punto y coma
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
MsgBox Timer - t
End Sub
En la primera parte iniciamos el cronómetro. Identificamos la última fila escrita e importamos el CSV que de copiará a partir de la fila previamente identificada. En este caso, en lugar de elegir el fichero con un cuadro de diálogo, se trata del fichero.txt ubicado en la misma ruta que nuestro Excel. Finalmente, nos indica el tiempo empleado en la importación.
En cualquier caso, si deseamos indicar manualmente la ruta del fichero y que se copie en la hoja activa, basta con sustituir las tres líneas desde With y a .Name por estas:
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;C:\TU_RUTA_CORRESPONDIENTE\fichero.csv", _
Destination:=Range("$A$1"))