Hojas de cálculo en Excel - página principal

Escribir datos de otro fichero Excel

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:

Anónimo dijo...

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

Anónimo dijo...

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.

Javier Marco dijo...

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.

Pedro Silvestre dijo...

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

Javier Marco dijo...

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.

Bernardo Uriel dijo...

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.

Anónimo dijo...

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.

Anónimo dijo...

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

Ariel dijo...

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

Anónimo dijo...

como especifico cual es la hoja de mi archivo que estan los datos y que deseo mostrar en el otro archivo... por favor ayudenme

Javier Marco dijo...

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

Sandro dijo...

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.

Javier Marco dijo...

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"

maxchufa dijo...

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.

Javier Marco dijo...

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

maxchufa dijo...

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.

maxchufa dijo...

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.

Javier Marco dijo...

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

maxchufa dijo...

Gracias, me ha sido muy útil.

José Antonio dijo...

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?

Javier Marco dijo...

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.

maxchufa dijo...

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.

Javier Marco dijo...

Prueba así:

Sql = "SELECT * FROM A3:A3"

maxchufa dijo...

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.

Sandro dijo...

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

Pipe dijo...

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.

Anónimo dijo...

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

Anónimo dijo...

Hola me llamo ivan, soy de mexico.
Esta pagina es increible! muy bien amigo esta super!

Anónimo dijo...

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.

Anónimo dijo...

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

aldo dijo...

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.

Maxwell E.Ceballos Pfeng dijo...

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

alfredo dijo...

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

Armando dijo...

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

Armando dijo...

me faldo decirte es que cuando corro el macro e sale en RUTA no esta definodo la variable

Armando dijo...

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

Javier Marco dijo...

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.

Armando dijo...

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

Javier Marco dijo...

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

Armando dijo...

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

david dijo...

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

Anónimo dijo...

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

Anónimo dijo...

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

Anónimo dijo...

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

Anónimo dijo...

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.

Anónimo dijo...

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

Josue dijo...

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

Josue dijo...

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

Javier Marco dijo...

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.

Josue dijo...

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

Josue dijo...

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

Javier Marco dijo...

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

Josue dijo...

excelente,
te lo agradezco enormemente

un abrazo

Jonathan dijo...

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.

Javier Marco dijo...

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.

Jonathan dijo...

Listo Javier gracias por tu acotaccion si logro conseguir lo que deseo lo publico..
Y adelante con este blog..

_moNotones dijo...

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!

Javier Marco dijo...

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.

Anónimo dijo...

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

Anónimo dijo...

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

Anónimo dijo...

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"

Anónimo dijo...

Y si el archivo no es xls sino xlsm??

Javier Marco dijo...

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.

Anónimo dijo...

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)

Javier Marco dijo...

Aquí tienes la solución: macros sin refresco de pantalla.

Saludos.

Mauroh dijo...

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

Javier Marco dijo...

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.

Anónimo dijo...

Muchisimas gracias me ha sido de mucha utilidad todo ^^

Anónimo dijo...

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.

juan carlos dijo...

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

Javier Marco dijo...

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.

Anónimo dijo...

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.

Anónimo dijo...

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

Anónimo dijo...

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

Javier Marco dijo...

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

Anónimo dijo...

Muchas gracias por la aportación, pero ya probé antes eso en Visual Basic y no me sirvió...

Virginia dijo...

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.

Virginia dijo...

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.

Ricardo Barragán dijo...

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)

Anónimo dijo...

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!