Construir una matriz de 2 columnas, a partir un número mayor de columnas (para graficar las relaciones)

Para Dante Amor

En este caso es un poco más complejo que la anterior porque la idea es poder construir un gráfico de redes a partir de las relaciones entre dos columnas. Los datos están en múltiples columnas y algunas filas tienen más columnas rellenas que otras. Incluso en algún caso vienen huecos. Debo convertir esos datos en un par de relaciones donde todas las relaciones que se producen en una fila (o sea, toda la combinatoria posible asociada a la fila) ha de llevarse a dos columnas, para poder luego exportar esos datos para graficar.

Los datos vienen en columnas de esta manera:

Rojo verde azul amarillo

Naranja lila negro

Los necesito así (todas las relaciones que aparecen en cada fila distribuidas en columnas, sabiendo que en cada fila puede haber un número diferente de columnas rellenas con datos):

Rojo verde

Rojo azul

Rojo amarillo

Verde azul

Verde amarillo

Azul amarillo

Naranja lila

Naranja negro

Lila negro

Puede haber filas en las que solo haya datos de texto en la primera columna, con lo que en este caso no habría relación, de ahí no se incorporaría entre las que van a las dos columnas.

Siempre se trata de datos de texto, no numéricos.

Es como "trasponer" en el sentido de cambiar la distribución de los datos, pero más complejo porque lo que me interesa es poner en dos columnas la relación de todos los que comparten la misma fila.

Cualquier ayuda se agradece. Son miles de datos y para hacer a mano me puedo volver loca aparte de multiplicar las fuentes de error.

Respuesta
1

H o l a:

Te anexo la macro, sigue los mismos pasos para poner la macro en un botón y ejecutarla.

Sub ContruirMatriz()
'Por.Dante Amor
    Set h1 = Sheets("Hoja1")
    Set h2 = Sheets("Hoja2")
    h2.Cells.Clear
    '
    k = 1
    For i = 1 To h1.Range("B" & Rows.Count).End(xlUp).Row
        If h1.Cells(i, "B") <> "" Then
            For m = 1 To h1.Cells(i, Columns.Count).End(xlToLeft).Column
                For j = m + 1 To h1.Cells(i, Columns.Count).End(xlToLeft).Column
                    h2.Cells(k, "A") = h1.Cells(i, m)
                    h2.Cells(k, "B") = h1.Cells(i, j)
                    k = k + 1
                Next
            Next
        End If
    Next
    MsgBox "fin"
End Sub

':)
':)

¡Muchas gracias! Ha sido de gran ayuda y me ha empezado a picar esto de las macros. Estaba haciendo una que ya daba resultados, pero la tuya es más sencilla.

1 respuesta más de otro experto

Respuesta
1

·

·

¡Hola Pepi!

Dices que puede haber filas donde solo haya datos en la primera columna. Entonces el contador de filas habrá que ponerla en la columna A, no en la B que podría estar vacía.

Además, por si hubiera huecos en la fila, haremos unas comprobaciones para que no escriba un color y otro en blanco o dos en blanco. De esa forma estén como estén distribidos lo hará bien, fíjate como hasta esta la hará bien.

·

Y aparte de esas modificaciones lo demás es igual que la macro de Dante.

Sub ConstruirMatriz2()
    Dim i, j, k As Integer
    Set h1 = Sheets("Hoja1")
    Set h2 = Sheets("Hoja2")
    h2.Cells.Clear
    k = 1
    For i = 1 To h1.Range("A" & Rows.Count).End(xlUp).Row
        For m = 1 To h1.Cells(i, Columns.Count).End(xlToLeft).Column
            If Cells(i, m) <> "" Then
                For j = m + 1 To h1.Cells(i, Columns.Count).End(xlToLeft).Column
                    If Cells(i, j) <> "" Then
                        h2.Cells(k, "A") = h1.Cells(i, m)
                        h2.Cells(k, "B") = h1.Cells(i, j)
                        k = k + 1
                    End If
                Next
            End If
        Next
    Next
    MsgBox "fin"
End Sub

Saludos.

:

:

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas