Esta vez te pregunto sobre la función BUSCARV

... O ActiveCell.FormulaR1C1 = _
"=VLOOKUP(RC[-7],(nombre)Hoja1!R3C1:R4154C2,2,FALSE)".
Mi problema es que tengo desarrollada una rutina de Visual, para limpiar y preparar unos listados y ahora la quiero mejorar, insertando en una columna datos de otra hoja (2) de cálculo. Lo más sencillo es tratar de poner la fórmula BUSCARV correspondiente, pero el tema es que la hoja (2) no es siempre la misma y entonces estoy tratando de que el rango del BUSCARV, sea variable (normalmente el nombre de la hoja (2) a vincular es una cadena que se obtiene de varias preguntas "inputbox" al usuario). Trato de meter variable (nombre, en el ejemplo) entre corchetes, paréntesis, etc ... Y no consigo que funcione.
¿Me puedes (volver) a ayudar?
Saludos y gracias anticipadas.
Jorge
1

1 respuesta

Respuesta
1
El secreto esta en construir el argumento de forma correcta, este segundo argumento "debe" ser un RANGO, usando la propiedad FormulaR1C1 es algo complicado cuando se le solicita un dato al usuario, esto es por que tal vez se le solicita un rango y hay que transformarlo a RC, pero con la propiedad FormulaLocal puedes introducirla como lo haces normalmente en excel, ejemplo...
ActiveCell.FormulaLocal = "=BUSCARV(A5,A1:F6,4)"
En donde de todos modos tienes que construir la cadena, pero es más fácil por que las referencias son de la forma usual Columna, Fila
De todos modos te anexo un apunto que prepare, cualquier duda vuelve a preguntar...
'Pequeña clase de funciones:
'Una función nos devuelve un valor
'Puede tener o no argumentos
'Un argumento es un dato que se le da a la función para que haga bien su trabajo
'Tanto los argumentos como el valor que devulven tienen un TIPO de dato
'Hay que PASAR el TIPO DE DATO correcto para que funcione
'Veamos un ejemplo
Public Function Area_Cuadro(ByVal Lado As Single) As Double
Dim Area As Double
Area = Lado * Lado
Area_Cuadro = Area
End Function
'Proposito de la función = Obtiene el área de un cuadrado
'Nombre de la función = Area_Cuadro
'Argumentos = Lado
'Tipo del argumento = Simple (Single)
'Tipo de valor devuelto = Doble (Double)
'Las funciones de Excel trabajan exactamente igual, claro hay muchas variantes
'sobre todo en los argumentos, pero el principio es el mismo
'Ahora, la funcion BuscarV sería así:
'ESTO VIENE EN LA AYUDA
'Proposito de la función = Busca un valor específico en la
'columna más a la izquierda de una matriz y devuelve el valor
'en la misma fila de una columna especificada en la tabla.
'Nombre de la función = BuscarV (VLookup)
'Argumento = valor_buscado Tipo = Variante(Variant)
'Argumento = matriz_de_comparación Tipo = Rango (Range)
'Argumentos = indicador_columnas Tipo = Entero (Integer)
'Argumentos = ordenado Tipo = Booleano (Boolean) (Opcional)
'Tipo de valor devuelto = Variante(Variant)
'Como dijimo, solo resta PASAR EL TIPO DE DATO CORRECTO
Public Sub Utilizando_BuscarV()
'Fijate como declaramos estas variables, del mismo tipo de datos
'que necesita la función
Dim varDato As Variant
Dim varBuscado As Variant
Dim rMatriz As Range
Dim intColumna As Integer
Dim bolOrden As Boolean
'Solicitamos un dato
varDato = InputBox("Introduce el dato a buscar", "Usando BuscarV", "Uno")
'Le quitamos los espacios al principio y al final, por si tiene
varDato = Trim(varDato)
'Validamos que se haya proporcionado un dato
If varDato = "" Then
MsgBox "Error en el primer argumento" & vbCrLf & vbCrLf & _
"El valor buscado no puede estar vacio", vbCritical, "Error"
Else
'Usamos la región actual como segundo argumento
Set rMatriz = ActiveCell.CurrentRegion
'Solicitamos el número de columna a devolver, hay que validar que no sea
'mayor al número de columnas en nuestra matriz de datos
intColumna = Val(InputBox("Introduce el número de columna", "Usando BuscarV", "3"))
If intColumna > rMatriz.Columns.Count Then
MsgBox "Error en el tercer argumento" & vbCrLf & vbCrLf & _
"Número de columna incorrecto", vbCritical, "Error"
Else
'Si todo esta correcto llamamos a la función, le pasamos los
'argumentos y mostramos el valor devuelto (si lo encontró)
bolOrden = True
varBuscado = Application.WorksheetFunction.VLookup(varDato, rMatriz, intColumna, bolOrden)
MsgBox "El valor buscado es:" & vbCrLf & vbCrLf & _
varBuscado, vbInformation, "Uso de BuscarV"
End If
End If
Set rMatriz = Nothing
End Sub
'Esto tiene muchas, muchas variantes, pero en resumen el secreto
'esta en PASARLE a la función sus ARGUMENTOS correctos y en el orden
'correcto
... y he preparado algo así, pero no me funciona:
Sub Macro4()
'
' Macro4 Macro
' Macro grabada el 16/10/2001 por BSHE-E
'
'
Windows("zmreiw6x16oct2001.xls").Activate
Dim loquebusco As Range
Dim dondelobusco As Range
Dim desplazamiento As Variant
Dim boleano As Variant
loquebusco = "B2"
dondelobusco = "F:\d_fag_comun\Almacenes\LISTADOS EXISTENCIAS\OCTUBRE 2001\existencias161001.xls"
desplazamiento = "2"
boleano = False
Range("I2").Select
ActiveCell.FormulaLocal = _
"=VLOOKUP(loquebusco,dondelobusco,desplazamiento,boleano)"
Range("I2").Select
Selection.Copy
Range("I3:I2459").Select
ActiveSheet. Paste
Range("A1").Select
ActiveWorkbook. Sabe
End Sub
Tengo dos dudas fundamentales, quiero atacar el valor buscado por Rango y no tengo claro como y cuando lo hago como variante para chequear el resto del programa el
ActiveCell.FormulaLocal = _
"=VLOOKUP(loquebusco,dondelobusco,desplazamiento,boleano)"
También me da error y depurando es como si VLOOKUP no tuviera nada.
Gracias anticipadas,
Jorge
Creo que no me explique bien...
Sub Macro4()
''Comparando
''Esto es tuyo
'Dim loquebusco As Range
'Dim dondelobusco As Range
'Dim desplazamiento As Variant
'Dim boleano As Variant
'
''Esto es mio
'Dim varBuscado As Variant
'Dim varDato As Variant
'Dim rMatriz As Range
'Dim intColumna As Integer
'Dim bolOrden As Boolean
'
''Los errores
'Dim loquebusco As Range 'Esta debe ser Variant
'Dim dondelobusco As Range
'Dim desplazamiento As Variant 'Esta debe ser Integer
'Dim boleano As Variant 'Esta debe ser Boolean
'
''Esto es tuyo
'loquebusco = "B2"
'dondelobusco = "F:\d_fag_comun\Almacenes\LISTADOS EXISTENCIAS\OCTUBRE 2001\existencias161001.xls"
'desplazamiento = "2"
'boleano = False
'
''Las tres primeras variables las llenas con datos tipo String (Cadena), esto es incorrecto
''Aqui NO estas construyendo la cadena, simplemente le pasa la cadena
''ademas, como dije, si usas FormulaLoca tienes que usar BUSCARV no VLOOKUP
'ActiveCell.FormulaLocal = _
'"=VLOOKUP(loquebusco,dondelobusco,desplazamiento,boleano)"
'Relee lo que te escribi acerca de funciones y el paso de argumentos
'El ejemplo con tus datos seria, estoy suponiendo que los datos los solicitas al
'usuario y que este te pasa la celda y el archivo donde estan los datos y que el valor
'NO quieres devolverlo, sino tan solo CONSTRUIR la candena
Dim loquebusco As String
Dim dondelobusco As String
Dim desplazamiento As String
Dim boleano As String
Dim strFormula As String
'OJO como lo que buscamos es construir la candena que servira como FUNCION dentro
'de la hoja de Excel, entonces todas las variables son String, pero si usamos
'la funcion VLOOKUP como CODIGO, entonces si hay que declarar cada varible del
'tipo correcto
loquebusco = "B5"
'Esto esta mal, tienes que pasarle un RANGO DE CELDAS no un nombre de archivo
'de este modo la formula no sabe donde BUSCAR los datos
dondelobusco = "F:\d_fag_comun\Almacenes\LISTADOS EXISTENCIAS\OCTUBRE 2001\existencias161001.xls"
'Aqui le indico el libro, la hoja y el rango de datos
dondelobusco = "'D:\Pruebas\[Pruebas.xls]Datos'!$A$2:$C$10"
'la columa que quiero devolver, si aqui pongo un 4 me da error ¿porque??
desplazamiento = "2"
boleano = "FALSO"
'Esto se puede hacer en una linea, lo desgloso para que veas como se va
'construyendo la formula
strFormula = "=BUSCARV(" & loquebusco & ","
strFormula = strFormula & dondelobusco & ","
strFormula = strFormula & desplazamiento & ","
strFormula = strFormula & boleano & ")"
ActiveCell.FormulaLocal = strFormula
'Para usarlo con FormulaR1C1 es algo muy, muy similar te lo dejo de tarea
ActiveCell.FormulaR1C1 = _
"=VLOOKUP(R[-5]C[-2],'D:\Pruebas\[Pruebas.xls]Hoja1'!R2C1:R10C3,2,FALSE)"
End Sub
Perfecto (una vez más). He perdido algo de tiempo por el tema de los "apóstrofes" en la fórmula, pero al final, perfecto. MUCHÍSIMAS gracias y seguiré haciendo preguntas

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas