Tamara VillalbaTamara Villalba hace 18 horas¿Cómo puedo fijar el inicio y fin de una función vlookup en excel?

Le escribo porque estoy un poco desesperada, necesito ayuda para saber cómo puedo fijar el inicio y fin de una formula de extraer los datos de una tabla a otra en un mismo archivo de excel. Le cuento un poco qué es lo que tengo y cómo había pensado hacerlo:

En el libro 1 tengo una sucesión de tablas que debo copiar en diferentes libros de una misma hoja de excel. Por suerte cada uno de los registros de estas tablas están en numerados 1.1, 1.2, 1.3... 2.1, 2.2, 2.3... 3.1, 3.2... En la primera columna de la tabla. Pero el inconveniente es que no siempre la tabla 2 empieza en la línea 20 porque depende del número de registros que tenga la tabla 1, y así sucesivamente.

Entonces mi pregunta es: ¿Es posible hacerlo con formulas? ¿Me tengo que programar una macro? Y en el último caso ¿cómo sería?

Yo ahora mismo he incluido a la izquierda de la tabla donde quiero copiar los datos los registros 1.1, 1.2, 1.3.... Para decirle que me busque el valor de esa columna (B20, B21, B22...) en la tabla original y que copie la columna que quiero [IFERROR(VLOOKUP($B20;'NO TOCAR_1'!$C$16:$K$6000;3;0);"") ], pero no siempre la tabla tiene 10 registros entonces para programarlo en la segunda tabla no sé como hacerlo...

Por favor, necesito su ayuda! Millones de gracias por su tiempo de verdad =)

1 respuesta

Respuesta
1

Podrías explicar con imágenes lo que tienes lo que esperas de resultado.

Importante! Debes poner una imagen de tus datos origen y en otra imagen el resultado que esperas. Procura que en las imágenes se muestren las filas y las columnas de excel.

Con la ayuda de las imágenes explica detalladamente tu ejemplo.


De esa forma podré revisar lo que necesitas y entonces saber si se puede con fórmulas o si te preparo una macro.

¡Muchas Gracias! 

Le resumo detenidamente mis datos de origen: en el primer libro de mi Excel tengo una sucesión de tablas que siguen el siguiente formato. Las dos primeras son de personas, y las sucesivas son de facturas, por lo que únicamente le he puesto dos ejemplos ya que el resto siguen la misma lógica... La idea es que tengo que copiar la información de estas tablas en los siguientes libros del Excel, pero la particularidad es que no siempre la tabla 1 tiene 7 individuos, hay ocasiones en las que son 20 o 100. Al principio había pensado en diseñar una formula de extraer o copiar a partir de que pusiera tabla 1 y hasta que encontrara "total tabla 1" pero no se hacerlo..., luego me di cuenta que a lo mejor era más fácil utilizando la numeración que viene en la columna C (1.1, 1.2, 1.3...), pero tampoco me funciona... He probado está formula: IF('NO TOCAR_1'!C6="1.";'NO TOCAR_1'!E6;0) pero no me da valor y sinceramente no sé porque... Aun así aunque me funcionará no sabría cómo proceder para la siguiente tabla porque no siempre el primer valor a copiar empieza en la fila 19 como en este ejemplo. 

Los datos de destino se deben copiar en una tabla resultante como esta:

Es decir, lo de la columna E del libro NO TOCAR_1 en la columna C del libro TABLA_1, lo de la columna H del libro NO TOCAR_1 en la columna D del libro TABLA_1. La columna E del libro TABLA_1 es otra formula que se obtiene del libro NO TOCAR_2 (si conseguimos esto primero le explico como he hecho está formula porque también necesito dejar fijado el valor sin tener que poner yo la posición en donde empiezan los datos, pero me preocupa menos). Y por último, el valor de las columnas F y G del libro TABLA_1 se tienen que copiar de las columnas I y J del libro NO TOCAR_1. El criterio es el siguiente, si hay valor en la columna A entonces tiene que copiarse en la columna A, y si por el contrario hay valor en la columna B pues en la B. Yo lo he dejado formulado así: IF('NO TOCAR_1'!$6<>0;'NO TOCAR_1'!$6;"") y IF('NO TOCAR_1'!$J6<>0;'NO TOCAR_1'!$J6;""); pero habría que decirle donde empezar... es decir, esta primera tabla siempre va a empezar en la fila 6 pero la segunda no siempre tendrá el valor fijo, de ahí mi problema. 

La tabla 3 tiene este formato:

Como ve la idea es la misma, hay que copiar los datos del proveedor, nº de factura, de la fecha, el concepto... de la tabla de origen situada en el libro NO TOCAR_1.

Espero haberme explicado bien, le agradezco de verdad su ayuda. Yo sé que con una macro se podría programar pero la verdad es que no controlo casi de visual basic... he trabajado con otros programas de programación como stata, spss o r pero más orientado al análisis multivariable de datos estadísticos.

Si necesita que le envíe más información, por favor hagámelo saber.

De nuevo, GRACIAS!!!! 

Perdona, pero hay algunas cosas que no entendí.

Me queda claro que los nombres y la titulación de la "Tabla1", de la hoja "NO TOCAR_1", los tengo que pasar a la hoja "TABLA 1"

Y luego los datos de proveedor, factura, fecha, concepto, A, B de la "Tabla3", de la hoja "NO TOCAR_1", los tengo que pasar a la "TABLA 3"


Te parece si hago esos 2 pasos y luego me explicas lo demás.


Ejecuta la siguiente macro

Sub Pasar_Datos()
'Por Dante Amor
    Set h1 = Sheets("NO TOCAR_1")
    Set h2 = Sheets("TABLA 1")
    Set h3 = Sheets("TABLA 3")
    '
    'Limpiar hojas
    h2.Range("C20:D" & Rows.Count).ClearContents
    h3.Range("C17:H" & Rows.Count).ClearContents
    '
    'Leer tabla1 de la hoja "no tocar_1"
    j = 20
    i = 6
    Do While h1.Cells(i, "E").Value <> ""
        h2.Cells(j, "C").Value = h1.Cells(i, "E").Value
        h2.Cells(j, "D").Value = h1.Cells(i, "H").Value
        j = j + 1
        i = i + 1
    Loop
    '
    'Leer tabla3 de la hoja "no tocar_1"
    j = 17
    Set b = h1.Columns("C:K").Find("Tabla 3", lookat:=xlWhole)
    If Not b Is Nothing Then
        i = b.Row + 1
        Do While h1.Cells(i, "E").Value <> ""
            h3.Range(h3.Cells(j, "C"), h3.Cells(j, "H")).Value = _
            h1.Range(h1.Cells(i, "E"), h1.Cells(i, "J")).Value
            j = j + 1
            i = i + 1
        Loop
    Else
        MsgBox "No se encuentra el texto 'Tabla 3' en la hoja 'No tocar_1'"
        Exit Sub
    End If
    MsgBox "Fin"
End Sub


Sigue las Instrucciones para un botón y ejecutar la macro

  1. Abre tu libro de Excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. En el menú elige Insertar / Módulo
  4. En el panel del lado derecho copia la macro
  5. Ahora para crear un botón, puedes hacer lo siguiente:
  6. Inserta una imagen en tu libro, elige del menú Insertar / Imagen / Autoformas
  7. Elige una imagen y con el Mouse, dentro de tu hoja, presiona click y arrastra el Mouse para hacer grande la imagen.
  8. Una vez que insertaste la imagen en tu hoja, dale click derecho dentro de la imagen y selecciona: Tamaño y Propiedades. En la ventana que se abre selecciona la pestaña: Propiedades. Desmarca la opción “Imprimir Objeto”. Presiona “Cerrar”
  9. Vuelve a presionar click derecho dentro de la imagen y ahora selecciona: Asignar macro. Selecciona: Pasar_Datos
  10. Aceptar.
  11. Para ejecutarla dale click a la imagen.

Muchísimas gracias Dante!!!!

La macro me funciona para la tabla 3 pero no para la tabla 1, no me copia ningún dato, ¿por qué?

Si no te importa voy a repasar los pasas de la macro para ir planteándote las dudas que me han surgido al verla, a ver si estoy en lo cierto y puedo diseñarla yo para el resto de tablas del documento...

1) Con la función "set" defines cada unas tablas con datos que vas a utilizar.

2) Con la instrucción "limpiar hojas" defines el rango de valores de cada una de las tablas de destino, en este caso has puesto solo de la C a la D porque tenemos pendiente que te explique como copiar la columna de "horas". Por otro lado, el nº que indicas en la primera letra corresponde a la fila en la que empieza la tabla.

3) Con la instrucción "leer tabla1 de la hoja "no tocar_1"" defines unos rangos con las letras "i" y "j", pero no entiendo qué significan y por qué indicas los números 20 y 6. Luego le dices que mientras que haya valores en la columna E te haga lo siguiente... El valor de la columna C en la tabla 1 es igual al valor de la columna E en la hoja no tocar_1; y luego que el valor de la columna D en la tabla 1 es igual al valor de la columna H en la hoja no tocar_1. Después le dices "j=j+1 e i=i+1" y eso tampoco sé lo que significa...

4) Con la instrucción "leer tabla 3 de la hoja "no tocar_1"" solo pones el valor de "j", y no se porqué... Introduces una función set donde defines el rango de valores donde tiene que buscar "tabla 3" y hacer lo siguiente que indicas: copiar valores de una columna a otra como el caso anterior y siguiendo las premisas que te pedí. Pero, ¿qué significa "i = b.Row + 1"? Y finalizas el bucle con la función else. 

Por tanto, tengo 3 dudas principales: a) ¿qué significan las letras "j" e "i", supongo que para definir rangos? ¿La instrucción "i = b.Row + 1" qué hace? y ¿por qué no me funciona la macro en el caso de la tabla 1?

Por otro lado, te explico lo de las columnas A y B, son dos tipos de registros y se supone que si son del tipo de A hay que copiar los datos en la columna A de cada una de las tablas sucesivas del excel y dejar la B en blanco; y lo mismo si es del tipo B copiar los valores y dejar la columna A en blanco. Si lo dejamos como está ahora el inconveniente que veo es que copie los valores "0" de toda la columna A cuando es de tipo B, y no le podemos decir que no copie los valores "0" porque puede ser que sea del tipo B pero tengo un "0" en alguna fila, aunque es bastante improbable... 

Por último, te explico el tema de las horas: hay otra tabla de origen de datos "NO TOCAR_2" donde aparecen las personas de la tabla 1 y una serie de datos suyos, divididos en algunos casos (la mayoría) por anualidades (ver foto). Yo he diseñado un vlookup que buscará el nombre de cada una de las personas y copiará el valor de la columna que yo quiero, pero no siempre está columna ocupa la posición 43 como en el siguiente ejemplo: IFERROR(VLOOKUP(C20;'NO TOCAR_2'!$C$16:$AS$6000;43;0);""). 

Lo bueno es que la anualidad de la que debemos copiar los datos la mayoría de las veces viene indicada en una celda (en este caso AO2 marcada en verde), por lo que lo ideal sería decirle que cogiera los datos de la columna A (o columna que ocupa el 3º lugar) de la anualidad que este indicada en AO2, ¿eso es posible? Así no tengo que cambiar para cada uno de los casos la plantilla definiendo la posición que ocupa la información que debo copiar.

De nuevo, millones de gracias!!!! :)

Vamos a terminar esta parte y luego en otra pregunta continuamos con los siguientes pasos.

Si tus datos están como en las imágenes que pusiste no debe haber problemas.

Te aclaro tus dudas:

    'Leer tabla1 de la hoja "no tocar_1"
    j = 20   'el número 20 es la fila inicial de la hoja destino
    i = 6    'el número 6 es la fila inicial de la hoja origen
    Do While h1.Cells(i, "E").Value <> ""
        h2.Cells(j, "C").Value = h1.Cells(i, "E").Value
        h2.Cells(j, "D").Value = h1.Cells(i, "H").Value
        j = j + 1
        i = i + 1
    Loop

    j = 17 'fila inicial hoja destino
    'busca el texto "Tabla 3" para identificar en la hoja origen
    'en cuál línea empiezan los datos de la tabla3
    'según tu imagen de ejemplo el texto está en la fila 18 y en la fila 19
    'empiezan tus datos.
    'en el objeto b tengo el resultado de la búsqueda, entonces en b.row
 'tengo la fila encontrada, en este ejemplo tengo 18
 'entonces a 18 le sumo 1, b.row + 1, para empezar en la fila 19
    Set b = h1.Columns("C:K").Find("Tabla 3", lookat:=xlWhole)
    If Not b Is Nothing Then
        i = b.Row + 1
        Do While h1.Cells(i, "E").Value <> ""
            h3.Range(h3.Cells(j, "C"), h3.Cells(j, "H")).Value = _
            h1.Range(h1.Cells(i, "E"), h1.Cells(i, "J")).Value
            j = j + 1
            i = i + 1
        Loop

Revisa que tus datos se encuentren exactamente cómo pusiste las imágenes de ejemplo y vuelve a probar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas