Una de las cosas más frustrantes en Excel es buscar dentro de una "tabla" de catálogos en Excel una llave y regresar el valor de la misma. Tradicionalmente es para lo que se usan las terribles funciones =lookup() y =vlookup() que por amor a la humanidad Microsoft debería sacar de Excel, porque están incompletas, tienen muchas limitantes, son difíciles de usar, etc.

Detallemos mi problema. En la hoja de Excel donde estoy convirtiendo unos datos que tienen que ver con la NFL y la temporada 2019, tengo los nombres de los equipos "Vikings", "Steelers", "Cowboys", etc., requiero convertirlos en claves que utilizo en otra base de datos, en este caso a "MIN", "PIT" y "DAL" respectivamente, para lo cual tengo una tabla con los nombres y sus códigos:

Un extracto de la tabla de nombres y códigos, la tabla empieza en el renglón 1

Por el otro lado, tengo una tabla más grande donde está el calendario de la liga y contiene los nombres de los equipos:

Un extracto de la tabla de calendarios. Tiene 256 renglones, y evidentemente el nombre de un equipo se repite en mútiples ocasiones, tanto en la columna de visitante (E) como en la de Local (F)

En las columnas G y H quiero poner los códigos de los equipos, por ejemplo en G1:H1 debería quedar "GB" y "CHI", en G2:H2 debería quedar "LAR" y "CAR" que son los códigos para los equipos. La solución es obtener los códigos desde la primera tabla.

Ya dije cuanto odio a las funciones lookup, y que deberían desaparecer. Bueno, pues existe una forma correcta de hacer esta búsqueda, a través de las funciones =index() y =match()

La funcion =index()

La función =index() hace lo que sea, menos traer un índice. Lo que trae es un valor, de acuerdo a tres parámetros de búsqueda.

  • El primer parámetro es el rango donde se va a buscar la información, en mi caso, es la primera tabla, que está en U2:V33, sin el encabezado, o también es posible usar el nombre del rango, en mi caso es Table3 porque no renombré la tabla y es el número consecutivo que le correspondió cuando hice la hoja de cálculo.
  • El segundo parámetro indica cuál es el renglón relativo (empieza en 1) a buscar dentro de la tabla, por ejemplo, el quinto renglón corresponde a ["Broncos", "DEN"].
  • El tercer parámetro es la columna relativa (empezando en 1) que contiene el valor que estamos buscando. En mi tabla, la columna 1 tiene el nombre de equipo y la columna 2 tiene el código, que es lo que me interesa.

Armando la función, queda de la siguiente manera:

=index(Table3, 5, 2)

y regresa el valor "DEN" que es lo que nos interesa. Si cmbiamos el segundo parámetro a 1 obtendremos "49ers", y así sucesivamente.

Entonces, para lo que quiero hacer, el segundo parámetro es el más importante, ¿cómo le indico entonces el renglón correcto que debe tomar? Para eso sirve la función =match()

La función =match()

La función =match() busca un valor dentro de un arreglo (o un vector), es decir, un grupo de renglones continuos que miden una columna de ancho, y regresa como valor el renglón donde se encontró lo que se busca. Utiliza tres parámetros, aunque el tercero es opcional y la verdad, nunca lo he usado.

  • El primer parámetro es el valor que se está buscando, para ser consistentes con el ejemplo anterior, supongamos que estamos buscando "Broncos"
  • El segundo parámetro es el vector donde se va a buscar el valor, se puede utilizar un rango, en mi caso U2:U33 (sin el encabezado), o bien usar los nombres de rango, en mi caso Table3['Name']

Por lo tanto, la función queda de la siguiente manera:

=match('Broncos', Table3['Name'])

Y como se espera, regresa el valor 5, es decir, es el renglón relativo donde se encuentra el primer registro que coincide con "Broncos"

Poniendo las funciones juntas

Ahora, poniendo las dos funciones juntas, para obtener el código que corresponde a "Broncos", se utilizaría la siguiente combinación:

=index(Table3, match('Broncos', Table3['Name']), 2)

Y la funcion regresa, como se espera, el valor "DEN"

Lo siguiente es muy sencillo, añadimos una columna a la segunda tabla, y utilizamos la siguiente función para los visitantes

=index(Table3, match([@V], Table3['Name']), 2)

y

=index(Table3, match[@L], Table3['Name']), 2)

para los locales, el resultado final se muestra a continuación:

Resultado final de buscar los nombres de los equipos y poner sus códigos en las columnas subsecuentes