%3F.png)
Tengo muchos datos que se parecen a esto. Tiene dos columnas:
Nombre | Correo electrónico |
---|---|
Beto | [correo electrónico protegido] |
Beto | [correo electrónico protegido] |
Beto | [correo electrónico protegido] |
salida | [correo electrónico protegido] |
salida | [correo electrónico protegido] |
Pero necesito que se vea así. Un nombre por fila, con los correos electrónicos agregados como columnas adicionales según sea necesario. Hay una cantidad desconocida de correos electrónicos para cada nombre:
Nombre | Correo electrónico 1 | Correo electrónico 2 | Correo electrónico 3 |
---|---|---|---|
Beto | [correo electrónico protegido] | [correo electrónico protegido] | [correo electrónico protegido] |
salida | [correo electrónico protegido] | [correo electrónico protegido] |
Tengo que hacer esto para una hoja de cálculo enorme con miles de filas. Entonces no puedo convertir manualmente cada uno de ellos usando algo como transponer. Necesito una solución masiva/por lotes/automatizada.
Sé que VBA existe, pero no sé cómo codificarlo. Si esa es la solución, ¿podría darme alguna indicación de cómo debería verse el código?
Las soluciones que no sean VBA también son bienvenidas.
Respuesta1
UsandoMolineroy a partir de este CSV:
Name,Email
bob,[email protected]
bob,[email protected]
bob,[email protected]
sally,[email protected]
sally,[email protected]
Tu puedes correr:
mlr --csv nest --ivar ";" -f Email then nest --explode --values --across-fields -f Email then unsparsify input.csv >output.csv
para obtener:
Nombre | Correo electrónico_1 | Correo electrónico_2 | Correo electrónico_3 |
---|---|---|---|
Beto | [correo electrónico protegido] | [correo electrónico protegido] | [correo electrónico protegido] |
salida | [correo electrónico protegido] | [correo electrónico protegido] | - |
Respuesta2
Comenzando con su ejemplo Columna A: Nombre, Columna B: Correo electrónico
- Ingrese esta fórmula matricial:
=INDEX($A$2:$A$6, MATCH(0, COUNTIF($D$1:$D1, $A$2:$A$16), 0))
en una celda en blanco, D2, por ejemplo, y presione las teclas Shift + Ctrl + Enter juntas para obtener el resultado correcto, vea la captura de pantalla:
- Arrastre la celda hacia abajo para completar todos los valores en la columna D. El resultado será como en la captura de pantalla anterior.
- en la celdaE2donde quieres tu correo inserta esta formula
=IFERROR(INDEX($B$2:$B$16, MATCH(0,COUNTIF($D2:D2,$B$2:$B$16)+IF($A$2:$A$16<>$D2,1,0),0)),"")
- Arrastre la celda hacia la derecha de 5 a 10 celdas (o la cantidad que considere suficiente) para completar y luego arrastre la fila hacia abajo para completar los correos electrónicos de cada persona.
Respuesta3
Respuesta4
Si tiene una nueva versión de Excel, puede utilizar estas fórmulas.
Entonces puedes hacerlo de esta manera:
El azulla tabla se llama
Table1
.
Fórmulas utilizadas:
- E3:
=UNIQUE(Table1[Name])
- F2:N2:
="Mail"&COLUMN()-COLUMN($E$2)
- F3 (estirado hacia abajo):
=INDEX(Table1[Mail];FILTER(TRANSPOSE(SORT(UNIQUE((ROW(Table1[Name])-ROW(Table1[[#Headers];[Name]]))*($E3=Table1[Name]))));TRANSPOSE(SORT(UNIQUE((ROW(Table1[Name])-ROW(Table1[[#Headers];[Name]]))*($E3=Table1[Name]))))>0;""))
La tabla se llena con la función DERRAME de las nuevas versiones de Excel.
Archivo de ejemplo:https://1drv.ms/x/s!ArVkYVSHnABFiiqzBYLPmoubvdHY?e=p7wOeF
En caso de que esté utilizando una versión anterior de Excel, la mayor parte de la funcionalidad se puede emular mediante funciones de matriz. Pero todo se vuelve mucho más caótico...