Excel 2016: llenar columna con lista basada en criterios coincidentes de otra hoja

1

Traté de expresar el título lo mejor que pude y haré todo lo posible para explicarlo. Tomaré cualquier sugerencia para cambiar el nombre del título, si es necesario.

Tengo dos hojas que estoy tratando de usar para rastrear rondas jugadas por jugadores en un deporte. Son esencialmente los mismos datos, simplemente presentados de manera diferente.

En una hoja, tengo 12 filas, cada fila representa un jugador, con el nombre del jugador en la Columna B. 

Para cada fila, hay 11 columnas, cada una representando cada ronda de un juego.

p.ej,

================================================
|  A  |    B    |    C    |   ...   |    M     |
================================================
| No. | Player  | Round 1 |   ...   | Round 11 |
------------------------------------------------
|  1  | Male 1  |    I    |         |    I     |
|  2  | Male 2  |    I    |         |    I     |
|  3  | Male 3  |    I    |    I    |          |
|  4  | Male 4  |    I    |    I    |          |
|  5  | Male 5  |    I    |    I    |    I     |
|  6  | Male 6  |         |    I    |    I     |
|  7  | Male 7  |         |    I    |    I     |
|  8  | Female1 |    I    |         |          |
|  9  | Female2 |    I    |    I    |          |
|  10 | Female3 |    I    |    I    |    I     | 
|  11 | Female4 |         |    I    |    I     |  
|  12 | Female5 |         |         |    I     |

Solo 5 jugadores masculinos pueden jugar en una ronda. Sólo 3 hembras jugadores pueden jugar en una ronda.

Entonces, si el jugador está adentro, ingreso una "I" en la columna de la ronda correspondiente, y se vacía si no está jugando esa ronda.

En la otra hoja, tengo filas que representan a los jugadores que están "IN" y los jugadores que están "OUT". Luego tengo columnas que representan la ronda del juego.

Sin embargo, en estas celdas actualmente estoy ingresando manualmente (copiar / pegar) los nombres de los jugadores que entran y / o salen para esa ronda.

================================================
|  A  |    B    |    C    |   ...   |    M     |
================================================
| No. | Status  | Round 1 | Round 2 | Round 3 |
|-----------------------------------------------
| 1   |   IN    | Male 1  | Male 3  | Male 1  |
| 2   |   IN    | Male 2  | Male 4  | Male 2  |
| 3   |   IN    | Male 3  | Male 5  | Male 6  |
| 4   |   IN    | Male 4  | Male 6  | Male 7  |
| 5   |   IN    | Male 5  | Male 7  | Male 7  |
| 6   |   IN    | Female1 | Female2 | Female3 |
| 7   |   IN    | Female2 | Female3 | Female4 |
| 8   |   IN    | Female3 | Female4 | Female5 |
| 9   |   OUT   | Male 6  | Male 1  | Male 3  |
| 10  |   OUT   | Male 7  | Male 2  | Male 4  |
| 11  |   OUT   | Female4 | Female1 | Female1 |
| 12  |   OUT   | Female5 | Female5 | Female2 |

¿Cómo puedo rellenar automáticamente los nombres de los jugadores para las columnas de la segunda hoja en función de la fila y el estado de la primera hoja?

EDITAR:

Actualicé mi pregunta para proporcionar detalles más precisos sobre los datos que estoy usando.

EDITAR:

Se agregaron nombres de columna a los ejemplos.

vmoralito
fuente
Esto requerirá una macro, pero no debería ser particularmente complicada. Sin embargo, no somos un gran servicio de escritura de guiones. ¿Has probado algo en particular todavía? Si es así, háganos saber qué ha intentado y veremos qué podemos hacer para ayudar a cerrar la brecha entre "intentar" y "tener éxito".
music2myear
1
Edité mi pregunta para proporcionar información más detallada sobre la configuración de mi (s) hoja (s) para que sus respuestas prometedoras puedan aplicarse mejor.
vmoralito

Respuestas:

0

Pude hacerlo con dos "matrices auxiliares". Una "celda auxiliar" es una celda que deriva / calcula algún valor intermedio de los datos de entrada. Este valor intermedio se usa luego en otra (s) celda (s) para producir el resultado deseado. Es común tener una "columna auxiliar" en una hoja de datos tabulares. Espero ver si alguien puede simplificar mi respuesta y hacerlo más elegante, pero esto es lo mejor que se me ocurrió en 59 minutos.

Es posible poner ayudantes en la misma hoja que los datos reales, en diferentes columnas o filas, generalmente ocultas. O puede ponerlos en hojas separadas. Como esta respuesta requiere dos de ellos, ilustraré ambas técnicas; A continuación, puede optar por utilizar una técnica de manera consistente.

Asumiré que sus datos de origen (presentados en su pregunta) están en Sheet1!A2:D8, con los encabezados en la Fila 1. Coloque

=IF(B2="", "blank", B2)

dentro de la celda  AB2, y arrastre / llene hacia abajo AB8y hacia la derecha a Columna  AD. Esto resulta en

   |    AA    |    AB    |    AC    |    AD    |
---+----------+----------+----------+----------+
 1 |          |          |          |          |
 2 |          |   I      |   blank  |   I      |
 3 |          |   I      |   blank  |   I      |
 4 |          |   I      |   I      |   blank  |
 5 |          |   I      |   I      |   blank  |
 6 |          |   I      |   I      |   I      |
 7 |          |   blank  |   I      |   I      |
 8 |          |   blank  |   I      |   I      |

Confío en que no es necesaria una explicación.

Ahora se vuelve más complicado. Cree Sheet3e ingrese las siguientes fórmulas:

  • B2=MATCH("I", Sheet1!AB$2:AB$8, 0)
  • B3=MATCH("I", OFFSET(Sheet1!AB$2,B2,0):Sheet1!AB$8, 0) + B2
  • B7=MATCH("blank", Sheet1!AB$2:AB$8, 0)
  • B8=MATCH("blank", OFFSET(Sheet1!AB$2,B7,0):Sheet1!AB$8, 0) + B7

Arrastre / llene la celda  B3hacia abajo B6. Si alguna vez cambia su esquema para tener más de dos jugadores "a la vez" a la vez, deberá arrastrar / llenar la celda  B8hacia abajo adecuadamente. Y, como antes, arrastre / llene la columna  Ba la derecha de la columna  D. Deberías obtener:

   |    A    |    B    |    C    |    D    |
---+---------+---------+---------+---------+
 1 |         |         |         |         |
 2 |         |      1  |      3  |      1  |
 3 |         |      2  |      4  |      2  |
 4 |         |      3  |      5  |      5  |
 5 |         |      4  |      6  |      6  |
 6 |         |      5  |      7  |      7  |
 7 |         |      6  |      1  |      3  |
 8 |         |      7  |      2  |      4  |

Explicación:

  • B2contiene la ubicación (relativa) del primero I en el rango Sheet1!AB$2:AB$8. Esto es  1, porque Sheet1!AB2contiene I, y es la primera celda en ese rango. Del mismo modo, C2y D2contienen 3y 1, respectivamente, porque Sheet1!AC4y Sheet1!AD2(la tercera y primera celda, correspondientes a Player3 y Player1, respectivamente), son las ubicaciones de la primera Ien esas columnas.
  • Mirando B3- OFFSET(Sheet1!AB$2,B2,0)es OFFSET(Sheet1!AB$2,1,0), que es equivalente a Sheet1!AB3. Entonces esto MATCHestá mirando el rango Sheet1!AB3:AB8. Esto MATCHtambién regresará 1, porque Sheet1!AB3contiene I, y es la primera celda en ese rango. Luego agregamos B2( 1) a eso, obteniendo 2, que es la ubicación del segundo I en Sheet1!AB2:AB8.
  • Del mismo modo, la MATCHcelda in  D4 está mirando el rango Sheet1!AD4:AB8. Esto MATCHvolverá 3, porque Sheet1!AD6es la primera celda en ese rango que contiene I. Agregar D3( 2) nos da 5, porque esa fila corresponde a Player5.
  • Luego hacemos lo mismo en las filas 7 y 8, solo buscando blank.

    No habría necesitado la Sheet1!AA:ADmatriz auxiliar, excepto, aparentemente, que no puedes usar MATCH("", …)para encontrar una celda en blanco.

Ahora podemos simplemente costa cuesta abajo y poner =INDEX(Sheet1!$A$2:$A$8, Sheet3!B2)en Sheet2!B2.

+--------+---------+---------+---------+
| Status | Round 1 | Round 2 | Round 3 |
+--------+---------+---------+---------+
| IN     | Player1 | Player3 | Player1 |
| IN     | Player2 | Player4 | Player2 |
| IN     | Player3 | Player5 | Player5 |
| IN     | Player4 | Player6 | Player6 |
| IN     | Player5 | Player7 | Player7 |
| OUT    | Player6 | Player1 | Player3 |
| OUT    | Player7 | Player2 | Player4 |

captura de pantalla correspondiente a lo anterior

Scott
fuente
Lo intentaré y te lo haré saber. ¡¡Gracias!!
vmoralito
Hola @Scott, lo intenté, pero como con la otra respuesta, no pude hacer que funcionara como esperaba, pero cerca. En lugar de los nombres de los jugadores, obtengo el mismo estado "I" u "O". Intenté ajustar las columnas necesarias, etc., pero nuevamente, probablemente esté relacionado con el hecho de que hay más en mi hoja que el ejemplo diluido proporcionado.
vmoralito
0

Este código VBA hará el truco

Public Sub players_rounds()
    first_sheet = "Sheet1"
    second_sheet = "Sheet2"
    Dim wkb As Workbook
    Dim wk1 As Worksheet
    Dim wk2 As Worksheet
    Set wkb = ThisWorkbook
    Set wk1 = wkb.Worksheets(first_sheet)
    Set wk2 = wkb.Worksheets(second_sheet)
    wk1_lastColumn = wk1.Cells(1, Columns.Count).End(xlToLeft).Column
    wk1_lastRow = wk1.Cells(Rows.Count, 1).End(xlUp).Row
    count_in = 0
    For i = 2 To wk1_lastRow
        If wk1.Cells(i, 2) = "I" Then count_in = count_in + 1
    Next i
    wk2.Cells.Clear
    wk2.Rows(1).value = wk1.Rows(1).value
    wk2.Cells(1, 1).value = "Status"
    count_out = wk1_lastRow - count_in - 1

    For i = 2 To count_in + count_out + 1
        If i <= count_in + 1 Then
            wk2.Cells(i, 1).value = "IN"
        Else
            wk2.Cells(i, 1).value = "OUT"
        End If
    Next i

    For i = 2 To wk1_lastRow
        thisplayer = wk1.Cells(i, 1)
        For j = 2 To wk1_lastColumn
            playervalue = wk1.Cells(i, j)
            playerround = wk1.Cells(1, j)
            If playervalue = "I" Then
                firstrow = 2
                lastrow = count_in + 1
            Else
                firstrow = count_in + 2
                lastrow = count_in + count_out + 1
            End If
            For k = 2 To wk1_lastColumn
                If wk2.Cells(1, k) = playerround Then
                    For m = firstrow To lastrow
                        If wk2.Cells(m, k) = "" Then
                            wk2.Cells(m, k) = thisplayer
                            m = lastrow
                            k = wk1_lastColumn
                        End If
                    Next m
                End If
            Next k
        Next j
    Next i
End Sub

Abra VBA / Macros con Alt+ F11, haga clic con el botón ThisWorkbookderecho e inserte un módulo debajo de él. Pegue el código en el lado derecho.

Compruebe que los valores de las variables first_sheety second_sheetcoincidir con los nombres de las hojas de cálculo.

Cada vez que ejecute esta macro, actualizará la segunda hoja de acuerdo con los valores de la primera hoja.

Para hacerlo aún más automático en Macros, haga doble clic en la primera hoja, en el lado derecho, seleccione Hoja de trabajo y Cambiar .

Haz que se vea así:

Private Sub Worksheet_Change(ByVal Target As Range)
    Call players_rounds
End Sub

Ahora, cada vez que cambia algo en la primera hoja, la segunda se actualiza.

jcbermu
fuente
Hola @jcbermu, así que lo probé pero no funciona como se esperaba. Estoy seguro de esto probablemente porque hay mucho más en mi hoja que el ejemplo diluido que proporcioné. No he podido averiguar las variables para actualizar para probar correctamente, dada mi falta de conocimiento de VBA.
vmoralito