Excel - copia incremental 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

copia incremental datos csv

Publicado por Ana (27 intervenciones) el 02/08/2023 10:38:20
Buenos días,
Tengo este Excel que copia datos de archivos csv a un Excel. Al copiarlos usa una PLANTILLA creada en el mismo Excel, lo que necesito hacer es que cuando copie los datos lo haga de manera incremental, es decir que si yo vuelvo a ejecutar la macro (Open_csv) y hay archivos que ya se han copiado lo único que tiene que hacer es respetar los que había , sin modificarlos y copie los nuevos, si hay. La manera que tiene de saber que hay datos nuevos, son los datos que se encuentran en la columna A (a partir de la A2), ya que la primera fila es el encabezado de la tabla PLANTILLA .
Adjunto el excel (hay mas macros, pero la que necesito modificar es (Open_csv).
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

copia incremental datos csv

Publicado por Antoni Masana (2478 intervenciones) el 02/08/2023 19:46:44
Le estoy dando un vistazo y he visto dos cosas a comentar:

Hay dos procesos que son iguales y hacen lo mismo

Sub MacrosJuntas()
Sub EjecutarMacrosJuntas()

Otro tema:

Esto no me gusta:

1
2
3
4
5
6
sub ...
        ' Verifica si la hoja debe mantenerse
        If ws.Name = "PLANTILLA" Or ws.Name = "List.Hta.Montada" Or ws.Name = "HTA-CARGADOR-MAKINO" Or ws.Name = "Lista Archivos" Then
            ' Si es una de las hojas que deben mantenerse, salta al siguiente bucle
            GoTo SiguienteHoja
        End If

Lo cambio por esto:

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
sub ...
        If ws.Name <> "PLANTILLA" And _
           ws.Name <> "List.Hta.Montada" And _
           ws.Name <> "HTA-CARGADOR-MAKINO" And _
           ws.Name <> "Lista Archivos" Then
 
            ' Construye la ruta del archivo csv
            archivo = ruta & "\" & ws.Name & ".csv"
 
            ' Verifica si el archivo existe en la ruta
            hojaEncontrada = Dir(archivo) <> ""
 
            ' Si la hoja no se encuentra en la ruta, se elimina
            If Not hojaEncontrada Then
                If Not hojaProtegida Then
                    ' Comprobar si la hoja es la activa antes de eliminarla
                    If ws.Name = hojaActiva.Name Then
                        eliminarHojaActiva = True ' Marcar para eliminar la hoja activa
                    End If
 
                    Application.DisplayAlerts = False ' Desactiva los mensajes de confirmación de eliminación
                    ws.Delete
                    Application.DisplayAlerts = True
                End If
            End If
        End If

Y ahora a la cuestión de la consulta.

En este trozo de código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub Open_csv()
        Open rutaArch For Input As #1
        Do While Not EOF(1)
            Line Input #1, sLine ' Leer una línea del archivo
            sItems = Split(sLine, "@") ' Dividir la línea en elementos utilizando el carácter "@"
 
            fila = fila + 1
            ReDim Preserve dataArray(1 To UBound(sItems) + 1, 1 To fila) ' Ajustar el tamaño del array según el número de columnas
 
            For col = 1 To UBound(sItems) + 1
                If col <> 12 Then ' Excluir la columna L (12) en el archivo CSV
                    dataArray(col, fila) = sItems(col - 1)
                End If
            Next col
        Loop
 
        Close #1
 
        ' Transferir los datos del array a la hoja de destino
        With Sheets(Nombre_Hoja)
            .Range("A1").Resize(fila, UBound(dataArray, 1)).Value = Application.Transpose(dataArray)
            .Columns.AutoFit
        End With

En lugar de ir cargando un array y copiarlo en la hoja se busca el primer elemento en la columna A y si no existe se añade.

El resultado seria algo asi

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
Sub Open_csv()
        ' ---&--- Cuenta el númro de filas con datos
 
        With Sheets(Nombre_Hoja)
            fila = 0
            While .Cells(fila + 1, "A") <> Empty
                fila = fila + 1
            Wend
        End With
 
        ' ---&--- Abre el fichero y actualiza la hoja
 
        Open rutaArch For Input As #1
        Do While Not EOF(1)
            Line Input #1, sLine ' Leer una línea del archivo
            sItems = Split(sLine, "@") ' Dividir la línea en elementos utilizando el carácter "@"
 
            Existe = False
            For b = 1 To fila
                If sItems(0) = Cells(b, "A") Then Existe = True
            Next
 
            If Not Existe Then
                fila = fila + 1
                With Sheets(Nombre_Hoja)
                    .Cells(fila, "A") = sItems(0)
                    .Cells(fila, "B") = sItems(1)
                    .Cells(fila, "C") = sItems(2)
                    .Cells(fila, "D") = sItems(3)
                    .Cells(fila, "E") = sItems(4)
                    .Cells(fila, "F") = sItems(5)
                    .Cells(fila, "G") = sItems(6)
                    .Cells(fila, "H") = sItems(7)
                    .Cells(fila, "I") = sItems(8)
                    .Cells(fila, "J") = sItems(9)
                    .Cells(fila, "K") = sItems(10)
                End With
            End If
        Loop
        Close #1 

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

copia incremental datos csv

Publicado por Ana (27 intervenciones) el 03/08/2023 12:13:33
Hola Antoni,
Lo primero muchísimas gracias por tu ayuda y tiempo.
Cuando ejecuto una vez la macro me copia bien los datos pero si la vuelvo a ejecutar y ya existe esa hoja me duplica los datos y así sucesivamente, además cuando les duplica no es que haga, si por ejemplo había 6 filas con datos me vuelva a duplicar esas 6 filas, puede que duplique 3 y luego si la vuelvo a ejecutar duplique 4.
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

copia incremental datos csv

Publicado por Antoni Masana (2478 intervenciones) el 03/08/2023 15:55:27
Había un problema al hacer referencia a la hoja.

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
Sub Open_cvs()
    ...
        With Sheets(Nombre_Hoja)
 
            ' ---&--- Cuenta el númro de filas con datos
 
            fila = 0
            While .Cells(fila + 1, "A") <> Empty
                fila = fila + 1
            Wend
 
            ' ---&--- Abre el fichero y actualiza la hoja
 
            Open rutaArch For Input As #1
            Do While Not EOF(1)
                Line Input #1, sLine ' Leer una línea del archivo
                sItems = Split(sLine, "@") ' Dividir la línea en elementos utilizando el carácter "@"
 
                Existe = False
                For b = 1 To fila
                    If sItems(0) = .Cells(b, "A") Then Existe = True
                Next
 
                If Not Existe Then
                fila = fila + 1
                    .Cells(fila, "A") = sItems(0)
                    .Cells(fila, "B") = sItems(1)
                    .Cells(fila, "C") = sItems(2)
                    .Cells(fila, "D") = sItems(3)
                    .Cells(fila, "E") = sItems(4)
                    .Cells(fila, "F") = sItems(5)
                    .Cells(fila, "G") = sItems(6)
                    .Cells(fila, "H") = sItems(7)
                    .Cells(fila, "I") = sItems(8)
                    .Cells(fila, "J") = sItems(9)
                    .Cells(fila, "K") = sItems(10)
                End If
            Loop
        End With
        Close #1

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

copia incremental datos csv

Publicado por Ana (27 intervenciones) el 04/08/2023 10:25:08
Buenos días,
Perfecto, funciona tal y como quería.
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