Separar por delimitador y transponer añadiendo nuevas filas

Quisiera poder separar nombres que me genera google form en una columna y concatenados por ",". Tengo la macro que me hace el proceso, funciona bien, lo que me falta es que al separar los nombres, añada una nueva fila por cada nombre en ese rango, debajo de donde yo seleccione la celda.

Sub Vertical()
'UpdatebyExtendoffice20161125
Dim i As Long, strTxt As String
Dim startP As Range
Dim xRg As Range, yRg As Range
On Error Resume Next
Set xRg = Application.InputBox _
(Prompt:="Range Selection...", _
Title:="Kutools For Excel", Type:=8)
i = 1
Application.ScreenUpdating = False
For Each yRg In xRg
If i = 1 Then
strTxt = yRg.Text
i = 2
Else
strTxt = strTxt & "," & yRg.Text
End If
Next
Application.ScreenUpdating = True
Set startP = Application.InputBox _
(Prompt:="paste range...", _
Title:="Kutools For Excel", Type:=8)
ary = Split(strTxt, ",")
i = 1
Application.ScreenUpdating = False
For Each a In ary
startP(i, 1).Value = a
i = i + 1
Next a
Application.ScreenUpdating = True
End Sub

La idea es que al seleccionar la celda que tenga varios nombres, se puedan separar los nombres e ir añadiéndolos a una nueva fila debajo de la celda activa, sin reemplazar los datos que están debajo; de esta manera podre ir organizando por categorías y curso : "no presenta actividades, inasistencia" etc.

Muchas gracias a todos.

1 respuesta

Respuesta
1

No entendí tu imagen.

Ayúdame con lo siguiente.

Agrega 2 imágenes.

La primera con los datos originales.

La segunda con los resultados que tú quieres.

Es Muy importante que pongas las dos imágenes.

Google form me genera un informe el cual esta desordenado y también me agrupa los nombres de los estudiantes, de acuerdo a lo que hayan seleccionado los profesores : "por curso, por profesor, por categoría : "Bajo rendimiento en exámenes, impuntualidad, inasistencia, etc", lo que me dificulta es que los nombres de estudiantes están agrupados en una soldá celda.

Para eso, primeramente tengo que separar esos nombres, y ponerlos uno bajo otro "transponer", con la macro que encontré puede hacer todo eso, pero si lo pongo en la celda de abajo reemplaza los datos que hay en esas celdas, para poder ordenar un poco quisiera que se "transponga" pero añadiendo nuevas filas sin remplazar los datos de abajo.

De manera manual haciendo todo ese proceso, puedo organizarlo de esa manera, el proceso manual que hago es "filtrar la cateogoria con la que voy a comenzar :" Impuntualidad, bajo rendimiento, etc", también hago un filtro por curso :"1ro A, 1ro B... etc." elegir la celda que tiene los nombres agrupados > ejecutar la macro para que los separe y ponga uno bajo otro, ejecutar macro que elimina nombres duplicados > posteriormente pegar los nombres según la categoría que quedo.

Gracias por tu ayuda Dante Amor, ahora si creo que me complique mucho creo por no haber organizado bien el formulario.

Si vas a organizar la información en una base de datos, te sugiero que no dejes espacios en blanco:

No importa que se repita el nombre del profesor o de la categoría.
Si llenas todos las celdas, podrás hacer filtros, ordenar los datos, llevarlos a una tabla dinámica, etc.

Y algo muy importante, jamás utilices celdas combinadas en una relación de datos. Eso dificulta todo.

Utiliza una celda combinada en un formato, o para resaltar alguna celda, como un título.


Por otra parte veo que en la primera imagen "el informe" los alumnos están en varias columnas, entonces hay que leer todas las columnas y poner los nombres en una sola columna.

Preparo un código para organizar los datos...

Si, voy a organizar mejor el formulario de google para que no suceda ese desorden, pensé que seria aplicar filtro y ya estaría, pero al estar en varias columnas y con nombres agrupados se complico todo..., agradezco tu tiempo Dante Amor.

Otra duda, en la hoja de salida veo en la columna B el nombre de la materia: "ciencias", "comunicación", etc, pero ese dato no lo veo en la hoja "informe", ¿Dónde está ese dato?

Colummna "B" : Nombre de profesor

Colummna "C" : Curso

Colummna "D" : categorias (no presenta tarea, inasistencia,etc)

Colummna "E:S" : Nombres de estudiantes

Colummna "u" : Areas (Asignaturas : Ciencias Sociales, Biologia, etc)

esas serian la ubicaciones, Dante Amor, gracias por su ayuda.

Prueba la siguiente macro.

Actualiza en la macro los nombres de tus hojas. En la "Hoja1" va el resultado.

Con esa información de salida en Hoja1, podrás ordenar los datos, filtrar por alumno, profesor, hacer la tabla dinámica.

Sub OrganizaDatos()
  Dim sh As Worksheet, sh1 As Worksheet
  Dim a As Variant, b As Variant
  Dim i As Long, j As Long, k As Long, lr As Long, m As Long, n As Long
  Dim addAlum As String
  Dim alumno As Variant
  '
  Set sh = Sheets("Respuesta de formulario 1")
  Set sh1 = Sheets("Hoja1")
  '
  lr = sh.Range("A" & Rows.Count).End(3).Row
  a = sh.Range("A2:U" & lr).Value
  'Calcula el total de alumnos que están en las columnas E a S
  addAlum = sh.Range("E2:S" & lr).Address(external:=True)
  n = Evaluate(Replace("=SUM(IF(@<>""""" & ",LEN(@)-LEN(SUBSTITUTE(@,"","",""""))+1))", "@", addAlum))
  'Dimensiona la matriz de salida
  ReDim b(1 To n, 1 To 5)
  '
  For i = 1 To UBound(a, 1)
    For j = 5 To 19   'columnas E to S
      If a(i, j) <> "" Then
        For Each alumno In Split(a(i, j), ",")
          m = m + 1
          b(m, 1) = a(i, 2)       'profesor
          b(m, 2) = ""            'vacía, en la imagen no se ve el dato
          b(m, 3) = a(i, 21)      'asignatura
          b(m, 4) = a(i, 4)       'categoría
          b(m, 5) = Trim(alumno)  'alumno
        Next
      End If
    Next
  Next
  '
  sh1.Rows("2:" & Rows.Count).ClearContents
  sh1.Range("A2").Resize(UBound(b, 1), UBound(b, 2)).Value = b
End Sub

Revisa y me comentas.

al ejecutar la macro me salen esos datos, faltarían las áreas, profesor, ¿qué podría estar pasando?

Los cursos que están al lado de los nombres de estudiantes no corresponden a ellos, es decir hay nombres de estudiantes de 4to "a", que salen con otro curso como por ejemplo, 6to "b", de igual manera solo salen nombres de estudiantes; gracias por tu tiempo Dante Amor.

Acabo de verificar que el problema eran las columnas, es decir la ubicación, por alguna razón se cambiaron de lugar, ya lo corregí, ahora lo pruebo mejor.

De acuerdo.

Los datos en la hoja formulario, deben empezar en la celda A1.

[Si es lo que necesitas, no olvides valorar la respuesta.

Los resultados en la hoja1, estarán en la celda A2 en adelante.

Ahora ya funciona bien, a excepción de que no me sale el primer curso, es decir el "primero A", todo lo demás ya esta funcionando.

de pronto comenzó a salir ese error, no puedo entenderlo para tratar de solucionarlo.

Pon una imagen de la hoja formulario para ver cómo están tus datos y saber por qué es el error.

O comparte tu archivo en google drive. Cambia a "Cualquier persona que tenga el vínculo".

Copia el enlace y lo pegas aquí.

https://drive.google.com/file/d/17Q2ZEbd3ogKndEd-mGhgQNVN92fLW1Gm/view?usp=sharing

ese es el archivo, el error creo que estaba en las columnas que se modificaron, ahora lo que falta es que aparezca el 1ro "a".

Listo, hice los ajustes en la macro.

- Ya aparece el grupo "1ro A", es porque los alumnos están desde la columna "D" a la "R".

- Ya corregí el error de "No coinciden los tipos".

- La hoja se llama: "Respuestas de formulario 1"

Probé la macro en tu archivo y ya funciona.

Sub OrganizaDatos()
  Dim sh As Worksheet, sh1 As Worksheet
  Dim a As Variant, b As Variant
  Dim i As Long, j As Long, k As Long, lr As Long, m As Long, n As Long
  Dim addAlum As String
  Dim alumno As Variant
  '
  Set sh = Sheets("Respuestas de formulario 1")
  Set sh1 = Sheets("Hoja1")
  sh.Select
  '
  lr = sh.Range("A" & Rows.Count).End(3).Row
  a = sh.Range("A2:T" & lr).Value
  'Calcula el total de alumnos que están en las columnas D a R
  addAlum = sh.Range("D2:R" & lr).Address '(external:=True)
  n = Evaluate(Replace("=SUM(IF(@<>"""",LEN(@)-LEN(SUBSTITUTE(@,"","",""""))+1))", "@", addAlum))
  'Dimensiona la matriz de salida
  ReDim b(1 To n, 1 To 5)
  '
  For i = 1 To UBound(a, 1)
    For j = Columns("D").Column To Columns("R").Column   'columnas D to r
      If a(i, j) <> "" Then
        For Each alumno In Split(a(i, j), ",")
          m = m + 1
          b(m, 1) = a(i, 1)       'profesor
          b(m, 2) = a(i, 2)       'curso
          b(m, 3) = a(i, 20)      'asignatura
          b(m, 4) = a(i, 3)       'categoría
          b(m, 5) = Trim(alumno)  'alumno
        Next
      End If
    Next
  Next
  '
  sh1.Rows("2:" & Rows.Count).ClearContents
  sh1.Range("A2").Resize(UBound(b, 1), UBound(b, 2)).Value = b
End Sub

¡Gracias! Funciona perfecto, no había pensado que se podría hacer tal cosa, muy agradecido como siempre con usted; tengo otra inquietud, es para generar citaciones con el mismo reporte, es decir que tome el nombre del estudiante y las áreas en que fue reportado, lo traslade a un formato de citación, el mismo proceso para todos los estudiantes reportados; una vez mas muchas gracias Dante Amor. 

Con gusto te ayudo con todas tus peticiones. Valora esta respuesta.

Crea una nueva para cada requerimiento.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas