Como ya sabéis, cuando queremos escribir datos de un fichero de excel, en otro libro, lo que normalmente hacemos es referenciar en la fórmula del libro donde queremos escribir el dato, la ruta completa con el nombre del libro, la hoja, y la celda que contiene el dato que buscamos. Por ejemplo, si en una hoja del libro B queremos obtener el dato que hay en la celda C3 de la Hoja2 del libro llamado Empleados.xls, lo que haríamos sería poner una fórmula como esta:
=[Empleados.xls]Hoja2!C3 |
Si el libro en lugar de llamarse Empleados.xls, se llamase Datos de empleados.xls, entonces nos encontraremos con una ligera diferencia a la hora de incluir la fórmula, pues en este caso tenemos un nombre del libro con varias palabras. En este caso deberemos referenciar la fórmula usando dos comillas simples de la siguiente forma:
='[Datos de empleados.xls]Hoja2'!C3 |
El problemilla está en que cada vez que abrimos el fichero donde tenemos esa fórmula, nos aparecerá un mensaje indicándonos que existe una fórmula que vincula con otro libro de excel:
Hoy veremos como podemos traer datos de otro fichero de texto, de una forma parecida a como leíamos datos de una base de datos access y los escribíamos en un fichero excel. Es decir, no nos aparecerá ese mensaje indicándonos que estamos vinculando con otro libro, y por supuesto, sin necesidad de tener que abrir el fichero con los datos de origen.
Vamos a suponer que tenemos un fichero llamado Datos de empleados.xls, con la siguiente estructura:
Ahora supondremos que vamos a leer esos datos, y los vamos a escribir en un fichero de destino llamado por ejemplo Recogida de datos de empleados.xls. Para ello, simplemente necesitaremos saber el rango de datos a seleccionar. En nuestro caso, como veis en la imagen anterior, nos bastará con identificar que los datos están en el rango que va de A1 a C7. También podríamos obtener esa información, sin necesidad de elegir el rango a través de sus coordenadas (en este caso de A1 a C7), llamando al rango por su nombre.
Una vez determinado eso, ahora nos bastará con incluir este macro, y que está debidamente comentado, por si os queda alguna duda:
Sub leer_fichero_excel() 'Ocultamos el procedimiento Application.ScreenUpdating = False 'Si hay errores, que siga On Error Resume Next 'Definimos las variables: 'indicamos la ruta del fichero donde nos conectaremos, 'y que en este caso, será la misma que 'la de este fichero que contiene el macro ruta = ThisWorkbook.Path fichero = "Datos de empleados.xls" 'Creamos el objeto conexión Set Conn = New ADODB.Connection Conn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & ruta & "\" & fichero 'Creamos el objeto recordset Set rs = New ADODB.Recordset 'Seleccionamos los datos Sql = "SELECT * FROM A1:C7" 'Escribimos los datos rs.Open Sql, Conn, adOpenStatic, adLockOptimistic 'Traemos los datos, para lo cual 'comenzamos con los encabezados, 'y los escribiremos a partir de la celda A1 Range("A1").Select ActiveCell = rs.Fields.Item(0).Name ActiveCell.Offset(0, 1) = rs.Fields.Item(1).Name ActiveCell.Offset(0, 2) = rs.Fields.Item(2).Name 'ponemos en negrita los encabezados Range("A1:C1").Font.Bold = True 'Ahora seguimos con los datos, hasta acabar 'con los datos que nos devuelve la consulta Do While Not rs.EOF ActiveCell.Offset(1, 0) = rs(0) ActiveCell.Offset(1, 1) = rs(1) ActiveCell.Offset(1, 2) = rs(2) 'nos movemos al siguiente registro rs.MoveNext 'bajamos una fila ActiveCell.Offset(1, 0).Select Loop 'cerramos y limpiamos los objetos rs.Close Conn.Close Set rs = Nothing Set Conn = Nothing 'Mostramos el procedimiento Application.ScreenUpdating = True End Sub |
Cuando ejecutemos este macro, obtendremos esto (fijaos en la imagen siguiente, que el libro es el que se llama "Recogida de datos de empleados.xls"):
Desde aquí podéis descargar un fichero comprimido, que contiene el fichero de origen (Datos de empleados.xls) y el fichero de destino (Recogida de datos de empleados.xls), con todo lo que hemos visto en este artículo.
80 comentarios:
Hola Jevier, me confundí al poner el comentario...es aquí donde quería ponerlo.
En este ejemplo, si el PATH del fichero origen esta en otra carpeta, como podríamos resolver el problema?
Gracias
Y si está en otra hoja del mismo libro..perdona que sea tan preguntón, pero me facilitarias un pequeño marrón de conexiones de hojas de cálculo.
Muchas gracias por tu ayuda.
Pues es bastante sencillo. Ahí he supuesto que el path (la ruta) es el mismo que el del fichero que ejecuta el macro. Si no lo es, simplemente tienes que poner algo como esto:
ruta = "C:\carpeta\subcarpeta"
No pongas ni el nombre del fichero, ni la barra final, porque como verás, unas líneas más abajo, ya está eso incluido.
Si está en otra hoja del mismo libro, tendrás que usar la primera de las técnicas, por ejemplo así (no te compliques la vida con código innecesario):
=Hoja2!C3
Saludos.
Hola Javier, antes de todo felicitarte por el excelente blog, resulta muy útil dada las diversas aplicaciones que tratas.
Viendo esta entrada, me surge la duda de cómo hacer lo siguiente:
1)Si en lugar de "traer" todos los datos a un nuevo libro, solo necesito traer los datos de una fila "X" al nuevo libro, y de modo que esos datos se adecúen a celdas distinas a su orígen, es decir, que Empleados se copie a la celda A3, Edad en D3 y Categoría en C5, cómo se podría realizar dicho procedimiento??
Espero que me puedas ayudar con esto.
Saludos desde Guatemala
Hola Pedro.
Fíjate que en el ejemplo que puse, hay esta línea:
Sql = "SELECT * FROM A1:C7"
Esa línea está diciendo, qué rango de celdas tiene que traer. En lugar de poner A1:C7, puedes poner el rango que te interese.
Luego puedes pasar cada dato a una variable, para pegarlo en la celda que desees.
Cordial Saludo
Por favor me puede ayudar con este caso:
Tengo varias carpetas por años, en cada carpeta se encuentra una subcarpeta por mes y esta a su vez contiene diferentes archivos de excel. Estos archivos tienen un formato standard donde se encuentran determinados datos de los clientes. Con una macro necesito que por cada carpeta me abra cada archivo y me traiga los datos que necesito.
Yo se conseguir los datos, lo que no sé, es ¿Cómo hacer para que la macro abra el primer archivo que encuentre en la carpeta, y luego de haber tomado los datos que necesito, cierre este y abra el siguiente, hasta el último archivo que se encuentre en esa carpeta?
Por ahí ví un código que me sirve para traer los nombres de todos los archivos que existen en determinada carpeta, tocaría listarlos con un bucle en una hoja de excel y luego comenzar a abrirlos con un bucle y obtener los datos que necesito.
Toda la ayuda que me puedan brindar les estaré agradecido.
Buenas Javier, tengo algunos problemas para llevar a cabo esta macro, te comento:
No he podido usar las líneas de instrucción:
Set Conn = New ADODB.Connection
Set rs = New ADODB.Recordset
Y he usado las siguientes líneas:
Set Conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
Además en mi caso los datos estan desde la columna B hasta la AU, lo que me ha generado 46 columnas de datos en vez de 3, por lo que la instrucción:
ActiveCell.Offset(1, 1) = rs(1)
La he repetido 46 veces.
Otro detalle es que en el archivo que lee tengo muchas celdas con datos combinadas.
El resultado es que al ejecutar la macro veo que va recorriendo las filas de datos pero no escribe nada.
¿A que se debe esto?
Por cierto ¿hay alguna forma de calcular cuantas filas de la hoja de datos tiene que revisar? Ya que esta cantidad variará con el archivo de datos del que importe.
Muchas gracias.
Hola javier:
Tengo un problemilla. Necesito copiar datos de un libro a otro y no soy capaz de hacerlo.
el origen de datos puede estar en cualquier sitio y con cualquier nombre, la hoja de origen está protegida y siempre sera la misma.las celdas a copiar estan protegidas.
Utilizo GetOpenFileName para que salga un Dialog Box donde elegir el libro de origen,guardo el path en una variable (me guarda la ruta completa) pero soy incapaz de poder meter en la hoja destino los datos de la hoja de origen.¿como consigo referenciar(la hoja y celdas)de origen en el destino?
Tengo experiencia en VB pero no mucha en VBA, y he de hacerlo como macro excel.
¿me puedes echar una mano?
muchas gracias de antemano
Angel
Hola javier, muy bueno el blog. Tengon un problemita con esta macro. El libro que necesito leer lo crea otro programa en la version de excell 2.1, cuando lo quiero hacer con la macro da un error porque dice que no reconoce el formato de la tabla. Se podra solucionar ??? yo provisoriamente abro ese libro y lo grabo con un formato nuevo pero no es muy practico
como especifico cual es la hoja de mi archivo que estan los datos y que deseo mostrar en el otro archivo... por favor ayudenme
Eso es para usarlo con macros. Sin macros, usa algo como esto en la celda donde quieras escribir el dato de otro libro:
='[Libro de origen.xls]Hoja1'!$A$4
Eso te tomará el dato de libro llamado "Libro de origen.xls", y de la "Hoja1" de ese libro.
Un saludo
Hola Javier:
Está muy buena tu ayuda, pero tengo una limitación:
Los datos que pretendo copiar no tienen un número e filas fijo, ya que es el reporte de pedidos hechos en el mes, y por tanto la cantidad de registros varía de mes a mes.
Lo que yo hago para recorrer los datos de esta tabla es usar:
Cells(i,j)
y así puedo recorrer las celdas con cualquier estructura de control (for, while).
La limitación que tengo con tu macro es que se debe tener definido el rango de datos a copiar (A1:C7), por lo que no se puede recorrer celda por celda, para hacer operaciones con ella o hacer filtros antes de copiarlas.
Te agradecería mucho que me ayudaras con este problema.
Se me ocurre que podrías ponerle un nombre al rango de datos del origen. Por ejemplo, si a ese rando lo llamas origen, la consulta SQL te quedaría así:
Sql = "SELECT * FROM origen"
Hola. Lo primero es darte las gracias por compartir todo lo que sabes y ponerlo al alcance de curiosos como yo.
Me gustaría saber si es posible elegir el archivo sin tener que incluir su ubicación haciendo algo parecido a esto:
Workbooks.Open Filename:=Application.GetOpenFilename("Archivo , xls.*", _
, "SELECCIONAR ARCHIVO.")
He intentado incluirlo en tu código y no lo consigo.
Si fuese posible, ¿la manera de elegir los datos en un archivo *.xls es similar si se abre un archivo con formato *.xml?
Un saludo y muchas gracias.
Prueba cambiando estas 2 líneas:
ruta = ThisWorkbook.Path
fichero = "Datos de empleados.xls"
Por esta otra:
fichero = Application.GetOpenFilename("Archivo , xls.*", , "SELECCIONAR ARCHIVO.")
Y esta otra:
Conn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & ruta & "\" & fichero
Por esta otra:
Conn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & fichero
Muchas gracias Javier, funciona perfectamente. Voy a probar si puedo abrir un fichero xml y seleccionar los datos que me interesan para introducirlos en la hoja de cálculo.
Un saludo y gracias de nuevo.
Hola de nuevo. Me ha surgido un pequeño problema y es que cuando voy a elegir el archivo y le doy a cancelar, la hoja se bloquea, entra en el Loop y no puede salir. ¿por qué no funciona el:
On Error Resume Next
?
¿Cómo puedo solucionar este contratiempo?
Un saludo y gracias.
El que no se seleccione fichero, no quiere decir que sea error.
Pon esta línea justo debajo de la línea donde seleccionas el fichero:
If fichero = False Then Exit Sub
Gracias, me ha sido muy útil.
HOLA JAVIER ME HA SIDO DE MUCHA UTILIDAD ESTE BLOG, SIN EMBARGO ME SURGIO UNA PROBLEMA, SI EL ARCHIVO DE DONDE VOY A LEER LOS DATOS TIENE VARIAS HOJAS
¿CÓMO LE ESPECIFICO LA HOJA DE DONDE QUIERO QUE LEA Y NO TOME LA PRIMERA?
Puedes hacerlo poniéndole un nombre al rango de datos, y con independencia de donde esté (Hoja1, Hoja2, etc), tan solo tienes que llamar a esos datos por su nombre:
Sql = "SELECT * FROM nombre_del_rango"
Aquí puedes obtener más info sobre como ponerle un nombre a las celdas.
Hola Javier. Tengo una duda sobre cómo seleccionar celdas sueltas en lugar de un rango de celdas para después pegarlas independientemente en la hoja de cálculo, he intentado esto pero no funciona:
Sql = "SELECT * FROM A3"
rs.Open Sql, Conn, adOpenStatic, adLockOptimistic
Range("A4").Select
ActiveCell = rs(0)
Un saludo.
Prueba así:
Sql = "SELECT * FROM A3:A3"
Hola Javier.
Nada, imposible, esto también lo había intendado y no me funciona y no entiendo muy bien por qué.
Estoy pensando si una posible solución, sería hacer el cuadrante completo de todas las columnas fila por fila, en mi caso una cuadrícula definida por A1:BF42. El único problema que tendría sería, en lugar de ejecutar el bucle que iniase el barrido completo de las 42 filas, poder decirle a la macro qué filas y en qué columnas está el dato, por ejemplo rs(9) que sería la columna J, que quiero copiar.
No sé, se me ha ocurrido esta manera pero no sé si me estoy liando demasiado.
Un saludo y gracias de nuevo.
Para quien le interese:
Respecto a lo que pedia, adecué algo que me ayudó, pero que demora mucho al procesar hojas con más de 1500 filas:
Para copiar una celda a otra en la misma hoja usando una estructura de control (for, while, etc.)se usa algo parecido a esto:
Cells(i + k, 1).Value = Cells(i, j).Value
En cambio para copiar una celda de otro archivo excel que esté en la misma ruta que nuestro archivo, se usa algo parecido:
Cells(i + k, 1).Activate
ActiveCell.FormulaR1C1 = "='[Nombre de mi archivo.xls]Hoja 3'!R" + CStr(i) + "C" + CStr(j)
Bueno, esto es de gran ayuda para crear aplicativos portables en Excel. Pero, como dije, demora bastante procesar más de 1500 archivos. Algo que con consultas SQL lo haría mucho más rápido
Cordial saludo señor Marco. ¿Qué instrucción tengo que escribir para que la macro me abra varios archivos de Excel y me extraiga los datos que necesito? En el ejemplo pones uno solo, pero yo necesito abrir siempre una cantidad variable de archivos y extraer los respectivos datos. ¿Cómo lo hago?
Mil gracias.
Aupa!
Me ha servido el codigo y los comentarios de mucho, gracias a todos. :)
El unico "problema" q encuentro, es cuando en un red esta siendo utilizado el fichero de donde recoge los datos. Que parece que para la ejecucion del macro. Quedando las dos hojas de excel abiertas.
He intentado en el codigo, al abrir:
rs.Open Sql, Conn, adOpenStatic, adLockReadOnly (el original 'adLockOptimistic') pero sige sin funcionarme.
Si hay alguna idea quedaria agradecido.
Un saludo
Hola me llamo ivan, soy de mexico.
Esta pagina es increible! muy bien amigo esta super!
Hola, estoy necesitando una macro que haga que el resultado de la siguiente formula calcule.
=CONCATENAR("=SI(A2=0;";"0;";$A$2;")")
El resultado de la misma es
=SI(A2=0;0;0) y pegándola como valor me queda armada pero no calcula.
Intente con ActiveCell.Formula pero me dá error.
Gracias por la ayuda que puedas darme.
Excelente Javier, un genio, he buscado esta informacion hace tiempo por la web, y nada tan concreto como lo publicado, mis felicitaciones por compartir tu conocimiento, saludos Pablus
Primero que nada gracias por tu aporte, me funciono exelentemente.
Sin embargo me solicitaron que solo una hoja de cierto libro se compartiera con otros usuario en la red, use tu medio, todo bien hasta ahi pero no se como compartiselo a otros usuarios en la red pues es necesario oncluir la ruta del archivo del cual toma los datos.
De ante mano gracias por todo.
Saludos Javier, tu ejemplo me ha servido mas que bastante para una macros que estoy creando pero mi problema es el siguiente con el codigo que pones se fasilita la recuperacion de datos desde una hoja de excel a otra pero quisiera preguntarte como seria utilizando el mismo metodo agregar un registro a una planilla cerrada
o realizar una actualizacion e utilizado el siguiente codigo pero me envia un error y no logro solucionarlo si me pudieras echar una mano te estaria profundamente agradesido
Sub Recorrer_Celdas()
Set Conn = New ADODB.Connection
Conn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & Ruta & "\" & Fichero
Set rs = New ADODB.Recordset
Sql = "SELECT * FROM " & Ing_Mant_Empl.Combo_Area_Ing_Mant.List(Ing_Mant_Empl.Combo_Area_Ing_Mant.ListIndex)
rs.Open Sql, Conn, adOpenStatic, adLockOptimistic
rs.AddNew
rs.Fields(0) = Ing_Mant_Empl.Ing_Nombre.Text
rs.Update
rs.Close
Conn.Close
Set rs = Nothing
Set Conn = Nothing
End Sub
Para el problema de la Hoja variable del libro a importar, hice esto y me resultó.
'Creamos el objeto recordset
Set rs = New ADODB.Recordset
'Se indica hoja variable la cual esta dada por la celda B3 de la hoja actual
Dim Ruta As String
Ruta = ActiveSheet.Cells(3, 2).Text
XRango = "A1:C15"
'Seleccionamos los datos
Sql = "SELECT * FROM [" & Ruta & "$" & XRango & "]"
'Escribimos los datos
rs.Open Sql, Conn, adOpenStatic, adLockOptimistic
Primero mis mas sinceras felicitacones tienes un metodologia para explicar excelente de estas paginas son las que quiero y no nadamas rellenos
dentro de este ejemplo que pones lo baje y me funciona perfectamente ese mismo codigo lo copio a otro archivo de excell 2007y no me funciona porque
saludos
me faldo decirte es que cuando corro el macro e sale en RUTA no esta definodo la variable
dentro de tu ejemplo vi que te preguntaron esto
?traer los datos de una fila "X" al nuevo libro, y de modo que esos datos se adecúen a celdas distinas a su orígen, es decir, que Empleados se copie a la celda A3, Edad en D3 y Categoría en C5, cómo se podría realizar dicho procedimiento?
dentro de de tu respuesta pusiste
Fíjate que en el ejemplo que puse, hay esta línea:
Sql = "SELECT * FROM A1:C7"
Luego puedes pasar cada dato a una variable, para pegarlo en la celda que desees.
un favor me podrias poner una pequeña rutina de como se hace ya tengo varios dias buscando este rollo saludos gracias
Al parecer el problema lo tienes con la ruta del fichero del cual obtenemos los datos. En el ejemplo, lo que he supuesto es que tanto el fichero del cual recuperamos los datos, como el fichero donde los escribimos, están en el mismo directorio.
Fíjate en esto:
ruta = ThisWorkbook.Path
Si el archivo del cual obtenemos los datos está en otra carpeta diferente a la del fichero desde el cual llamamos esos datos, te bastará con poner algo así:
ruta = "L:\Excel"
En ese ejmplo he puesto la ruta de una unidad "F" (una llave USB, en mi caso), y una carpeta o directorio que hay dentro llamado "Excel". De esta forma le informamos al programita que recupere los datos de ese sitio, es decir, de F y de dentro de esa carpeta llamada Excel, pues ahí esdonde está el fichero cuyos datos queremos recuperar.
Saludos.
muchas gracias por tu respuesta pero la mas me interesa en este momento es esta
dentro de tu ejemplo vi que te preguntaron esto
?traer los datos de una fila "X" al nuevo libro, y de modo que esos datos se adecúen a celdas distinas a su orígen, es decir, que Empleados se copie a la celda A3, Edad en D3 y Categoría en C5, cómo se podría realizar dicho procedimiento?
dentro de de tu respuesta pusiste
Fíjate que en el ejemplo que puse, hay esta línea:
Sql = "SELECT * FROM A1:C7"
Luego puedes pasar cada dato a una variable, para pegarlo en la celda que desees.
un favor me podrias poner una pequeña rutina de como se hace ya tengo varios dias buscando este rollo saludos gracias
te agradeceria este grandismo favor Saludos
Armando, prueba este bucle do while, en lugar del que aparece en el artículo, para que veas un ejemplo donde te concatena los valores del recordset, separándolos con el signo #:
Do While Not rs.EOF
variable = variable & rs(0) & "#" & rs(1) & "#" & rs(2)
ActiveCell.Offset(1, 0) = rs(0)
ActiveCell.Offset(1, 1) = rs(1)
ActiveCell.Offset(1, 2) = rs(2)
'nos movemos al siguiente registro
Range("A12") = variable
rs.MoveNext
'bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
mil disculpas pero me equivoque en lugar de filas eran columnas
disculpa a este que no sabe nada pero sino pregunta como quiere llegar
Mil saludos
Hola javier
excelente tu aporte, solo que al modificarlo me da un problema, me queda patinando o repitiendo el while, llega ha loop y regresa
Do While Not rs.EOF
ActiveCell.Offset(1, 0) = rs(0)
ActiveCell.Offset(1, 1) = rs(1)
ActiveCell.Offset(1, 2) = rs(2)
'nos movemos al siguiente registro
rs.MoveNext
'bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
una y otra vez, he intentado varias cosas y nada, si podrias decirme el por que...gracias de antemano
Hola Javier gracias por tu blog está fantastico, como quedaría la macro si los datos los tengo en el mismo libro pero en otra hoja llamada Empleados_Fuente.
GRacias
Hola que tal soy ORLANDO, buen día para todos.
Esta excelente la pag y la informacion que publicas genial.
El codigo de arriba esta muy bien pero a mi me marca error en:
Set Conn = New ADODB.Connection
Conn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & ruta & "\" & fichero
'Creamos el objeto recordset
Set rs = New ADODB.Recordset
No me reconoce el ADODB, tengo excel 2007, ya busque en referencias para agregarle la dll pero no esta, como puedo solucionar esto y que me corra el codigo, o hay un codigo alterno con OLEObject?
Porfavor, un ayuda.. te lo agradecere muchisismo..
SALUDOS
Hola Javier Marco, nuevamente te saludo.
Solo una preguntita que seguro no te tomara tiempo.
Mira, tengo un combobox, al hacer clik en un elemento kiero que el valor se valla a otra hoja, como a continuacion lo hago.
Private Sub ComboBox1_Change()
Worksheets(12).select
ActiveSheet.Range("B2").select
ActiveCell.FormulaR1C1 = ComboBox1
End Sub
Pero la cosa aqui es que me manda el foco a esa hoja y celda, lo que
necesito es que el foco no se mueva, que el usuario no vea hacia donde se va el dato.
Me puedes orientar porfavor, sera que debo usar otras instrucciones?
De antemano te agradesco desde Mexico.
Felicidades por la pag. = )
Orlando
Jeje.. una disculpa si te hice perder tiempo, ya lo resolví con la sig linea.
Worksheets(12).Range("B2").Value = ComboBox1
te agradesco de antemano la atencion.
SALUDOS
Orlando de Mexico.
Como seria insertar en una celda de otro libro un dato, esto tiene que ser a la hora de yo escribir en el libroA que inserte el dato en el libroB.Hoja1.celdaA.
Seria igual con una conexion ADODB ?
Una orientación por favor.
GRACIAS
buenas tardes estimado,
es posible añadir un filtro con un where para seleccionar solo los registros que cumplan una condicion
por ej: solo los que en el cargo sean administrativas
muchas gracias
saludos
Josue Desde chile
Buenos dias javier,
muchas gracias por tus enseñansas solo queria hacer una consulta
aplico este modulo a un archivo que tiene datos en el rango a1:ak13867
pero solo me trae los datos de las tres primeras columnas.
como puedo hacer para que me lea i muestre los datos de todo ese rango
muchisimas gracias por tus valiosas ayudas
Hola Josue.
Para tu primera pregunta, creo que lo más indicado sería importar todo, y luego depurar con un macro, para eliminar todas aquellas líneas que no contengan la palabra "Administradora".
Respecto a tu segunda pregunta, debes añadir los encabezados de la siguiente forma:
ActiveCell.Offset(0, 3) = rs.Fields.Item(3).Name
ActiveCell.Offset(0, 4) = rs.Fields.Item(4).Name
etc...
Y luego los datos en el bucle Do While:
ActiveCell.Offset(1, 3) = rs(3)
ActiveCell.Offset(1, 4) = rs(4)
etc...
Aunque si tienes hasta la columna AK, casi lo mejor sería meter todo en un bucle For (desde la columna 1 hasta la 37).
Saludos.
Muchas gracias
te cuento que en una primera instancia pude desplegar la info. aplique un where en la select y me trae justo los valores indicados, perfecto.
Pero...al tratar de implementar el for que me recomiendas,,,no me esta resultando,, me disculpo por todas las preguntas,,pero esta macro resultaria vital para mi trabajo si la pudiera adecuar a lo que te planteo,,,,, muchas gracias por tu paciencia y ayuda
un abrazo
estimado,
con el tema de poder filtrar los registro seleccionados, ningun problema, todo ok.
no obstante a la hora de poder agregar el ciclo for para poder leer los datos desde a1:ak50380 no me esta resultando, me podria dar una luz al respecto, esta macro resultaria vital para mis actividades laborales, muy vital, muchas gracias por toda tu ayuda y paciencia
un abrazo
Te lo explico con el ejemplo de este mismo artículo.
Estas tres líneas:
ActiveCell = rs.Fields.Item(0).Name
ActiveCell.Offset(0, 1) = rs.Fields.Item(1).Name
ActiveCell.Offset(0, 2) = rs.Fields.Item(2).Name
Sustitúyelas por estas:
For i = 0 To 2
ActiveCell.Offset(0, i) = rs.Fields.Item(i).Name
Next
Y estas otras:
ActiveCell.Offset(1, 0) = rs(0)
ActiveCell.Offset(1, 1) = rs(1)
ActiveCell.Offset(1, 2) = rs(2)
Sustitúyelas por estas:
For i = 0 To 2
ActiveCell.Offset(1, i) = rs(i)
Next
Verás como te devuelve el mismo resultado.
Ahora solo te queda sustituir el To 2 por To 36, si hay 37 columnas, pues el bucle empieza por cero.
Saludos
excelente,
te lo agradezco enormemente
un abrazo
Que tal Javier excelente tu blog necesito una consulta necesito escoger los datos de diferentes filas he cambiado esto pero no me ha resultado dame un mano..
Range("A2:C2,A5:C5").Select
For i = 0 To 2
ActiveCell.Offset(0, i) = rs.Fields.Item(i).Name
ActiveCell.Offset(4, i) = rs.Fields.Item(i).Name
Next
For i = 0 To 2
ActiveCell.Offset(1, i) = rs(i)
ActiveCell.Offset(5, i) = rs(i)
Next
esto he realizado con las ayudas que nos has otorgado pero no me ha funcionado.
Creo que deberías hacerlo a través de la consulta SQL. Las consultas SQL no son mi fuerte, pero creo que deberías investigar sobre las consultas de UNION.
Hay muchos manuales sobre SQL en la red.
Un saludo.
Listo Javier gracias por tu acotaccion si logro conseguir lo que deseo lo publico..
Y adelante con este blog..
Hola, una consulta, vi por ahi que decias que si querías tomar un rango de datos variable, podias definirlo agregandole un nombre al rango...existe alguna posibilidad de hacerlo de otra forma? En la planilla que tengo tendria que declarar 50 nombres, y perdería las capacidades de hacerlo con un loop. Espero me puedas ayudar, muchas gracias!
Es probable que haya otras formas para hacerlo sin macros, pero esta es bastante sencilla. COmo ves, estamos definiendo un rango variable, con el nombre de "valores", que comprende desde la celda A1, hasta aquella donde haya datos:
Sub nombre_variable()
'Nos situamos en la 1ª fila con datos
Range("A1").Select
'bajamos hasta el final de los datos contínuos
Selection.End(xlDown).Select
'fichamos la celda
celda_final = ActiveCell.Address
'le ponemos el nombre de "valores" al rango
ActiveWorkbook.Names.add Name:="valores", RefersToLocal:=Range("a1:" & celda_final & "")
End Sub
Saludos.
Estimado; cuando quiero hacer otro ejercicio parecido me daun errps en Set Conn = New ADODB.conection, utilizando la misma macro pero el libros con tros nombres pero en l a misma ubicación
Excelente ayuda. Pero aun me gustaria saber si el fichero de donde extraigo la informacion estuviera en la hoja4, cual seria el cambio para que fuera a esa hoja y lo efectuara.
saludos
ayudita...
Quiero halgo simple (sin VBA) para leer una celda excel en otro archivo excel.
Lo sencillo seria:
='[Archivo 2011 01.xls]Sheet 2'!$Q$62
pero necesito leer otro archivo dependiendo de la fecha.
Intente con esto en una celda pero no logro que excel lo interprete como formula
="'[Archivo "&A4&" 0"&A3-1&".xls]Sheet 2'"&"!$Q$62"
Y si el archivo no es xls sino xlsm??
Fíjate que hay una línea que pone:
Conn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & ruta & "\" & fichero
Simplemente cambia la parte donde pone xls por xlsm
Saludos.
Vale, el archivo me ha sido de gran utilidad... al traer los datos los mios son numeros y necesito hacer calculos con ellos, los ubico en una hoja diferente y en otra tengo la tabla donde se hacen los calculos con los datos pero al actualizarlos si tengo =Hoja2!b5+Hoja2!b6 cambia a #!REF
Estoy usando esto
Sheets("Hoja2").Select
Range("b3:b85").Copy
Sheets("Hoja1").Select
Range("c18").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
lo coloco lejos de mi tabla de calculos y ella hago referencia es a las celdas donde me copia los datos
pero al usar el Sheets("Hoja1").Select se produce un parpadeo en excel del va y viene de hoja a hoja
no ahi otra forma de tomar esos datos o eliminar ese parpadeo?
son minimo unas 22 visitas entre hojas por lo q estoy tomando datos de 10 archivos
parpadeo=(me muestra las hojas que visita rapido pero se ve ese movimiento)
Aquí tienes la solución: macros sin refresco de pantalla.
Saludos.
Javier, una vez mas agradeciendo el enorme aporte y la consulta es como hacer para que tu instruccion funcione libremente en otros libros?? ya que decarge tu aplicacion y funciona perfectamente, pero si yo comienzo abriendo 2 libros en excel 2007 nuevos y enganchar el procedimiento en el modulo de VB este no es posible ejecutarlo, los cambios a realizar son solo en el nombre del archivo o en otras instrucciones???
Para eso, debes incluir en cada macro, esas líneas:
1ª línea del macro (después del sub):
Application.ScreenUpdating = false
última línea del macro (antes del end sub)
Application.ScreenUpdating = true
Debes introducir esa modificación, en cada macro.
Muchisimas gracias me ha sido de mucha utilidad todo ^^
Hola perfecto el blog. solo quería dejar este arreglo que surgió de la necesidad de hacer mas placentera la espera ante la ejecución de macros largas o con maquinas lentas como es el caso en mi trabajo:
lo que hago es crear una hoja que yo llamo "procesando" en la cual hay un foto de mi hija que ocupa toda la planilla con la frase "espere por favor" (claro que podría ser un logo o lo que quieran) luego en el código de la macro coloco:
'que haga visible la hoja
sheets ("procesando").visible = true
'Que oculte el Procedimiento
Application.ScreenUpdating = false
'que oculte la hoja
sheets ("proceso").visible = false
'luego todo lo que quieran que haga
'por ultimo Que muestre el Procedimiento
Application.ScreenUpdating = true
y listo hasta que termine el proceso la pantalla mostrara lo que quieran un abrazo.
hola javier, esque tengo un problema cuando trato de ejecutar el macro me sale un mensaje de dices:
error de compilacion:
no se ha definido el tipo definido por el usuario.
y me sombrea esta parte del codigo:
New ADODB.Connection(sombreado de azul)
Sub leer_fichero_excel()(sombreado de amarillo)
esperoque me puedas responder a la brevedad.
gracias y saludos
Para solucionar ese error, pásate por este artículo: leer una Base de Datos Access, desde Excel. En los primeros párrafos verás que hay que tener activada la referencia "Microsoft ActiveX Data Objects 2.8 Library".
Cuando actives esa referencia, ya no tendrás el error.
Saludos.
HOLA, YO QUISIERA QUE DESDE EL "LIBRO A" DONDE TRABAJO Y DONDE ESTAN TODAS FORMULAS, MACROS, ECT, ECT.,...SE COPIE LOS DATOS CON EL MISMO FORMATO DE VARIAS HOJAS Y QUE AL EJECUTAR LA MACRO SE CREE UN ARCHIVO QUE CONTENGA DICHAS HOJAS Y PODER DEJAR ESE REPORTE EN UNA DIRECCIÓN ESPECÍFICA DE LA PC. SE PUEDE??,, POR FAVOR AYUDAME.
Buenos días,
Estoy intentando realizar una macro que me convierta a pdf un fichero excel y lo guarde con el mismo nombre que el fichero original.
Por favor, me podeis ayudar. Gracias
Hola.
Tengo un problema y si alguien pudiera ayudarme estaria muy agradecida.
Estoy haciendo un programita en visual basic de excel 2003 y no se como referenciar celdas que se encuentran en otra hoja de cálculo distinta, es decir, en la hoja de cálculo 3 quiero que me aparezca el resultado de emplear celdas que se encuentan en la hoja de cálculo 1.
Espero haberme explicado bien y gracias de antemano
SI por ejemplo quieres mostrar en la Hoja3 el valor de la celda A1 de la Hoja1 (suponemos que se llama Hoja1), solo necesitas esta fórmula en la celda de la Hoja3:
=Hoja1!A1
Si la Hoja1 se llama por ejemplo Ventas de 2011, prueba esto:
='Ventas de 2011'!A1
Saludos
Muchas gracias por la aportación, pero ya probé antes eso en Visual Basic y no me sirvió...
Hola, Javier, muchas gracias por todo lo que ayudas. Tengo un problema que no consigo resolver:
tengo unos 13.000 archivos de excel y necesito crear una tabla con una celda concreta de cada uno de esos 13.000 archivos.
He llegado a hacer lo siguiente: En la celda donde quiero que me aparezca el dato que necesito pongo: "'Y:\ARCHIVOS\FACTURAS\EMITIDAS 2011\[15-2011 SC.xls]FACTURA'!$F$30" y así me aparece el dato que necesito.
El problema lo tengo cuando en la celda de debajo quiero que, directamente se cambie a: "'Y:\ARCHIVOS\FACTURAS\EMITIDAS 2011\[16-2011 SC.xls]FACTURA'!$F$30" y así sucesivamente.
Habría alguna forma de hacerlo sin necesidad de entrar en la ruta y modificar la fórmula a mano? Si en lugar de poner 15-2011 SC.xls pongo esa información en la celda C6 y modifico la ruta a: "'Y:\ARCHIVOS\FACTURAS\EMITIDAS 2011\[=C6]FACTURA'!$F$30" lo que hace es abrirme la ruta para que seleccione el archivo, por lo que no me valdría.
Muchas gracias de antemano por tu respuesta.
Hola, Javier
Te escribí comentarios en dos entradas, así que te contesto por las dos.
Ya he conseguido sacar lo que me hacía falta.
Muchas gracias, y hasta otra.
Javier... Muchas gracias.
Me gustaría saber como hacer lo mismo desde varios libros - archivos- de excel, en una misma hoja de cada libro (con el mismo nombre), de modo que en un único archivo (hoja de excel) quede una base de datos consolidada desde otros libros (es información de estudiantes -notas y observaciones-, que están en una sola columna de 50 filas)
Hola, tengo que rescatara de varios archivos algunos datos ubicados en la mismas celdas C21:C26, los archivos se llaman distintos, pero ya pude llevar el nombre del archivo a mi libro de destino, está en la celda A4, y a continuanión debo copiar los valores de su archivo, como lo hago para reconocer el nombre del archivo y los datos, no sé si me explico bien. Gracias!
Publicar un comentario