¿ Cómo filtrar datos que se repiten Nveces en una base de datos y pasarlos a una nueva tabla ?

Tengo un problema en obtener los datos de los alumnos que se encuentran inscritos en cierto semestre. Lo que deseo hacer es que los alumnos que están inscritos en el semestre correspondiente pero que NO tienen su carga de materias completa, copiarlos a otra tabla.

Es decir, un alumno que tiene su carga(normal) completa aparece en la base de datos 8 veces, una vez por materia.

Por tanto, un alumno que NO tiene su carga completa aparece en la base de datos menor a 8 veces.

Mi pregunta es: ¿Cómo hacer para filtrar a los alumnos(con todos sus datos) que NO tienen su carga completa y copiarlos a otra tabla?

Por ejemplo, en este caso copiaría todos los datos de la alumna: ANDREA MAGALY CHAVEZ AGUILAR ya que el numero de materias que cursa es menor a 8.

Respuesta
1

Prueba esta macro, te copiara a la hoja 2 en un sola pasada todos los datos de quienes no tengan 8 materias, lo único que tienes que cambiar son estas dos líneas al principio de la macro para adaptarla a tus datos

Set DATOS = Range("A1").CurrentRegion
Set DESTINO = Worksheets("HOJA2")

Sub COPIAR_DATOS()
Dim DATOS As Range, TCURP As Range, NVECES As Range
Dim FUNCION As WorksheetFunction
Set DATOS = Range("A1").CurrentRegion
Set FUNCION = WorksheetFunction
Set DESTINO = Worksheets("HOJA2")
With DATOS
    FCURP = FUNCION.Match("CURP", .Rows(1), 0)
    F = .Rows.Count: C = .Columns.Count
    .Sort KEY1:=Range(.Columns(FCURP).Address), ORDER1:=xlAscending, Header:=xlYes
    .Columns(C + 5).CurrentRegion.Clear
    Set TCURP = .Columns(C + 5).Resize(F, 1)
    .Columns(FCURP).Copy:   TCURP.PasteSpecial
    With TCURP
        .RemoveDuplicates Columns:=1
        Set TCURP = .CurrentRegion
    End With
    Set NVECES = .Columns(C + 1).Resize(F, 1)
    With TCURP
        For I = 2 To .Rows.Count
            CURP = .Cells(I, 1)
            FILA = FUNCION.Match(CURP, DATOS.Columns(FCURP), 0)
            CUENTA = FUNCION.CountIf(DATOS.Columns(FCURP), CURP)
            NVECES.Rows(FILA).Resize(CUENTA, 1) = CUENTA
        Next I
    End With
    Set DATOS = .CurrentRegion
End With
With DATOS
    .Sort KEY1:=Range(.Columns(C + 1).Address), ORDER1:=xlDescending, Header:=xlYes
    CUENTA = FUNCION.CountIf(DATOS.Columns(C + 1), 8)
    .Rows(CUENTA + 2). Resize(F - CUENTA - 1). Copy
    DESTINO.Range("A2").PasteSpecial
    .Rows(1).Copy
    DESTINO.Range("A1").PasteSpecial
End With
NVECES.Clear: TCURP.Clear
Set NVECES = Nothing: Set TCURP = Nothing
End Sub

Hola, de antemano le agradezco el apoyo.

Tengo problemas con la función 

 FCURP = FUNCION.Match("CURP", .Rows(1), 0)

El problema ya está resuelto. 

¡Gracias! 

2 respuestas más de otros expertos

Respuesta
2

Te puedo construir una macro para copiar los datos, solamente dime en cuál columna está el CURP y en cuál fila empiezan los datos.

Te anexo la macro.

Antes de ejecutar la macro, actualiza en la macro los siguientes datos por tus datos.

    Set h1 = Sheets("RESULTADO")    'hoja origen
    Set h2 = Sheets("SIN CARGA")    'hoja destino de alumnos sin carga completa
    Set h3 = Sheets("TEMP")         'hoja temporal
    col = "L"                       'columna del curp
    fila = 2                        'fila donde empiezan los datos

Debes crear una tercera hoja llamada "TEMP"


Pon la siguiente macro en un módulo:

Sub Copiar_Alumnos()
'Por Dante Amor
    Application.ScreenUpdating = False
    '
    Set h1 = Sheets("RESULTADO")    'hoja origen
    Set h2 = Sheets("SIN CARGA")    'hoja destino de alumnos sin carga completa
    Set h3 = Sheets("TEMP")         'hoja temporal
    col = "L"                       'columna del curp
    fila = 2                        'fila donde empiezan los datos
    '
    h2.Rows(fila & ":" & Rows.Count).ClearContents
    h3.Cells.Clear
    '
    coln = Columns(col).Column
    h1.Columns(col).Copy h3.Columns(1)
    u3 = h3.Range("A" & Rows.Count).End(xlUp).Row
    h3.Range("A" & fila - 1 & ":A" & u3).RemoveDuplicates Columns:=1, Header:=xlYes
    u3 = h3.Range("A" & Rows.Count).End(xlUp).Row
    For i = fila To u3
        If h1.AutoFilterMode Then h1.AutoFilterMode = False
        u1 = h1.Range(col & Rows.Count).End(xlUp).Row
        curp = h3.Cells(i, "A").Value
        cuenta = WorksheetFunction.CountIf(h1.Range(h1.Cells(fila, col), h1.Cells(u1, col)), curp)
        If cuenta < 8 Then
            h1.Range(h1.Cells(fila - 1, "A"), h1.Cells(u1, col)).AutoFilter Field:=coln, Criteria1:=curp
            u11 = h1.Range(col & Rows.Count).End(xlUp).Row
            u2 = h2.Range(col & Rows.Count).End(xlUp).Row + 1
            h1.Rows(fila & ":" & u11).Copy
            h2.Range("A" & u2).PasteSpecial xlValues
        End If
    Next
    If h1.AutoFilterMode Then h1.AutoFilterMode = False
    Application.ScreenUpdating = True
    Application.CutCopyMode = False
    '
    MsgBox "Fin copia de alumnos sin carga completa"
End Sub

Sigue las Instrucciones para un botón y ejecutar la macro

  1. Abre tu libro de Excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. En el menú elige Insertar / Módulo
  4. En el panel del lado derecho copia la macro
  5. Ahora para crear un botón, puedes hacer lo siguiente:
  6. Inserta una imagen en tu libro, elige del menú Insertar / Imagen / Autoformas
  7. Elige una imagen y con el Mouse, dentro de tu hoja, presiona click y arrastra el Mouse para hacer grande la imagen.
  8. Una vez que insertaste la imagen en tu hoja, dale click derecho dentro de la imagen y selecciona: Tamaño y Propiedades. En la ventana que se abre selecciona la pestaña: Propiedades. Desmarca la opción “Imprimir Objeto”. Presiona “Cerrar”
  9. Vuelve a presionar click derecho dentro de la imagen y ahora selecciona: Asignar macro. Selecciona: pinta
  10. Aceptar.
  11. Para ejecutarla dale click a la imagen.

'.[Sal u dos. Dante Amor. No olvides valorar la respuesta. 
'.[Avísame cualquier duda

.

[

'

Hola! 

En verdad le agradezco mucho !!

Los resultados esperados son exitosos !!!

Debo reconocer que estaba lejos de encontrar la solución.

La idea que yo tenía era ir contando las veces que se repetía el mismo nombre del alumno y si las veces repetidas del mismo nombre era menor a 8, entonces copiar los datos del alumno...

La imagen que le envié es ya un filtro de alumnos que pertenecen al mismo grupo, turno y grado.

La base de datos original contiene los datos de todos los alumnos de la escuela.

* Es mi primer proyecto en excel con vba. 

¡ Muchas Gracias! 

Al final de mi respuesta hay un botón para valorar la respuesta: "Votar" o "Excelente". No olvides valorar la respuesta.

Respuesta
1

Alternativa sin macros:

Agrega una columna nueva y pon la siguiente fórmula (asumo que el CURP esta en columna L y que tus datos empiezan en la fila 2 pues en la 1 hay encabezados)

=CONTAR.SI(L:L, L2)

Filtra la tabla por esa nueva columna... copia y pega en otra hoja

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas