... 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
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