** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Otros de Microsoft: Windows y Office > Excel
  Mensajes nuevos Mensajes nuevos RSS - Separar tabla en varias tablas
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoSeparar tabla en varias tablas

 Responder Responder
Autor
Mensaje
Gladiador Ver desplegable
Habitual
Habitual
Avatar

Unido: 22/Junio/2006
Localización: Venezuela
Estado: Sin conexión
Puntos: 166
Enlace directo a este mensaje Tema: Separar tabla en varias tablas
    Enviado: 21/Septiembre/2020 a las 04:54
Hola amigos, nuevamente yo por acá.
Solicito ayuda de este foro, pues tengo una tabla que deseo separar/dividir en varia tablas más pequeñas:

Ejemplo
Tabla General
Matemáticas Luis
Química Pedro
Literatura María
Física Juan
Matemáticas Jose
Literatura Enrique
Física Rafael
Química Elena
Matemáticas Laura
Literatura Javier
Matemáticas Carmen
Literatura Manuel
Química Alejandra
Matemáticas Francisco
Matemáticas Química Literatura Física
Luis Pedro María Juan
Jose Elena Enrique Rafael
Carmen Alejandra Javier
Francisco Manuel
Laura

Deseo separar la tabla original en varias tablas como he mostrado.
Existe alguna manera, mi tabla actual tiene como 1300 registros

Gracias

Gladiador

Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: Binghamton Jail
Estado: Sin conexión
Puntos: 3583
Enlace directo a este mensaje Enviado: 21/Septiembre/2020 a las 16:07
Pues así a ojo
Lo que haría para hacerlo como tú quieres es una hoja excel por cada asignatura, es decir, que el nombre de la hoja sea el nombre de la asignatura.

Como no dices cuantas asignaturas hay y solo das un ejemplo, voy a suponer que las asignaturas que tienes son esas cuatro, y que en todos los casos está bien escrito el nombre (quiero decir, la asignatura siempre es matemáticas, nunca matematicas ni matemática)

Luego haría con VBA un bucle que lea desde la fila 1 hasta la ¿1.300? y vaya copiando el nombre, con lo cual al final conservarás la hoja original y además tendrás todos los usuarios en sus respectivas hojas.

Y creo que resultaría más fácil si previamente ordenas la hoja original por el nombre de la asignatura.

Un saludo.

Luis
Hay un culto a la ignorancia y siempre lo ha habido y es alimentado por la falsa noción de que democracia significa que "mi ignorancia es tan buena como su conocimiento". (Isaac Asimov)
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5668
Enlace directo a este mensaje Enviado: 22/Septiembre/2020 a las 13:40

Suponiendo que tus datos están a partir de A1:B1, mi código escribe lo que pides a partir de J1 (misma hoja, haz los cambios que creas conveniente):

 

Sub prueba()

  Dim celda As Range, filaU&, colD&, filaD&

  Application.ScreenUpdating = False

  filaU = Cells(Rows.Count, 1).End(xlUp).Row

  Range("CD2").FormulaR1C1 = "=IFERROR(9+MATCH(R[-1]C,R[-1]C[-72]:R[-1]C[-1],0),10+COUNTA(R[-1]C[-72]:R[-1]C[-1]))"

  For Each celda In Range("A1:A" & filaU).Cells

    Range("CD1").Value = celda.Value

    colD = Range("CD2").Value

    Cells(1, colD).Value = celda.Value

    filaD = Cells(Rows.Count, colD).End(xlUp).Row + 1

    Cells(filaD, colD).Value = celda.Offset(0, 1).Value

  Next celda

  Range("CD1:CD2").ClearContents

  Application.ScreenUpdating = True

End Sub



Aprendemos intentando resolver dudas ajenas (ayuda cuando puedas, también será tu beneficio).

Mi sitio_web con ejemplos Excel.
Arriba
chucho Ver desplegable
Nuevo
Nuevo


Unido: 03/Agosto/2020
Localización: Asturias
Estado: Sin conexión
Puntos: 7
Enlace directo a este mensaje Enviado: 23/Septiembre/2020 a las 16:43
Sin necesidad de VBA, creas una tabla dinámica

Etiquetas de fila Cuenta de Nombre
Física 2
Literatura 4
Matemáticas 5
Química 3
Total general 14
Y luego pinchando sobre cualquier grupo te genera una hoja con las personas de la asignatura.

Asignatura Nombre
Química Alejandra
Química Pedro
Química Elena
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5668
Enlace directo a este mensaje Enviado: 23/Septiembre/2020 a las 20:49
Gracias chucho por el aporte, todo suma, sobre todo la intensión.

Una tabla dinámica permite obtener algo parecido, con los 2 campos en Etiquetas de fila ...

Asignaturas Nombres
Física 2
Literatura 4
Enrique 1
Javier 1
Manuel 1
María 1
Matemáticas 5
Química 3
Total general 14


... de hecho para mí lo haría así, peeero... no es (exactamente) lo que pide Gladiador  y como no conozco las razones que pueda tener para quererlo así... Ermm

Saludos: Antonio.

Aprendemos intentando resolver dudas ajenas (ayuda cuando puedas, también será tu beneficio).

Mi sitio_web con ejemplos Excel.
Arriba
Gladiador Ver desplegable
Habitual
Habitual
Avatar

Unido: 22/Junio/2006
Localización: Venezuela
Estado: Sin conexión
Puntos: 166
Enlace directo a este mensaje Enviado: 28/Septiembre/2020 a las 03:33
Hola Amigos.
Gracias por el aporte de todos.
Chucho, ya había probado con una tabla dinámica, pero no me da el resuoltado esperado

La solución de AnSanVal, funciona perfecto, muchas gracias.

Solo pediría agregar algo.

La posibilidad de generar esa misma tabla, de manera dinámica, si agrego o elimino algún nombre o materia

La intensión final, es generar una lista desplegable dependiente, de la materia seleccionada.

Gracias
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5668
Enlace directo a este mensaje Enviado: 28/Septiembre/2020 a las 12:14

Para actuar dinámicamente al agregar o eliminar, deberás basarte en el evento Worksheet_Change de la hoja.

Para la lista desplegable tienes ejemplos en mi sitio web, posiblemente te valga Validación dependiente (3) o Validación con doble lista desplegable (53).

De cualquier modo con Filtro avanzado y una sola tabla*, podrías tener resuelto todo eso (con el formato de la tabla), incluso lo de agregar/eliminar. El filtro avanzado se puede generar por código.

* Una sola tabla es más polivalente para la obtención de informes.



Aprendemos intentando resolver dudas ajenas (ayuda cuando puedas, también será tu beneficio).

Mi sitio_web con ejemplos Excel.
Arriba
Gladiador Ver desplegable
Habitual
Habitual
Avatar

Unido: 22/Junio/2006
Localización: Venezuela
Estado: Sin conexión
Puntos: 166
Enlace directo a este mensaje Enviado: 29/Septiembre/2020 a las 04:41
Publicado originalmente por AnSanVal AnSanVal escribió:


Para actuar dinámicamente al agregar o eliminar, deberás basarte en el evento Worksheet_Change de la hoja.




Gracias AnSanVal
 Me podrias ayudar con el código.
He estado haciendo el intento y no he podido.
Gracias

Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5668
Enlace directo a este mensaje Enviado: 29/Septiembre/2020 a las 22:29

Si con «… Ayudar…» te refieres a hacértelo… no puedo, no debería haberte dado el anterior en modo funcional, ya que ello significa competencia desleal hacia otros profesionales que viven de eso.

Dices que lo has intentado y no lo has conseguido. Muestra lo que has hecho y donde te has bloqueado. Si es un detalle determinado y puedo, intentaré ayudarte.


Aprendemos intentando resolver dudas ajenas (ayuda cuando puedas, también será tu beneficio).

Mi sitio_web con ejemplos Excel.
Arriba
Gladiador Ver desplegable
Habitual
Habitual
Avatar

Unido: 22/Junio/2006
Localización: Venezuela
Estado: Sin conexión
Puntos: 166
Enlace directo a este mensaje Enviado: 30/Septiembre/2020 a las 01:24
Publicado originalmente por AnSanVal AnSanVal escribió:

Si con «… Ayudar…» te refieres a hacértelo… no puedo, no debería haberte dado el anterior en modo funcional, ya que ello significa competencia desleal hacia otros profesionales que viven de eso.

Dices que lo has intentado y no lo has conseguido. Muestra lo que has hecho y donde te has bloqueado. Si es un detalle determinado y puedo, intentaré ayudarte.


Hola, si, tienes toda la razón AnSanVal.
Te comento lo que he estado realizando

En Worksheet_Change, he colocado, además del código que me enviaste, la siguiente isntrucción

    ActiveSheet.Range("J1").CurrentRegion.Select
    Selection.Clear
Con la intension de borrar todos los datos y, luego, ejecutar el código que me enviaste.

Esto me ha dado  "Out of stack space (Error 28)" Esto y me bota del programa
Ya pude entender la razón. Cada vez que extrae un nombre, es un Cambio en la hoja y se debería ejecutar de nuevo la rutina.

Probé luego con "Worksheet_TableUpdate", cambiando los datos a una tabla,  pero no pasa nada.

Se que ha sido muy rudimentario mi enfoque, pero es todo lo que conozco.

gracias


Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: Binghamton Jail
Estado: Sin conexión
Puntos: 3583
Enlace directo a este mensaje Enviado: 30/Septiembre/2020 a las 03:27
Inténtalo así:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False 
    
...
    
Application.EnableEvents = True
End Sub
Hay un culto a la ignorancia y siempre lo ha habido y es alimentado por la falsa noción de que democracia significa que "mi ignorancia es tan buena como su conocimiento". (Isaac Asimov)
Arriba
Gladiador Ver desplegable
Habitual
Habitual
Avatar

Unido: 22/Junio/2006
Localización: Venezuela
Estado: Sin conexión
Puntos: 166
Enlace directo a este mensaje Enviado: 30/Septiembre/2020 a las 05:17
Gracias Ibanluz, 
Con tu ayuda pude hacer que el evento Worksheet_Change funcione de maravilla

Gracias AnSanVal.
El código que me enviaste funciona muy bien.

La macro completa, por si alguien está interesado en algo parecido, quedó de la siguiente manera:

Private Sub Worksheet_Change(ByVal Target As Range)
 
Dim celda As Range, filaU&, colD&, filaD&

Application.EnableEvents = False
  Application.ScreenUpdating = False

    ActiveSheet.Range("J1").CurrentRegion.Clear

  filaU = Cells(Rows.Count, 1).End(xlUp).Row

  Range("CD2").FormulaR1C1 = "=IFERROR(9+MATCH(R[-1]C,R[-1]C[-72]:R[-1]C[-1],0),10+COUNTA(R[-1]C[-72]:R[-1]C[-1]))"

  For Each celda In Range("A1:A" & filaU).Cells

    Range("CD1").Value = celda.Value

    colD = Range("CD2").Value

    Cells(1, colD).Value = celda.Value

    filaD = Cells(Rows.Count, colD).End(xlUp).Row + 1

    Cells(filaD, colD).Value = celda.Offset(0, 1).Value

  Next celda

  Range("CD1:CD2").ClearContents
  
Application.EnableEvents = True

  Application.ScreenUpdating = True

End Sub

Funciona si elimino/cambio algún alumno. También, si agrego una materia diferente.

Muy, pero muy agradecido a todos

Por mi parte se puede cerrar el hilo

Gracias
Gladiador
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5668
Enlace directo a este mensaje Enviado: 30/Septiembre/2020 a las 12:27

Veo que cada vez que añades (o borras) una asignatura se borran todos los datos que ya tienes y se escriben de nuevo, y al escribir (o borrar) el alumno otro tanto de lo mismo (no es muy eficiente).

Pero como suele decirse por aquí «si funciona no lo cambies».

 

- [Aunque yo trabajaría sólo con las modificaciones, sin borrar reescribir los datos ya pasados, pero eso sí; ¡Complicaría más el código VBA!: habría que trabajar, además de con Worksheet_Change, con Worksheet_SelectionChange para identificar cuando modificas una celda vacía (estás agregando) o cuando modificas una celda con texto (estás borrando o modificando), en este evento se tendría que ‘memorizar’ los contenidos de la pareja de celdas].

Tal como lo tienes y sin complicar demasiado el código VBA; con lo resaltado en (rojo)…

Private Sub Worksheet_Change(ByVal Target As Range)

  Dim celda As Range, filaU&, colD&, filaD&, A As Boolean, B As Boolean

  A = Cells(Target.Row, 1).Value = "": B = Cells(Target.Row, 2).Value = ""

  If A <> B Then Exit Sub

  Application.EnableEvents = False

  Application.ScreenUpdating = False

  ActiveSheet.Range("J1").CurrentRegion.Clear

  filaU = Cells(Rows.Count, 1).End(xlUp).Row 

  Range("CD2").FormulaR1C1 = "=IFERROR(9+MATCH(R[-1]C,R[-1]C[-72]:R[-1]C[-1],0),10+COUNTA(R[-1]C[-72]:R[-1]C[-1]))" 

  For Each celda In Range("A1:A" & filaU).Cells

    Range("CD1").Value = celda.Value

    colD = Range("CD2").Value

    Cells(1, colD).Value = celda.Value

    filaD = Cells(Rows.Count, colD).End(xlUp).Row + 1

    Cells(filaD, colD).Value = celda.Offset(0, 1).Value

  Next celda 

  Range("CD1:CD2").ClearContents

  Application.EnableEvents = True

  Application.ScreenUpdating = True

End Sub

 

… sólo ejecutas el código cuando agregas/borras asignatura y alumno, y no cuando modificas sólo uno de ellos (al menos evitas el 50% de escrituras y borrados).

 

Aprendemos intentando resolver dudas ajenas (ayuda cuando puedas, también será tu beneficio).

Mi sitio_web con ejemplos Excel.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable