Excel - macro copiar varias condiciones

 
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 copiar varias condiciones

Publicado por Ana (27 intervenciones) el 15/01/2024 10:15:16
Buenos días,

Necesito copiar unos datos con varias condiciones, los datos están en la hoja List.Hta.Montada y solo se utilizan los datos de las columnas A y L.
Lo que quiero que la macro haga es esto, copiar los datos en otra hoja que creara cuando se ejecute la macro llamada HTAS.DESMONTAR., si la hoja existe solo debe actualizar los datos y si no existe crearla y copiar los datos.
Las condiciones para copiar son 2:
La primeras es ver aquellos datos de la columna A que están repetidos y la segunda es que solo debe copiar de estos datos obtenidos (repetidos columna A) los que no tengan los valores HTA-CARGADOR-MAKINO ni CHARMILLES, en la columna L,
Ejemplo, tengo el valor 2] (columna A) repetidos 3 veces, y sus datos de la columna L son: 006-0001 ,006-0002 y HTA-CARGADOR-MAKINO, como en una de las repeticiones tiene el valor HTA-CARGADOR-MAKINO, ya no va a copiar nada, ni el del valor 006-0001 ni el 006-0002, por el contrario , si tengo el valor 525 , repetido 4 veces y sus valores en la columna L son: 006-0001,006-0002,014-0025 y 013-0023, si que debe copiarlos, las 4 repeticiones.
En la hoja HTAS.DESMONTAR solo quiero que copie los datos obtenidos A y L , no es necesario que copie los datos de las demás columnas.
En el excel que adjunto esta creada la hoja HTAS.DESMONTAR y los datos que la macro debería copiar.
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 copiar varias condiciones

Publicado por Antoni Masana (2478 intervenciones) el 15/01/2024 12:24:43
Buenos días.

Te adjunto el módulo con la macro.
Añade el módulo al libro y lo guardas como .xlsm o .xlsb

Si ejecutas la macro por segunda vez sobre escribe los datos.

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 copiar varias condiciones

Publicado por Ana (27 intervenciones) el 15/01/2024 13:18:17
Hola Antoni,
Muchas gracias por tu ayuda.
Lo único que la macro me da errores, primero con la hoja List.Hta.Montada, eso creo que era porque había un espacio después del las comillas y cuando quito el espacio me sale el error en : Next
If Not Existe Then
Worksheets.Add(After:=Worksheets(Sheets.Count)).Name = NOMBRE_HOJA.
No se si puede ser porque el nombre de la hoja tiene un punto. he cambiado el punto por guion bajo y sigue dando error.
Lo único que hace la macro es crear hojas nuevas sin datos.
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 copiar varias condiciones

Publicado por Antoni Masana (2478 intervenciones) el 15/01/2024 19:50:03
El nombre de la hoja destino esta en la línea 3. El nombre de la hoja tiene un punto porque pense que tenia que ser así.

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
Option Explicit
 
Const NOMBRE_HOJA = "HTAS.DESMONTAR."
 
Sub Copia_a_DESMONTAR()
Attribute Copia_a_DESMONTAR.VB_ProcData.VB_Invoke_Func = " \n14"
    Dim Fila As Long, Existe As Boolean, _
        Fila_Orig As Long, _
        Fila_Dest As Long
 
    Sheets("List.Hta.Montada ").Select
 
    ' ---&--- Cuenta las filas
 
    Fila = 1
    While Cells(Fila + 1, "A") <> Empty
        Fila = Fila + 1
    Wend
 
    ' ---&--- Ordena la tabla
 
    Range("A1").Select
    ActiveWorkbook.Worksheets("List.Hta.Montada ").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("List.Hta.Montada ").Sort.SortFields.Add _
          Key:=Range("A2:A" & Fila), _
          SortOn:=xlSortOnValues, _
          Order:=xlAscending, _
          DataOption:=xlSortNormal
 
    With ActiveWorkbook.Worksheets("List.Hta.Montada ").Sort
        .SetRange Range("A1:L" & Fila)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
 
    ' ---&--- Busca si existe la hoja Destino
 
    Existe = False
    For a = 1 To Sheets.Count
        If Sheets(a).Name = NOMBRE_HOJA Then Existe = True
    Next
 
    ' ---&---   Si no existe la hoja Destino la crea
 
    If Not Existe Then
        Worksheets.Add(After:=Worksheets(Sheets.Count)).Name = NOMBRE_HOJA
    End If
 
    ' ---&--- Copiar los datos
 
    Sheets("List.Hta.Montada ").Select: Total = Fila
 
    With Sheets(NOMBRE_HOJA)
        .Range("A1") = Range("A1")
        .Range("B1") = Range("L1")
 
        Fila_Dest = 2
        For Fila_Orig = 2 To Fila
            If Cells(Fila_Orig, "A") = Cells(Fila_Orig - 1, "A") Or _
               Cells(Fila_Orig, "A") = Cells(Fila_Orig + 1, "A") Then
 
                If InStr("HTA-CARGADOR-MAKINO,CHARMILLES", Cells(Fila_Orig, "L")) = 0 Then
 
                    .Range("A" & Fila_Dest) = Range("A" & Fila_Orig)
                    .Range("B" & Fila_Dest) = Range("L" & Fila_Orig)
                    Fila_Dest = Fila_Dest + 1
                End If
            End If
        Next
    End With
End Sub

Si esto da error:

1
2
3
If Not Existe Then
    Worksheets.Add(After:=Worksheets(Sheets.Count)).Name = NOMBRE_HOJA
End If

Prueba esto

1
2
3
4
If Not Existe Then
    Worksheets.Add(After:=Worksheets(Sheets.Count))
    Worksheets(Sheets.Count)).Name = NOMBRE_HOJA
End If

Según la versión de Excel algunas cosas cambian.

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 copiar varias condiciones

Publicado por Ana (27 intervenciones) el 17/01/2024 10:59:47
Hola,
Me sigue dando errores , si lo cambio por
If Not Existe Then
Worksheets.Add(After:=Worksheets(Sheets.Count))
Worksheets(Sheets.Count)).Name = NOMBRE_HOJA
End If

Me da error de sintaxis.
Te paso el excel con todas las macros que he hecho, igual así ves mejor el error que tengo.
En tu macro he puesto como texto el error.
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 copiar varias condiciones

Publicado por Antoni Masana (2478 intervenciones) el 17/01/2024 11:16:44
Veo que tienes una macro que se llama FiltrarDatos que crea una hoja a la derecha de las que ya existen, vamos lo que yo quería hace.

He tomado prestadas unas líneas 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
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
Option Explicit
 
Const NOMBRE_HOJA = "HTAS.DESMONTAR"
 
Sub Copia_a_DESMONTAR()
 
    Dim Fila As Long, Existe As Boolean, _
        Fila_Orig As Long, _
        Fila_Dest As Long, wsDesmontar As Worksheet
 
    Sheets("List.Hta.Montada ").Select
 
    ' ---&--- Cuenta las filas
 
    Fila = 1
    While Cells(Fila + 1, "A") <> Empty
        Fila = Fila + 1
    Wend
 
    ' ---&--- Ordena la tabla
 
    Range("A1").Select
    ActiveWorkbook.Worksheets("List.Hta.Montada ").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("List.Hta.Montada ").Sort.SortFields.Add _
          Key:=Range("A2:A" & Fila), _
          SortOn:=xlSortOnValues, _
          Order:=xlAscending, _
          DataOption:=xlSortNormal
 
    With ActiveWorkbook.Worksheets("List.Hta.Montada ").Sort
        .SetRange Range("A1:L" & Fila)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
 
    ' ---&--- Busca si existe la hoja Destino
 
    Existe = False
    For a = 1 To Sheets.Count
        If Sheets(a).Name = NOMBRE_HOJA Then Existe = True
    Next
 
    ' ---&---   Si no existe la hoja Destino la crea
 
    If Not Existe Then
        Set wsDesmontar = Sheets.Add(After:=Sheets(Sheets.Count))
        wsDesmontar.Name = "HTAS.DESMONTAR"
    End If
 
    ' ---&--- Copiar los datos
 
    Sheets("List.Hta.Montada ").Select: Total = Fila
 
    With Sheets(NOMBRE_HOJA)
        .Range("A1") = Range("A1")
        .Range("B1") = Range("L1")
 
        Fila_Dest = 2
        For Fila_Orig = 2 To Fila
            If Cells(Fila_Orig, "A") = Cells(Fila_Orig - 1, "A") Or _
               Cells(Fila_Orig, "A") = Cells(Fila_Orig + 1, "A") Then
 
                If InStr("HTA-CARGADOR-MAKINO,CHARMILLES", Cells(Fila_Orig, "L")) = 0 Then
 
                    .Range("A" & Fila_Dest) = Range("A" & Fila_Orig)
                    .Range("B" & Fila_Dest) = Range("L" & Fila_Orig)
                    Fila_Dest = Fila_Dest + 1
                End If
            End If
        Next
    End With
End Sub

Esto debería funcionar. Si funciona en uno funciona en el otro.
La culpa es de las versiones de Excel que añaden cosas nuevas y debemos tener versiones 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