Importar datos de archivo CSV

02/04/2009 - 14:33 por rob.checa | Informe spam
Buenos días, grupo.

Necesito poder importar a un archivo xls los datos contenidos en un
CSV.

La cuestión es que tengo un archivo XLS al que necesito rtaer los
datos de un rango determinado de una hoja de un archivo CSV. Puede
estar abierto o cerrado el CSV, no es relevante, y no me sirve el copy/
paste puesto que es un proceso que he de realizar muchas veces y he de
automatizar mediante VBA en un botón de comando.

Gracias por la ayuda,

Roberto (Zaragoza-España)

Preguntas similare

Leer las respuestas

#1 Juan M
02/04/2009 - 14:55 | Informe spam
escribió
Buenos días, grupo.

Necesito poder importar a un archivo xls los datos contenidos en un
CSV.

La cuestión es que tengo un archivo XLS al que necesito rtaer los
datos de un rango determinado de una hoja de un archivo CSV. Puede
estar abierto o cerrado el CSV, no es relevante, y no me sirve el copy/
paste puesto que es un proceso que he de realizar muchas veces y he de
automatizar mediante VBA en un botón de comando.

Gracias por la ayuda,

Roberto (Zaragoza-España)




-

hola Roberto,

Pues como no desveles los donde están los datos (rangos)
como reconocerlos (que excluye unos datos u otros o son todos)
la estructura de archivo (entiendo que está en forma tabular y cada
columna tiene un tipo de dato)
si es uno o son diferentes archivos (por tener que seleccionar cada vez
un origen de datos o es siempre el mismo)
donde los tiene que pegar (si es siempre la misma posición o cada vez
debe ir a sitio esa información)

En fin, ya ves que casi es más larga lo que te pido que lo que has contado
de tu modelo.

Por lo demás, mientras aportas los datos necesarios te sugiero la lectura de
temas relacionados con ADO.
Por ejemplo este, auque está orientado a vb, se puede adaptar a vba.
http://www.mvp-access.es/softjaen/a...t_isam.htm

Por cierto, el archivo sí es relevante que esté o no abierto, ya que volver
a abrirle podría suponer pérdida de datos, o que directamente no funcione la
propuesta.

Un saludo,
Juan
Respuesta Responder a este mensaje
#2 rob.checa
02/04/2009 - 23:26 | Informe spam
Gracias, Juan, por tu pronta respuesta y disculpa haber sido tan
escueto en el planteamiento.

Te explico:

Los datos están en parte de la columna A de la hoja 1 de un archivo
CSV y an de ir a parar a un XLS, concretamente a la primera columna
que tenga libre la primera fila. Los datos en el CSV son un único
valor, no son varios separados por comas; no es necesario separar
valores. La correspondencia es sencilla: celda CSV a celda XLS.

El archivo CSV es siempre el mismo. Una rutina va generando ese CSV
sobre escribiendo los datos existentes, por lo que siempre se
encuentran en el mismo lugar, misma columna. Cuando digo que no es
relevante el hecho de tener abierto o cerrado el CSV me refiero a que
no importa como implementar la solución: puedo tener abierto o cerrado
el CSV ya que al generarse puedo elegir o no dejarlo abierto o
cerrado, por eso es posible exportar esos datos de la manera más
cómoda o eficaz, con el archivo abierto o cerrado.

En cuanto a ADO te diré que lo uso posteriormente para enviar los
datos del XLS a Access.

Gracias por tu tiempo y un saludo.
Respuesta Responder a este mensaje
#3 Juan M
03/04/2009 - 22:18 | Informe spam
Hola Roberto, (no se que ha pasado pero el mensaje anterior no aparece)

Te paso dos soluciones, es probable que debas adaptar alguna parte del
código para que realmente haga lo que quieres.
También es probable que falle por el formato que tienes del csv. Si esto
ocurriera, indicanos unas pocas líneas del archivo para poder hacer una
prueba con un archivo parecido al que manejas.

La primera no necesita ninguna regerencia, se basa en que has comentado que
es una sola columna de datos.

En la varible ColumnaPega se almacena la última columna con la primera fila
ocupada.
En la variable MiArchivo se almacena el nombre del archivo con su ruta
modificalo según sea el tuyo.

Sub test1()
Dim MiArchivo As String
Dim NumeroArchivo As Integer
Dim i As Long
Dim strLinea As String
Dim ColumnaPega As Long

MiArchivo = "E:\temp\prueba.csv"
NumeroArchivo = FreeFile
ColumnaPega = Range("A1").Offset(, Columns.Count - 1).End(xlToLeft).Column

Open MiArchivo For Input As #NumeroArchivo
i = 1
Do While Not EOF(NumeroArchivo)
Input #NumeroArchivo, strLinea
Range("a" & i).Offset(, ColumnaPega) = strLinea
i = i + 1
Loop
Close #NumeroArchivo ' Cierra el archivo.
End Sub

En la segunda hay que hacer referencia a la librería Microsoft ActiveX Data
Objects 2.X Library desde el menú Herramientas>Referencias
En las variables MiRuta y MiArchivo se guardan la ruta y el archivo donde
tienes el documento a leer.
He supuesto que el archivo no tiene encabezado, en caso de tenerlo debes de
cambiar la cadena de conexión por esta otra:

.ConnectionString = "Data Source=" & MiRuta & ";" & _
"Extended Properties=""TEXT;HDR=No;"""




por
.ConnectionString = "Data Source=" & MiRuta & ";" & _
"Extended Properties=TEXT;"


Sub test2()
Dim MiRuta As String
Dim MiArchivo As String
Dim ColumnaPega As Long
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset

MiRuta = "E:\temp\"
MiArchivo = "prueba.csv"
ColumnaPega = Range("A1").Offset(, Columns.Count - 1).End(xlToLeft).Column
Set cnn = New ADODB.Connection
With cnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & MiRuta & ";" & _
"Extended Properties=""TEXT;HDR=No;"""
.Open
End With
Set rs = New ADODB.Recordset
rs.Open MiArchivo, cnn, adOpenStatic, adLockOptimistic, adCmdTable
Range("A1").Offset(, ColumnaPega).CopyFromRecordset rs
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub

Existe una tercera opción que consiste en abrir el archivo, copiar todo el
rango y pegarlo
Sub test3()
Dim MiArchivo As String
Dim ColumnaPega As Long
Dim Hoja As Worksheet
Dim Libro As Workbook

MiArchivo = "E:\temp\prueba.csv"
ColumnaPega = Range("A1").Offset(, Columns.Count - 1).End(xlToLeft).Column
Set Hoja = ActiveSheet
Set Libro = Workbooks.Open(Filename:=MiArchivo, ReadOnly:=True)
With Libro.Worksheets(1)
.Range("A1", .Range("A" & .Rows.Count).End(xlUp)).Copy _
Hoja.Range("A1").Offset(, ColumnaPega)
End With
Libro.Close SaveChanges:=False
Set Libro = Nothing
Set Hoja = Nothing
End Sub

pero quizá es la que menos me gusta

Un saludo,
Juan


Consulta Original = escribió
Gracias, Juan, por tu pronta respuesta y disculpa haber sido tan
escueto en el planteamiento.

Te explico:

Los datos están en parte de la columna A de la hoja 1 de un archivo
CSV y an de ir a parar a un XLS, concretamente a la primera columna
que tenga libre la primera fila. Los datos en el CSV son un único
valor, no son varios separados por comas; no es necesario separar
valores. La correspondencia es sencilla: celda CSV a celda XLS.

El archivo CSV es siempre el mismo. Una rutina va generando ese CSV
sobre escribiendo los datos existentes, por lo que siempre se
encuentran en el mismo lugar, misma columna. Cuando digo que no es
relevante el hecho de tener abierto o cerrado el CSV me refiero a que
no importa como implementar la solución: puedo tener abierto o cerrado
el CSV ya que al generarse puedo elegir o no dejarlo abierto o
cerrado, por eso es posible exportar esos datos de la manera más
cómoda o eficaz, con el archivo abierto o cerrado.

En cuanto a ADO te diré que lo uso posteriormente para enviar los
datos del XLS a Access.

Gracias por tu tiempo y un saludo.
Respuesta Responder a este mensaje
#4 Roberto Checa
04/04/2009 - 01:04 | Informe spam
Gracias, Juan.

Voy a probar todo lo que me propones y ver que es lo mas interesante. Seguro
que con ello soluciono el tema.

Gracias de nuevo y un saludo desde Zaragoza.

Roberto
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida