Excel: Macros

Hola, estoy haciendo una macro con datos importados de la web. Quería saber como hacer para de todos los datos que me importa (porque me importa por grupos no individualmente), quedarme solo con los que me interesan y los otros que se borren. Gracias

1 Respuesta

Respuesta
1
Con al exposición que haces de la cuestión es difícil saber cual es el problema que tienes y por tanto si te puedo ayudar o no. En principio que importes datos de web u otro sitio no es relevante, sino como lo haces (por ejemplo ¿copias y pegas o están en un fichero?). Si estás realmente utilizando la función importar, ésta en una de las pestañas del proceso te pide indiques como están separados los campos. Pueder ser por tabuladores, comas, espacios u otro carácter. Ahí debes indicárselo y en función de ello cambia el resultado de la importación.
Si la pista anterior no te sirve, deberás ser más explícito en tu pregunta indicando qué y como haces las cosas y el resultado qué te da y el que esperabas. Con un ejemplo sencillo se puede mostrar.
PUES.
Perdón por ser poco explicito, voy a poner un ejemplo así se entiende más.
Lo que yo hago es:
1ero Empiezo a grabar la Macro
2do Datos-> Obtener datos externos->Desde Web (http://finance.yahoo.com/q?s=ab&ql=1)
3ero Importo los siguientes datos:
A B
1Last Trade:16.80
2Trade Time:11:36AM
3EDTChange: 0.13 (0.77%)
4Prev Close:16.93
5Open:16.75
6Bid:16.78 x 300
7Ask:16.84 x 4001y
8Target Est:16.56
4to Detengo la Macro
Ahora va la pregunta: El dato que yo quiero es el "B1". ¿Cómo hago para que en vez que me importe todos los datos solo me aparezca la celda "B1" y el resto las borre? 2do, ¿Si quiero que ese dato me aparezca en la celda "C4" como hago? Gracias.
Perdón, soy nuevo en este foro, ¿te puedo mandar archivos de excel con la planilla?
Creo que ya entiendo lo que haces y lo que quieres. En la macro que has grabado escribe al inicio (una de las lineas siguiente después del sub):
dim r as Variant
y al final antes del end sub:
r = Range("B1").Value
Range("a1:b8").Clear
Range("c4").Value = r
No puedes importar solo un dato, o al menos yo no sé como. Lo que sí puedes es borrar lo que no te vale y cambiar de sitio el dato que buscas con el código anterior.
Gracias maestro me vino bárbaro.
Ultima y no te molesto más. Como hago para de una planilla mas grande, como unos 100 datos, ( http://moneycentral.msn.com/investor/invsub/results/statemnt.aspx?symbol=ab ) obtener al igual que en el ejemplo anterior pero en este caso unos 10 o 15 datos dispersos en la planilla, importarlos en orden x ejemplo de a1 a p1 (osea como usted me dijo anteriormente " borrar lo que no te vale y cambiar de sitio el dato que buscas con el código anterior")
Concluyendo, como escribo lo mismo de antes pero en vez de para un solo dato para varios, tendría que hacer el mismo procedimiento pero 15 veces o se puede separar con "," ";" etc...
Gracias nuevamente
Si los datos están sueltos y dado que lo que importa Excel son tablas (rangos) lo que habría que hacer es lo siguiente. Supongamos que la tabla importada está en A1:H20 y que dentro están los datos sueltos y hay 10 que te valen.
En la declaración en vez de una variable usas un array
Dim r(9) as Variant
r(0) = Range("B1").Value
r(1) = Range("B7").Value
... y así con todos
Para borrar: Range("A1:H20"). Clear
Y ahora copias los datos donde quieras
Range("c2").Value = r(0)
Range("g3").value =r(1)
... y así con todos
Los datos que escojo son B1 y B7 y los pongo en C2 y G3 tu tendrás que poner los tuyos y completar con el resto de elementos del array.
Si siguen alguna regla por ejemplo cada tres celdas.. se puede hacer la copia más fácil . algo como: (previamente se declara i en la forma Dim i as Integer)
for i=0 to 10
r(i) = Range("a:"& i*3).value 'para los valores 0,3,6 y 9 de la columna A
next i
Hay que ver la fórmula que permite alcanzar todos los datos.
Gracias por toda la data, me colgué un poco en contestarte porque a medida que avanzo tengo más para preguntar y por avanzar con las ideas que me tiras.
Me surgió una nueva duda, al final de todo me pusiste que si seguía alguna regla se podía poner los códigos que me mostraste, pero te pregunto: Se podrá poner una función, por ejemplo, función "buscarv" dentro de la macro, y paso a explicar.
Supongamos que estos son los datos que quiero y donde los quiero:
r(1) = Range("B73").Value
r(2) = Range("b78").Value
r(3) = Range("b79").Value
r(4) = Range("B82").Value
Range("J2").Value = r(1)
Range("K2").Value = r(2)
Range("L2").Value = r(3)
Range("M2").Value = r(4)
Esto lo hago con 40 empresas y dentro del balance(donde busco esta info), no todos los valores que busco están en la misma celda, Ejemplo busco "Activos" de la "Empresa 1" en la celda "B73" pero en la "Empresa 2" los "Activos" se encuentra en "B76", por lo que me tira un dato erróneo.
Pregunto, se podrá poner una función (creo que es buscarv) que me de el valor correspondiente a "Activos", ¿osea qué busque dentro de una matriz el nombre de "Activos" y me tire el valor de los "Activos"?
Bueno muchas gracias por todo y si me podes contestar esta estoy muy agradecido sino no te preocupes y te agradezco por todo
Sí se pueden incluir funciones de la hoja dentro de las macros para buscarv el código sería:
Worksheetfunction.BuscarV (...)
Y en los paréntesis pones los argumentos que necesites separados por comas de acuerdo a la búsqueda.
Perdón por ser tan inculto en el excel pero no me acepta la fórmula dentro de la macro, me tira un error que dice se esperaba: = (no se donde se pone el "=")
Esto es lo que puse:
WorksheetFunction.VLookup(a2,data,2,false) o con "0" en ves de "False"
Esta es la tabla llamada "data" y el valor que quiero es 16,93 osea b2
Last Trade: 16.93
Trade Time: 10:58AM
EDT Change: Up 0.10 (0.59%)
Prev Close: 16.83
Open: 16/01/1900
Bid: 16.89 x 800
Ask: 16.94 x 100
1y Target Est: 16.31
Gracias
Disculpa por no habértelo explicado del todo. Las funciones de hoja de cálculo devuelven un resultado. Cuando lo escribes en una hoja de cálculo el resultado se devuelve en la celda donde está la fórmula. Cuando van en código en algún lado tienen que devolver el resultado. Eso es lo que te indica el error. Deberías poner algo como:
Range("z1") =WorksheetFunction.VLookup(a2,data,2,false)
si quieres el valor en la celda Z1 o bien algo como por ejemplo
dim z as Single
z =WorksheetFunction.VLookup(a2,data,2,false)
Si lo quieres en una variable.
Se me hace imposible usar el Vlookup, me parece que no me reconoce el 2do argumento por tener un signo de pregunta (?) Sabes como hacer para que me lo acepte, porque pongo esto
Range("p2") = Application.VLookup(b12, ("statemnt.aspx?symbol_ab_39"), 2, FALSO)
Y en la celda p2 me devuelve #¡VALOR!
Me parece que es porque yo saco la info de internet y como no aparece en la planilla no me lo identifica, no se si tienes alguna otra idea es bienvenida. Gracias
Vamos a ver. Estamos hablando de código VBA ¿correcto? Entonces Application. Vlookup no puede funcionarte. Vlookup está en WorksheetFunction no en Application.
Si te pone valor es porque en la celda P2 tienes alguna fórmula metida. Escribe directamente en la celda la fórmula con =Vlookup (...) a ver que te sale. ¿En principio el signo? Está dentro de una cadena, pero si te da problemas haz que busque la ultima parte solo por ejemplo. Primero asegura que la fórmula funciona con un text "estándar" y luego prueba si un texto específico te puede generar problemas.
Probe con: =BUSCARV(A12,statemnt.aspx?symbol_ab_4,2,0) y me da el valor que quiero pero si pongo en la VBA esto:
Range("p2") = WorksheetFunction.VLookup((A12), ("statemnt.aspx?symbol_ab_4"), (2), (0))
No me da, me parece que lo que no me deja que funcione es lo que esta conectado a internet, osea: "statemnt.aspx?symbol_ab_4".
Igualmente gracias.
En primer lugar no creo que te sean necesarios todos paréntesis que pones para cada valor. Por otro lado, el segundo parámetro de la función es una referencia a un rango o una tabla. En tanto en cuanto tengas acceso a esos datos funcionará tu código o no.
Si lo primero te funciona es porque de algún modo has hecho previamente la conexión. Mira que en la primera opción estás incuyendo sin comillas el texto, mientras que en el segundo es con comillas.
En una de las veces que me contestaste me pusiste esto:
Bueno, creo que ya entiendo lo que haces y lo que quieres. En la macro que has grabado escribe al inicio (una de las lineas siguiente después del sub):
dim r as Variant
y al final antes del end sub:
r = Range("B1").Value
Range("a1:b8").Clear
Range("c4").Value = r
No puedes importar solo un dato, o al menos yo no sé como. Lo que sí puedes es borrar lo que no te vale y cambiar de sitio el dato que buscas con el código anterior.
Saludos.
Te quería preguntar acerca de lo que esta subrayado. En este renglón:
r = Range("B1"). Value ("B1" es el valor que quiero), Ahora te pregunto: Se puede poner en el valor que quiero, osea en reemplazo de B1 poner una funcion buscarv? Para que me de el valor de B1 pero porque para ese valor necesito esta función, ya que el valor b1 no siempre se encuentra en el mismo lugar. Gracias
Sí, puedes haceer que r = WorksheetFunction.VLokkup (... ) si no deseas ponerlo en una celda y luego usar r como mejor te venga.
Lo de que B1 no se encuentra siempre en el mismo sitio no lo entiendo. B1 siempre está en el mismo sitio. Si lo que quieres decir es que el valor que necesitas unas veces está en B1, otras en C3, otras en J20... por decir algo, entonces tendrás que saber cada vez donde está el valor que buscas. El ordenador no sabe adivinar lo que quieres, hay que decírselo (programando). Una opción, no se si es factible en tu caso, es indicar en una celda donde está el valor que buscas.
Por ejemplo en A1 indicas la celda en la que está el valor. Así por ejemplo:
Si en A1 indicas B5 y en B5 escribes "hola", puedes escribir en C2:
=INDIRECT(B5) y obtendrás "hola" en C2.
Espero te sirva.
Por cierto, cierra y valora la pregunta, por favor. Ya te conteste y resolví (creo) tu pregunta. Deberías haberla cerrado y valorado entonces. SI luego tienes otra, puedes volver a hacerla y así sucesivamente.
Disculpame no sabia que te puntaban por esto, y yo te mande como 10 preguntas y te punteo en una(general), la próxima te voy a hacer una y la cierro, y así sucesivamente (para puntarte como lo merecen individualmente por cada pregunta) porque la verdad que la calidad de preguntas que me respondiste son excelentes. Mil gracias y espero seguir en contacto

Añade tu respuesta

Haz clic para o