Error en macro de búsqueda (VLookUp)

Sub CriteriaLookUp()Application.ScreenUpdating = FalseApplication.DisplayAlerts = False    'Definimos las hojas que utilizaremos    Set h1 = Workbooks("Priority List.xlsm").Worksheets("FUBT")    Set h2 = Workbooks("Priority List.xlsm").Worksheets("IMS-PA")    'Definimos las cabeceras        h1.[D1] = "Criterion"        h1.[E1] = "Criterion Ref"    'Definimos variable hasta la última fila    For i = 2 To h1.Range("C" & Rows.Count).End(xlUp).Row    'Intento asignar a cada celda de la columna D y E de h1 los valores correspondientes a las columnas B y C de h2    'Pero sin éxito        h1.Cells(i, "D") = Application.WorksheetsFunction.VLookup(h1.Range(i, "C"), h2.Range("A:B"), 2, False)        h1.Cells(i, "E") = Application.WorksheetsFunction.VLookup(h1.Range(i, "C"), h2.Range("A:C"), 3, False)    NextApplication.ScreenUpdating = TrueEnd Sub

El caso es que algo estoy haciendo mal porque se detiene justo en el VLookUp.

Si pudieran revisarlo para decirme en qué me he equivocado o sugerirme otro método para llegar al mismo resultado les estaría muy agradecido.

2 Respuestas

Respuesta
1

Roberto.
En la medida de lo posible (y éste sería el caso): ¡Huye de los procesos iterativos "como de la peste"!...
Reemplaza, entonces, el final de tu código por lo siguiente:

'Definimos las cabeceras
h1.[D1] = "Criterion"
h1.[E1] = "Criterion Ref"
'Lo nuevo es:
With h1.Range(h1.[c2], h1.[c1].End(xlDown)).Offset(, 1).Resize(, 2)
  .Formula = Array( _
    "=VLookup(c2, " & h2.[a:c].Address(external:=True) & ", 2)", _
    "=VLookup(c2, " & h2.[a:c].Address(external:=True) & ", 3)")
  .Value = .Value
End With
Application.ScreenUpdating = True

Lo recordaré, Mario. Gracias por el consejo.

Probaré tu propuesta ahora mismo.

Me harías el favor de comentarla brevemente; entiendo más o menos todo pero nunca he usado la función Array.

Por lo que veo, parece que estamos introduciendo la fórmula en cada celda pero me pierdo un poco.

Muchas gracias de nuevo!!

Saludos,

Roberto

Hola de nuevo, Mario.

Va muy rápido pero me da todo N/A, tiene que ver con el formato pues al convertir a formato texto y refrescar cada celda, sí me funciona correctamente.

¿Es esto normal? ¿Debería incluir en la macro el cambio de formato antes de operar?

Gracias por la ayuda!

Saludos

En un libro nuevo y en blanco introduce lo siguiente:

Range("a1") = "Uno"
Range("b1") = "Dos"

Su equivalente utilizando Array sería:

Range("a1:b1") = Array("Uno", "Dos")

En este ejemplo estoy introduciendo textos fijos pero en la macro estoy introduciendo sendas fórmulas. Por ejemplo:

Range("a1:b1") = Array("=1+today()", "=2+today()")

O sea: el día de hoy más 1 y el día de hoy más 2.
La macro que te mostré, entonces, crea TODOS los BUSCARV (en las dos columnas) con una sola instrucción.
Demás está decir que la instrucción que sigue es la que pasa esas fórmulas a valores.
¡Me olvidaba!... ¡Claro que tienes que cambiar previamente el formato de esas celdas! Por ejemplo, antes de
.Formula = Array( _
deberías incorporar:

  .NumberFormat = "General"
  .Formula = Array( _

¿Se entendió?...

Hola Mario,

Gracias por la aclaración. Pero lo de ".NumberFormat = "General"" le da formato general a las columnas D y E de h1 (verdad?) y el problema es que no me hace correctamente el VLookUp a no ser que le de formato texto a la columna C (de donde toma los valores a buscar en h2).

¿Podrías echarle un vistazo, por favor?

Gracias!!

Hola,

Provisionalmente lo he solucionado ejecutando antes el siguiente código:

Sub FormatoTexto() Set h1 = Workbooks("Priority List.xlsm").Worksheets("FUBT") For Each Cell In Range("C2:C" & Range("C" & Rows.Count).End(xlUp).Row) Cell.NumberFormat = "@" Cell.Value = Cell.Formula Next Cell End Sub 


Aunque he utilizado iteraciones de esas de las que hay que huir como de la peste ;)

Si conoces otro método... soy todo oídos.

Gracias por todo,

Roberto

¿Sabes, Roberto?...
Apostaría a favor de que estamos perdiendo el tiempo por un tema muy -pero muy- menor...
¿Por qué no subes tu archivo a MediaFire, HotFile, 4Shared, SkyDrive o cualquier otrovde esos servicios, para darle una mirada y encontrar la razón (poco razonable hasta ahora) por la que tienes ese problema?...
Con un par de líneas de datos será más que suficiente.

Respuesta
1

Te anexo la corrección

Sub CriteriaLookUp()
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    'Definimos las hojas que utilizaremos
    Set h1 = Workbooks("Priority List.xlsm").Worksheets("FUBT")
    Set h2 = Workbooks("Priority List.xlsm").Worksheets("IMS-PA")
    'Definimos las cabeceras
    h1.[D1] = "Criterion"
    h1.[E1] = "Criterion Ref"
    'Definimos variable hasta la última fila
    For i = 2 To h1.Range("C" & Rows.Count).End(xlUp).Row
        'Intento asignar a cada celda de la columna D y E de h1 los valores correspondientes a las columnas B y C de h2 'Pero sin éxito
 h1.Cells(i, "D") = Application. VLookup(h1.Cells(i, "C"), h2.Range("A:B"), 2, False)
        h1.Cells(i, "E") = Application.VLookup(h1.Cells(i, "C"), h2.Range("A:C"), 3, False)
    Next
    Application.ScreenUpdating = True
End Sub

Tenías esto:

H1.Range(i, "C")

Y lo cambié por esto:

H1.Cells(i, "C")

Saludos. Dante Amor

¡Fantástico! Dante, como es habitual.

Errores de novato ;)

Muchas gracias.

Saludos,

Roberto

Hola Dante,

El código me da un error en la línea de VLookUp (error438). Dice que el objeto no soporta la función.

¿Alguna sugerencia?

Gracias de antemano

A mí me funciona bien, no creo que sea error de la versión de excel, ¿de cualquier forma dime qué versión de excel tienes?

Revisa que esté bien escrita la macro.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas