Excel - Macro excel importar datos csv

 
Vista:
sin imagen de perfil
Val: 21
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Macro excel importar datos csv

Publicado por Ana (27 intervenciones) el 25/04/2023 13:11:16
Buenos días,
Necesito ayuda para realizar la siguiente macro, o saber si se puede hacer, porque llevo varios días y no doy con ello.
Nosotros sacamos información de una de las maquinas en archivos csv. y queremos importarlos a un excel.
Los archivos csv vienen delimitados por @.
Cada archivo csv corresponde a un proyecto y los queremos todos en el mismo archivo de excel , cada uno en una pestaña.
A parte de lo que se importa del archivo csv luego queremos añadir un par de columnas mas.
Lo primero que necesito es la importación de datos y que se actualice automáticamente, ya que los archivos csv, aunque no cambian de nombre si que se añaden o quitan filas. y que cada archivo csv vaya a una pestaña y que el nombre de la pestaña sea el del archivo csv.
En esa macro también necesitamos poder elegir la ruta.
Adjunto un archivo csv y el libro 2 que es el excel que queremos tener.
En el libro2 aparece la pestaña 012-0020 que es la plantilla que queremos , desde la celda A hasta la K , son los datos que se obtienen del archivo csv y luego las celda L, M y N son los añadidos.

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Macro excel importar datos csv

Publicado por Antoni Masana (2478 intervenciones) el 27/04/2023 22:54:21
Faltan los archivos adjuntos.

Tengo alguna pregunta:

Por ejemplo el archivo 0001.cvs va la hoja 0001 del libro
¿Se tiene que borra la información de la hoja antes de añadir los nuevos datos?
Si se añaden a los ya existentes debería no duplicar la información
¿Hay algún dato identificativo único en cada archivo csv?
Me falta saber si hay cabecera en la hoja, en el csv.

La macro puede buscar y actualizar losa csv en una ruta determinada que se solicite al operador o se guarde en algún sitio del libro.
¿La macro se ejecuta manualmente? o ¿de otra forma?

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 21
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Macro excel importar datos csv

Publicado por Ana (27 intervenciones) el 28/04/2023 10:20:06
Hola,
Lo primero muchas gracias.
Adjunto archivos y te contesto a tus preguntas.

Por ejemplo el archivo 0001.cvs va la hoja 0001 del libro: cada archivo csv, tiene un nombre, en el archivo csv que adjunto es 006-0289, cuando se importen los datos csv a excel la hoja nueva que cree tiene que poner ese mismo nombre , en este caso 006-0289.

¿Se tiene que borra la información de la hoja antes de añadir los nuevos datos? No es necesario, solo hay que actualizarlo a los datos existentes el momento de la importación.

Si se añaden a los ya existentes debería no duplicar la información: si, o bien borrarlos y poner los nuevos o buscar duplicados y borrarlos.

¿Hay algún dato identificativo único en cada archivo csv?: si, todos los nombres siguen la misma estructura:000-0000 , en el caso del archivo csv es 006-0289.

La macro puede buscar y actualizar losa csv en una ruta determinada que se solicite al operador o se guarde en algún sitio del libro. Los datos csv estan siempre en la misma ruta .

¿La macro se ejecuta manualmente? o ¿de otra forma?: mejor de manera automática cada cierto tiempo, yo lo he intentado con esta macro:

Sub ActualizacionAutomatica()
Dim tiempo As Date
Call ImportarCsv
tiempo = TimeValue(CDate(Range("O1").Value))
Application.OnTime Now + tiempo, "ActualizacionAutomatica"
End Sub

En el archivo excel que adjunto hay una hoja que se llama plantilla , que es como queremos que sean todas las hojas csv importadas. , en esta, están las columnas que se importan de los archivos csv: :Tool_number Tool_name Tool_Diameter Tip_Radius Tool_Length Tool_Flutes Tool_Overhang Tool_Holder Tool_Coolant Tool_Time Compensation ,
A parte he creado otras 3 columnas : Hta montada y columna 1 y columna 2. En este caso las 2 columnas sin nombre es para que si se clika en hTa montada se ponga la celda A en rojo, es decir, que si se puede hacer de otra manera solo seria necesario la columna de Hta montada.

Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Macro excel importar datos csv

Publicado por Antoni Masana (2478 intervenciones) el 30/04/2023 20:11:12
Esta macro resuelve la primera parte que es utilizar la plantilla para crear una hoja para cada fichero csv.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Sub Open_csv()
    Dim Ruta As String, Archivos As String, Nombre_Hoja As String, Existe_Hoja As Boolean
 
    Dim sLine As Variant, sItems As Variant, itm As Variant
    Dim fila As Long, col As Long
    '
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
 
    Ruta = ThisWorkbook.Path & "\"
'   Ruta = ThisWorkbook.Path & "\" & "archivos\"
'   Ruta = Sheets("Lista Archivos").Range("B1").Value
 
    If Right(Ruta, 1) <> "\" Then Ruta = Ruta & "\"
 
    Archivos = Dir(Ruta & "*.csv")
    Do While Archivos <> ""
        rutaArch = Ruta & Archivos
 
        Nombre_Hoja = Replace(Archivos, ".csv", "", , , vbTextCompare)
        fila = 0
 
        Existe_Hoja = False
        For Punt = 1 To Sheets.Count
            If Sheets(Punt).Name = Nombre_Hoja Then Existe_Hoja = True: Exit For
        Next
 
        If Not Existe_Hoja Then
            Sheets("PLANTILLA").Copy After:=Sheets(ActiveWorkbook.Sheets.Count)
            ActiveSheet.Name = Nombre_Hoja
        End If
 
        Open rutaArch For Input As #1
        Do While Not EOF(1)
            Line Input #1, sLine
            sItems = Split(sLine, "@")
            fila = fila + 1
            Sheets(Nombre_Hoja).Range("A" & fila).Resize(1, UBound(sItems) + 1).Value = sItems
            col = 0
            For Each itm In sItems
                col = col + 1
                Sheets(Nombre_Hoja).Cells(fila, col).Value = IIf(IsNumeric(itm), Val(itm), itm)
            Next
        Loop
        Sheets(Nombre_Hoja).Cells.EntireColumn.AutoFit
        Close #1
 
        Archivos = Dir()
    Loop
 
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

La segunda parte es si una línea ya existe, sobre escribirla y en caso contrario añadirla al final.

Este campo Tool_number ¿Es único y sirve para buscar duplicados?

Puedes enviar varias versiones del los ficheros csv, es decir el mismo fichero con contenidos diferentes.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 21
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Macro excel importar datos csv

Publicado por Ana (27 intervenciones) el 05/05/2023 12:25:11
Hola,
La macro va muy bien y hace lo que necesito, excepto que no consigo que si, por ejemplo uno de los proyectos ya se ha terminado y lo borramos de la carpeta en la que están todos los archivos csv al volver a dar a la macro esa hoja se queda. Y me gustaría, si es posible, que al volver a dar la macro borre las hojas de los archivos csv que ya no están , o simplemente actualizar todo y copiar de nuevo solo los archivos que se encuentran en ese momento.


Este campo Tool_number ¿Es único y sirve para buscar duplicados? si, es único y no hay duplicados en cada archivo csv, puede que en el que mande los hubiese pero era para hacer pruebas.

Puedes enviar varias versiones del los ficheros csv, es decir el mismo fichero con contenidos diferentes. No podría pasar porque en la carpeta en la que se dejan si hay 2 iguales se sustituiría por el nuevo-mas reciente.

Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Macro excel importar datos csv

Publicado por Antoni Masana (2478 intervenciones) el 05/05/2023 20:54:54
Un pequeño cambio para eliminar de la hoja los que ya no están en el fichero csv.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Sub Open_csv()
    Dim Ruta As String, Archivos As String, Nombre_Hoja As String, Existe_Hoja As Boolean
 
    Dim sLine As Variant, sItems As Variant, itm As Variant
    Dim fila As Long, col As Long
    '
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
 
    Ruta = ThisWorkbook.Path & "\"
'   Ruta = ThisWorkbook.Path & "\" & "archivos\"
'   Ruta = Sheets("Lista Archivos").Range("B1").Value
 
    If Right(Ruta, 1) <> "\" Then Ruta = Ruta & "\"
 
    Archivos = Dir(Ruta & "*.csv")
    Do While Archivos <> ""
        rutaArch = Ruta & Archivos
 
        Nombre_Hoja = Replace(Archivos, ".csv", "", , , vbTextCompare)
        fila = 0
 
        Existe_Hoja = False
        For Punt = 1 To Sheets.Count
            If Sheets(Punt).Name = Nombre_Hoja Then
               Sheets(Punt).Delete
               Sheets("PLANTILLA").Copy After:=Sheets(ActiveWorkbook.Sheets.Count)
               ActiveSheet.Name = Nombre_Hoja
               DoEvents
               Exit For
            End If
        Next
 
        Open rutaArch For Input As #1
        Do While Not EOF(1)
            Line Input #1, sLine
            sItems = Split(sLine, "@")
            fila = fila + 1
            Sheets(Nombre_Hoja).Range("A" & fila).Resize(1, UBound(sItems) + 1).Value = sItems
            col = 0
            DoEvents
            For Each itm In sItems
                col = col + 1
                Sheets(Nombre_Hoja).Cells(fila, col).Value = IIf(IsNumeric(itm), Val(itm), itm)
            Next
        Loop
        Sheets(Nombre_Hoja).Cells.EntireColumn.AutoFit
        Close #1
 
        Archivos = Dir()
    Loop
 
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

Elimina la hoja y crea una nueva.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 21
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Macro excel importar datos csv

Publicado por Ana (27 intervenciones) el 09/05/2023 10:35:09
Hola,
No me deja ejecutarla, se para en :

Open rutaArch For Input As #1
Do While Not EOF(1)
Line Input #1, sLine
sItems = Split(sLine, "@")
fila = fila + 1
Sheets(Nombre_Hoja).Range("A" & fila).Resize(1, UBound(sItems) + 1).Value = sItems
col = 0
DoEvents
For Each itm In sItems
col = col + 1
Sheets(Nombre_Hoja).Cells(fila, col).Value = IIf(IsNumeric(itm), Val(itm), itm)
Next

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar