Explicaré hoy una sencilla macro que nos permite trabajar sobre libros de trabajo en Excel cerrados, pero de los que necesitamos copiar parte de su contenido.
Para ello emplearemos el método Open del objeto Workbooks: WorkBooks.Open; ojo no confundir con otro objeto que es Workbook.
De igual forma para cerrar un libro podemos emplear el método Close del objeto Workbooks: WorkBooks.Close.
Estos dos métodos son la esencia de nuestra futura macro. Macro de Excel que nos permitirá abrir un libro cerrado desde nuestro fichero de trabajo, para seleccionar un rango de celdas, pegarlo en nuestro destino y finalmente cerrarlo.
Supongamos dos ficheros, uno principal (Principal.xlsm) donde pegaremos el contenido del segundo fichero origen (Origen.xlsx). Lógicamente el 'Principal' tiene una extensión .xlsm por que contiene el código de nuestra macro.
Veamos nuestros ficheros de trabajo. El libro 'Origen.xlsx' en su hoja 'Datos' contiene un listado de cursos de Excel:
Por otro lado queremos pegar los datos existentes de esos cursos de Excel en la hoja 'Resumen' del libro 'Principal.xlsm', pero sólo copiaremos los datos de la tabla excluyendo la cabecera de rótulos, ya que ese dato lo tenemos en nuestro destino.
Además, para futuros copiados y pegados, la celda destino de nuestro pegado debería ser la primera sin utilizar; por ejemplo, en este primer caso, la primera celda o fila sin utilizar es la que está debajo de la cabecera, esto es celda A2, pero en la siguiente sería la celda A22.
Nuestro código VBA deberá insertarse en un módulo del libro 'Principal.xlsm':
Podemos probar nuestra macro de Excel. Para ello cerramos el libor 'Origen.xlsx' y ejecutamos la macro 'CompletarLibro' desde 'Principla.xlsm'. Con ello conseguimos lo esperado, hemos seleccionado del libro 'Origen.xlsx' todas las filas menos la cabecera de la tabla de Cursos y se ha pegado en el libro 'Principal.xlsm' a partir de la primera celda libre:
El resultado es el esperado, se ha copiado totalmente el contenido del libro 'Origen' (formatos, valores, fórmulas, etc) en el libro 'Principal' a partir de la celda correcta.
Para ello emplearemos el método Open del objeto Workbooks: WorkBooks.Open; ojo no confundir con otro objeto que es Workbook.
De igual forma para cerrar un libro podemos emplear el método Close del objeto Workbooks: WorkBooks.Close.
Estos dos métodos son la esencia de nuestra futura macro. Macro de Excel que nos permitirá abrir un libro cerrado desde nuestro fichero de trabajo, para seleccionar un rango de celdas, pegarlo en nuestro destino y finalmente cerrarlo.
Supongamos dos ficheros, uno principal (Principal.xlsm) donde pegaremos el contenido del segundo fichero origen (Origen.xlsx). Lógicamente el 'Principal' tiene una extensión .xlsm por que contiene el código de nuestra macro.
Veamos nuestros ficheros de trabajo. El libro 'Origen.xlsx' en su hoja 'Datos' contiene un listado de cursos de Excel:
Por otro lado queremos pegar los datos existentes de esos cursos de Excel en la hoja 'Resumen' del libro 'Principal.xlsm', pero sólo copiaremos los datos de la tabla excluyendo la cabecera de rótulos, ya que ese dato lo tenemos en nuestro destino.
Además, para futuros copiados y pegados, la celda destino de nuestro pegado debería ser la primera sin utilizar; por ejemplo, en este primer caso, la primera celda o fila sin utilizar es la que está debajo de la cabecera, esto es celda A2, pero en la siguiente sería la celda A22.
Nuestro código VBA deberá insertarse en un módulo del libro 'Principal.xlsm':
Sub CompletarLibro() Dim ruta As String, direccion1 As String Dim celdadestino As Range 'definimos rutas y archivos como variables ruta = "E:\excelforo\" fichero1 = "Origen.xlsx" direccion1 = ruta & fichero1 'identificamos la celda disponible en el archivo Principal, hoja Resumen Set celdadestino = Workbooks("Principal.xlsm").Sheets("Resumen").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0) 'abrimos el fichero desde donde copiar... con el método .Open Workbooks.Open Filename:=direccion1 Worksheets("Datos").Activate 'seleccionamos qué copiar y donde Set tbl = Range("A1").CurrentRegion 'con este código únicamente copiamos la tabla excepto la primera fila 'y lo pegamos en la celda destino correcta del libro Principal.xlsm tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, tbl.Columns.Count).Copy _ Destination:=Workbooks("Principal.xlsm").Sheets("Resumen").Range(celdadestino.Address) 'limpiamos el Portapapeles Application.CutCopyMode = False 'cerramos fichero origen con el método .Close, sin guardar cambios (nos aseguramos...) Workbooks(fichero1).Close savechanges:=False End Sub
Podemos probar nuestra macro de Excel. Para ello cerramos el libor 'Origen.xlsx' y ejecutamos la macro 'CompletarLibro' desde 'Principla.xlsm'. Con ello conseguimos lo esperado, hemos seleccionado del libro 'Origen.xlsx' todas las filas menos la cabecera de la tabla de Cursos y se ha pegado en el libro 'Principal.xlsm' a partir de la primera celda libre:
El resultado es el esperado, se ha copiado totalmente el contenido del libro 'Origen' (formatos, valores, fórmulas, etc) en el libro 'Principal' a partir de la celda correcta.
Hola tengo una carpeta donde hay varios archivos de excel y quiero extraer el dato de una columna especifica en estos archivos y copiarlos en otra libro de excel, como lo hago.
ResponderEliminarHola,
Eliminarpuedes emplear la macro de esta entrada para indicar los libros que quieres abrir e ir copiando y pegando el rango en cuestión en el libro destino...
Si no son muchos, puedes repetir el código modificando el libro origen (su ruta).
Si son muchos Libros en esa carpeta, podrías aplicar lo explicado en esta otra entrada:
http://excelforo.blogspot.com.es/2012/06/vba-macro-para-imprimir-los-workbooks.html
y automatizar los libros por abrir en esa carpeta, para ir pegando el contenido en el Libro destino.
Slds
Buenas Ismael, tengo una duda muy simple, o no la veo....
Eliminartengo dos libros en una carpeta, A y B, en A tengo una macro que abre y cierra B,
la pregunta es como seria un codigo que ejecute una macro del libro B
1 A macro (abrir B, ejecutar "otra macro dentro de B", salvar o guardar B, cerrar B.
perdón por mi simpleza.
Saludos.....
Hola,
Eliminarpara ejecutar macros de otro libro podrías emplear la instrucción (desde el libro A):
Application.Run "LibroMacro.xlsm!MacroNombre"
para abrir otro libro (libro B) desde A deberás emplear
Workbooks.Open "LibroB.xlsm"
para guardarlo antes de cerrar
Workbooks.Close "LibroB.xlsm" SaveChanges:=True
Espero te sirva.
Slds
Muchas gracias por la respuesta, (por ambos lados...) me funciona.....
Eliminarel Application run me faltaba....
abrazo y saludos
Esteban
;-)
EliminarSlds cordiales
Hola Ismael, probe tu codigo pero me sale error en la línea:
ResponderEliminartbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, tbl.Columns.Count).Copy _
Destination:=Workbooks("Principal.xlsm").Sheets("Resumen").Range(celdadestino.Address)
Lo copie tal como esta en tu post, solo cambie las rutas de los archivos:
ruta= "C:\Documents and Settings\uv2824\Desktop\"
fichero1= "Prueba de Macro.xls"
Set celdadestino = Workbooks("Macro.xls").Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
Podrias ayudarme, por favor!
Gracias!
DAVID
Olvide indicarte que estoy trabajando en Excel 2003
EliminarHola Davico...
Eliminares normal que al utilizar ciertos códigos de versiones superiores en otras antiguas existan incompatibilidades (normal en cualquier programa, las más nuevas no siempre funcionan en las 'viejas').
Al trabajar en Excel 2003, lo mejor que puedes hacer es grabar con el asistente de grabación de macros, y con el modo Final activo selecciona el área de copiado, luego simplemente copia ese código en la macro del post...
Lo que te falla es la propiedad Resize.
No te puedo concretar mucho más por que hace algún tiempo que desinstalé 2003, y no puedo probar un código que lo reemplace..
Lo siento :-(
Ismael :
ResponderEliminarAgradesco tu conocimiento, en post de ayudar me parece excelente tu explicacion pero quiero agregar algo mas ... me podrias ayudar en bloquear los cerrados de libro que trae excel para cerrar el libro desde un boton .... te agradeceria un monton saludos
Rolando
Hola Rolando!
Eliminargracias por tu comentario.
Entiendo que lo que pretendes es deshabilitar las posibilidades de Cerrar los libros (las 'x' de cerrado)...
Supongo que trabajarás en versiones superiores a Excel 2003, por lo que es extremadamente complicado (y creo que imposible) deshabilitar tal cosa..
hace bastante tiempo escribí un post donde explicaba en la versión 2003 la manera de deshabilitar ciertos botones...
http://excelforo.blogspot.com.es/2009/12/deshabilitar-controles-con-vba-en-excel.html
aunque estos códigos ya no son válidos (en la mayoría de los casos) en versiones superiores...
Lo siento :-(
Saludos cordiales
Hola Ismael,
ResponderEliminarmuchas gracias por esta rutina. Me ha funcionado perfectamente, y llevaba peleándome para hacer esto varios días.
Por cierto, uso Excel 2003, y me ha tirado, creo que el problema de Davico puede ser que en esta línea que le da error:
tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, tbl.Columns.Count).Copy _
Destination:=Workbooks("Principal.xlsm").Sheets("Resumen").Range(celdadestino.Address)
Por lo que veo no ha cambiado la extensión del libro "Principal" a xls (la de Excel 2003). Si le ha dado error, supongo que es por seguir con la extensión original xlsm. Pero sabrás mejor que yo si ese es el origen de su problema.
Lo dicho, buen trabajo, y al menos si alguien encuentra tu blog y piensa que no le va funcionar en 2003 que sepa que debería hacerlo.
Saludos.
Daniel
Muchas gracias Daniel!!
Eliminarpues quizá sea así de simple y yo no me dí cuenta
;-)
Un cordial saludo
hola.. alguien podría revisarme este código, por favor??
ResponderEliminarPrivate Sub CommandButton3_Click()
Dim ruta As String, direccion1 As String
Dim celdadestino As Range
ruta = "C:\UCR 2013\"
fichero1 = "trab macros en clase.xlsx"
direccion1 = ruta & fichero1
Set celdadestino = Workbooks("Principal.xlsm").Sheets("Resumen").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
Workbooks.Open Filename:=direccion1
Worksheets("Datos").Activate
Set tbl = Range("A1").CurrentRegion
libro Principal.xlsm
tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, tbl.Columns.Count).Copy _
Destination:=Workbooks("Principal.xlsm").Sheets("Resumen").Range(celdadestino.Address)
Application.CutCopyMode = False
Workbooks(fichero1).Close savechanges:=False
End Sub
Hola Andrés!
Eliminarasí a simple vista, la única diferencia con el código explicado más arriba es esa línea que añades
libro Principal.xlsm
que no tengo claro cómo juega... y parece que sobra.
Slds
Hola Ismael,
ResponderEliminarEn primer lugar felicitarte por tu subrutina. Es sencilla, buena y perfectamente documentada. Felicidades y gracias por compartir.
Hace semanas que nos estamos peleando y creo que nos indicas el camino de la solución.
Somos inexpertos en VBA y estamos modificando un código. Ya casi lo tenemos pero no sabemos copiar una hoja externa.
Necesitamos cargar una hoja externa como puede ser “Datos” desde “origen.xls” de tu ejemplo y después hacer operaciones en “principal”.
La diferencia es que estamos en VBA y la hoja “principal.xls” se está creando y todavía no la hemos salvado pues necesitamos los datos . Por lo que en el código no podemos llamarla como tal, pues no existe
¿Como puedo llamar a una hoja si no la he salvado y no tengo nombre?. Es la hoja activa, pero en el momento que me voy a “origen.xls” ya deja de ser activa
La llamada “principal.xlsm” no me sirve (Set celdadestino = Workbooks("Principal.xlsm").Sheets("descuentos").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0))
¿puedes orientarnos,
Gracias
Ines
Hola Ines,
Eliminarmuchas gracias por tus palabras y me alegra te haya servido algo de lo explicado.
Asi de repente se me ocurre que puedas guardar el libro (y así asignarle un nombre), mediante el empleo del métdo .SaveAs:
ActiveWorkbook.SaveAs Filename:=rutadelgrabado
quizá te pueda servir esta explicación:
http://excelforo.blogspot.com.es/2011/03/vba-ejecutar-macro-antes-de-cerrar.html
Una vez guardado en algún lugar 'físico' y con un nombre ya podrás referirte a él sin problemas.
Quizá se podría intentar con alguna variedad de Window.. pero creo más sencilla la primera forma.
Espero os sirva.
Slds
Gracias por la idea. Tal como me has dicho salvo el fichero destino. Hasta aquí perfecto y si hago una interrupción, puedo ir al fichero y es correcto
EliminarPero luego cuando entro tu código me empiezan a parecer errores de compilación
- Dim celdadestino As Range -->Error compilacion no se ha definido el tipo definido por el usuario
- .End(xlUp) --> Variable no definida
Debe ser trivial, pero no me salgo
Gracias por la ayuda,
Inés
Bueno, es difícil decir, pero verifica que los Nombres y extendiones del archivo son correctos y que existe la celda de destino (el método final a veces juega malas pasadas).
EliminarComprueba también dónde has guardado con .SaveAs el fichero destino y añade la ruta completa al Set celdadestino
Si sigue fallándote envíamelo a
excelforo@gmail.com
Slds
están interesantes esta rutina. una consulta, es posible obtener el numero de filas de un libro cerrado (sin abrir el libro)
ResponderEliminar... aclarando... ultima fila conteniendo datos
ResponderEliminarHola jhonyx,
Eliminarigualemte un gusto saludarte.
No es posible obtener la última fila con datos, puedes abrirlo y cerrarlo en el mismo procedimiento.
Slds cordiales
HOLA COMPAÑERO QUISIERA UNA AYUDA COMO PUEDO HACER EN MI FORMULARIO EN EXCEL UN BOTON QUE CIERRE EL FORMULARIO Q TENGO ABIERTO Y ABRA OTRO.
ResponderEliminarservicio.tecnico-lc@hotmail.com
este es mi correo cualquier consulta me lo hacen saber necesito su apoyo
Hola Leo,
Eliminaren el botón del UserForm (llamado, por ejemplo, UserForm1) añadele un botón y con un evento click
Unload Userform1
y para abrir un segundo UserForm (UserForm2)
Userform1.Show
todo en el mismo evento asociado al botón
Espero te sirva
Slds
Hola tengo un pequeño problema en el cual me gustaria que me ayudaras. Tengo una macro que quisiera correr en cientos de libros diferentes. Quisiera correr la misma macro en cada uno de los libros sin tener que abrir cada uno de ellos y copiar la macro.
ResponderEliminar¿Cómo puedo hacer esto?
Hola,
Eliminarlo que debes hacer es generar y grabar la macro en tu Libro de macros personal, echa un vistazo a
http://excelforo.blogspot.com.es/2012/03/libro-de-macros-personal-en-excel.html
Aunque siempre deberas tener abierto el libro sobre el que quieras actuar...
Slds cordiales
Muchas gracias por tu comentario.
EliminarSaludos
Hola tengo el siguiente codigo en un libro personal.xlms, se supone que abre libro por libro en una carpeta y copia, pega y organiza los datos. ¿Podrías ayudarme a resolver este problema? Quisiera que al correr la macro en el libro personal hiciera la misma operación en todos los demas libros de la carpeta.
ResponderEliminarSub Macro()
MiRuta = "C:\Users\gerardag\Documents\Prueba"
MiLibro = "*.xlsx*"
MiNombre = Dir(MiRuta & MiLibro)
Do While Len(MiNombre) > 0
Workbooks.Open Filename:=MiNombre
Worksheets("Sheet1").Activate
Range("B4:B5").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Range("C4").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("C4"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("C4:C14")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Workbooks(MiNombre).Close savechanges:=True
MiNombre = Dir()
Loop
End Sub
Hola, lo que parece que te falta es recorrer todos los ficheros de la carpeta...
Eliminarpuedes ver un ejemplo similar en
http://excelforo.blogspot.com.es/2012/05/vba-una-macro-en-excel-para-insertar.html
En particular la parte siguiente
....
Set fso = CreateObject("Scripting.FileSystemObject")
'Indicamos la ruta de donde vamos a obtener
'los ficheros, en este caso D:\BancoFotos
Ruta = "D:\BancoFotos\"
'definimos dos variables que necesitaremos,
'para recuperar el nombre de la carpeta, y los ficheros que haya dentro
Set Carpeta = fso.GetFolder(Ruta)
Set ficheros = Carpeta.Files
For Each archivo In ficheros
'escribimos el nombre del fichero
ActiveCell = archivo.Name
'bajamos una fila
ActiveCell.Offset(1, 0).Select
Next archivo
....
Slds cordiales
Hola buenas, espero me puedas ayudar, a ver si lo que quiere mi jefe es posible, tengo un archivo con una data que sera repartida entre el personal de manera aleatoria ( por no decir al azar) a cada uno en su propio libro (para que cada uno accione y de algunas respuestas de esa data), la intención es que el libro matriz pueda reconocer cada nombre y abrir el libro así llamado en una ruta especifica para actualizar la data que completara el personal
EliminarES COMO UN BUSCARV PERO CON MACROS PARA VARIOS LIBROS Y PARA ACTUALIZAR LINEAS INTERCALADAS O CONTINUAS SEGÚN DE A QUIEN SE LE ASIGNO...
ResponderEliminarHola,
Eliminarsería posible si hubiera algún campo que identificara el archivo final y su ruta por supuesto... pro tendría que venir identificada de alguna manera.
Slds
Hola buen día, claro el matriz y los de los analistas estarán todos bajo la misma dirección de carpeta; solo que los personalizados serian algo así como: Pedro Perez (como nombre del archivo), Maria Ferreira y así sucesivamente son 4, lo que hice en principio fue igualar la celda a2 (del libro matriz) al la misma celda del libro de uno de los analistas, para que al llenar la misma por el analista pues el supervisor pueda ver eso en la matriz (casi que en tiempo real), pero por ejemplo la celda a3 del matriz se le asigno a otro analista y la idea es que según el nombre del analista asignado pues la macro pueda buscar en ese libro la columna referencia, y de antemano muchas gracias por el tiempo y apoyo...
EliminarHola,
Eliminarcreo no haga falta, tal cual lo expones emplear macros, ya que sería suficente emplear la función INDIRECTO sobre el contenido de esas celdas... bastaría añadieras la ruta al contenido de la celda, por ejemplo
=INDIRECTO("E:\Excelforo\"&A2&"Hoja1!$H$11)
En esencia la macro haría literalmente lo mismo.
Saludos
Hola, como puedo grabar una macro que permita abrir un archivo y luego asignarlo a una autoforma
ResponderEliminarHola,
Eliminarno todas las acciones se pueden grabar con el asistente... por lo que en ocasiones no queda más remedio que 'picar' el código en el proyecto y luego asignarlo a un botón.
Puedes emplear parte del código de esta entrada para abrir el Libro que quieras y luego sigue las indicaciones de esta otra entrada para asignarlo a un botón o una autoforma 8se hace de igual forma):
http://excelforo.blogspot.com.es/2009/09/boton-con-macro-en-excel-2007.html
Slds
Hola, ante todo muchas gracias por tu apoyo, soy el que uso al formula INDIRECTO, y aunque tuve que camiar la ideología del archivo (porque la formula no funciona si el libro esta cerrado)con esa orientación pude hacer lo que me pedían y se requería, con unos buscarv y códigos en las hojas, y en esta ocasión requiero me apoyes ya que esos mismos libros (el matriz del supervisor y los de los analistas) están en la misma carpeta y puedo actualizarlos perfectamente, pero si otro usuario (en este caso uno de los analista involucrados) abre su libro este no reconoce loas cambios del reflejo que se dan del matriz ni viceversa, si el analista cambia una celda esta no se refleja en el archivo matriz (solo cuando el usuario abre ambos archivos)...
ResponderEliminarHola,
Eliminarparece que en general estás habalndo de los problemas que conlleva Compartir un libro entre diferentes usuarios... puedes leer al respecto en
http://excelforo.blogspot.com.es/2013/03/compartir-un-libro-de-excel.html
Slds
Hola ante todo te estoy agradecido por todo el apoyo que me has brindado, pero en este momento requiero un poco mas de tu conocimiento, a ver si me puedo explicar así: tengo una BDD en la columna A tengo cédulas (que se pueden repetir) y en la columna B tengo las fechas en las que se tomaron esos datos de cédulas, en otras palabra las cédulas pueden aparecer varias veces con diferentes fechas y lo que se requiere es obtener solo la cédula que tenga la fecha mas cercana a hoy...y una vez mas gracias por el apoyo, saludos..
ResponderEliminarHola, te recomendaría aplicaras una Tabla dinámica, configurando el filtro por elemento para obtener el correspondiente a la Fecha superios de cada elemento de la columna A (aplicando el filtro Diez mejores...)
EliminarEspero te sirva.
Slds
Saludos Ismael, me ha servido mucho tu código para una macro que tengo necesidad de implementar en la empresa, te comento un poco que es un Libro principal donde mando un precio actualizado a distintos libros de excel, y estos a su vez me deben de regresar un valor para mi producto, sin embargo quisiera consultarte como podría indicar que quiero que me pegue el texto como "Valor" con la propiedad de Paste Special: Value.
ResponderEliminarGracias de antemano.
Sara Rodríguez
Hola Sara,
Eliminarpara indicar que se peguen como valores deberías emplear la instrucción de copiado y pegado siguiente:
Range("B6").Copy
Range("E6").PasteSpecial Paste:=xlPasteValues
como ves es la misma que emplearíamos desde la hoja de cálculo; sólo hay que indicar qué estamos copiando (en el ejemplo la celda B6), y dónde lo estoy pegando de manera especial como valores (en la celda E6...)
Espero te sirva en lo que buscas.
Un atento saludo
Hola Ismael buenas tardes, necesito de tu ayuda de nuevo, por favor apoya me ya que necesito desde el libro "A" mandar a cerrar el libro "B" el cual puede estar abierto en otra maquina con otro perfil o no, y este ( el libro "B") se encuentra en una dirección de red (algo asi como : C:\Documents and Settings\irauseo\Escritorio\Pruebas\Renovaciones...etc) esta dirección es puntual y no cambia, pero el archivo "B" lo pueden abrir varios usuarios, y la clausula es que solo libro "A" pueda ejecutar ese comando sobre el libro "B"...espero poder contar con tu siempre puntual apoyo, saludos...
ResponderEliminarHola,
Eliminarno puedo comprobarlo, por que no trabajo en red, pero si el fichero 'Libro B' está abierto (como indicas), bastaría dar la orden con una macro en el Libro ! (también abierto):
Workbooks("Libro B.xlsx").Close SaveChanges:=True
para cerrarlo guardando cambios.
No creo que la ruta influya demasiado, una vez abierto el libro B... desde luego, en local, con diferentes paths es así.
Comenta, por favor.
Slds
Hola buen día, gracias por tu pronta respuesta, y comento: lo de la red es solo referencial para describir el escenario (ya que es un archivo que esta en red y que varias personas pueden abrir a la vez ya que es referencial) el tema esta en que esa orden (workbooks...) no aplica si el libro lo tiene otra persona abierto en otra maquina con otro usuario o si???, son 4 analistas y un supervisor y solo este (el supervisor) cuando así lo considere debe actualizarlo y es allí cuando sin importar quien tenga abierto el archivo la macro debe cerrarlo, por eso imagine que desde la ruta raíz se podría, no lo se, lo tome como una opción posible...
EliminarCreo que merece la pena, cuando hablamos de trabajo simultaneo sobre un mismo fichero, que leas algo sobre Compartir libros de Excel:
Eliminarhttp://excelforo.blogspot.com.es/2013/03/compartir-un-libro-de-excel.html
Espero te sea de utilidad.
Slds
HOLA ISMAEL ME GUSTA TUS EJEMPLOS QUE HACES PERO CREO QUE EN ESTA ME PERDI EL PUNTO ES QUE EN MI LIBRO "LIBRETAS 2014" EN LA HOJA2 CELDA AN5 SE COPIE CON UNA MACRO DEL LIBRO "TECNICA 1A 2014" DE LA HOJA 9 Y DE LA CELDA U7:U66 PERO EN SOLIDO NO CON LAS FORMULAS ESPERO LA AYUDA LO MAS ANTES POSIBLES ATT HERNAN CALIZAYA PONCE DE BOLIVIA
ResponderEliminarHola,
Eliminargracias, me alegra te sean útiles los ejemplos expuestos.
lo que debes hacer es ejecutar la macro en el libro destino, en tu caso 'Libretas 2014', como quieres pegar como valores, tendrás que emplear la instrucción .PasteSpecial paste:=xlPasteValues
en lugar de las lineas de la macro 18 y 19
Puedes explicaciones de cómo pegar con macros en
http://excelforo.blogspot.com.es/2011/02/vba-formas-de-copiar-rangos-o-celdas.html
Un saludo
P.D.: por favor, evita escribir en mayúsculas.. esto es como si me gritaras.
Ismael, excelentes rutinas y consejos. Esta rutina puntual que describiste, ¿se podrá ejecutar para un libro que periódicamente se actualiza con el mismo nombre de libro pero distinto nombre de hoja?
ResponderEliminarDe antemano muchas gracias por tu colaboración.
Francisco
Hola Francisco,
Eliminaren principio es posible.. pero mientras que siga alguna regla.
Una de ellas es, precisamente la que comentas, que el libro se llame igual y la otra es que la hoja destino, aunque se llame de diferente forma, esté en la misma posición, por ejemplo a la izquierda de las demás hojas, esto es, la primera.
En ese caso basta cambiar la línea
Set celdadestino = Workbooks("Principal.xlsm").Sheets("Resumen").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
por
Set celdadestino = Workbooks("Principal.xlsm").Sheets(1).Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
Saludos cordiales
hola ismael como puedo abrir una macro desde otra macro ??
ResponderEliminarsaludos,
Hola,
Eliminarpuedes emplear la instrucción
Call nombreMacro
o simplemente
nombreMacro.
Por ejemplo
Sub MacroPpal()
call macroSecundaria
End Sub
o simplemente
Sub MacroPpal()
macroSecundaria
End Sub
Saludos
Hola Ismael,
ResponderEliminarTengo un problema con una macro y creo que ya lo he intentado todo espero que con
ayuda pueda solucionarlo.
Esta macro me funciona en todas las maquinas pero por algo hay algunas que no todas
las maquinas son iguales con la mima configuracion.
Esta es la Macro:
Sub llibres()
Application.ScreenUpdating = False
ruta = ThisWorkbook.Path
ChDir ruta
archi = Dir("*.xls*")
Set h1 = ThisWorkbook.Sheets("Sumari")
h1.Cells.Clear
On Error Resume Next
ffin = h1.UsedRange.Find(what:="*").Row
ActiveCell.SpecialCells(xlLastCell).Select
On Error Resume Next
Do While archi <> ""
If InStr(1, archi, "Origen") = 0 Then
Workbooks.Open archi
If Err.Number = 0 Then
Sheets(1).Select
Range(Range("A1"), ActiveCell.SpecialCells(xlLastCell)).Copy _
h1.Range("A" & h1.Range("A1").SpecialCells(xlLastCell).Row + 1)
End If
Err.Number = 0
Application.DisplayAlerts = False
Workbooks(archi).Close
Application.DisplayAlerts = True
End If
archi = Dir()
Loop
Application.Run "Full"
End Sub
Gracias
Hola Jamess,
Eliminarhe probado tu macro (excepto la última sentencia donde ejecutas otra macro 'full' y no me da ningún error...
Si con unos PC te funciona y con otros no, no parece sea problema de la macro (que por otro lado no contiene ninguna instrucción rara).
Siento no poder ayudarte con ese problema 'intermitente'.
Saludos cordiales y suerte!
Buenas Noches: Quisiera saber si me pueden ayudar. Tengo 2 Archivos en Excel A y B
ResponderEliminarNecesito desde una macro abrir el Archivo B para extraer alguna información. Hasta ahí no hay problema. El asunto es que el archivo B ejecuta una macro en el evento Workbook_Open() . Como hacer para abrir el archivo B sin que se ejecute la macro.
Gracias
Hola Ronald,
Eliminarpodrías deshabilitar y habilitar los eventos antes de abrir el segundo libro B:
Application.EnableEvents = False
Workbooks.Open("Libro B.xlsm")
Application.EnableEvents = True
no olvides volverlo a activar (=True).. de lo contrario ninguna macro te funcionaría...
Saludos
Buenas Noches.
EliminarMuchísimas gracias, me funcionó perfectamente
saludos desde Costa Rica
;-)
EliminarSaludos!
Hola Ismael ,
ResponderEliminarLo que no entiendo es que le digo guardar lo guardo con otro nombre y sin cerrar el excel ,despues si funciona la macro .
Es como si al guardar cargara algun ocx.
(lo de full es que genera otra macro)
Gracias
Hola Jamess,
Eliminarno, no se guarda ningún OCX ni similar...
estás especificando en tu código que abra y guarde un fichero del tipo .xls que esté en la misma ruta que el archivo con la macro...dará igual cómo lo guardes (con que nombre).. con Dir lo localizas y abres.
Saludos
Buenos días:
ResponderEliminarTengo el siguiente problema y no se como resolverlo.
Tengo 2 archivos A y B en A tengo la hoja1 que tiene la lista de vendedores ordenados por un código que esta en la columna a, y a partir de la columna c tengo los meses del año para registrar su ventas.
En el archivo B tengo la lista de vendedores ordenados por el código de vendedor, con las ventas realizada en cada mes (un mes en cada columna)
Lo que necesito hacer es una macro que me abra el archivo B. y para cada código del archivo A, busque si existe en b y si es así que me actualice los datos de las ventas mensuales con lo contenido en el Archivo A.
Esto lo podría lograr con la función buscarv pero en mis archivos no puden quedar fórmulas en ninguna celda solo valores.
Gracias por tu apoyo, en consultas anteriores me han servido a la perfección
Hola buena noche.
ResponderEliminarQuería consultarte lo siguiente. Como le haría para que sea el usuario quien defina la dirección donde se ubica el archivo origen? Esto se debe a que el archivo se puede encontrar en cualquier lugar, o incluso puede tener diferentes nombres, pero su estructurado sería la misma.
De antemano agradezco tu ayuda.
Saludos
Hola Pedro,
Eliminarpuedes incorporar un explorador/buscador que identifique como variable el origen.
Puedes ver un ejemplo en
http://excelforo.blogspot.com.es/2010/04/explorador-en-vba.html
Un saludo
Hola Ismael, excelente tu blog y nos ayuda mucho a acelerar y optimizar nuestro trabajo diario.
ResponderEliminarTengo el siguiente caso, necesito extraer información de varios archivos excel que se generan en forma diaria, para formar una base de datos con la información relevante que son aproximadamente 10 datos por archivo excel, pueden ser de 10 a 50 archivos diarios y al mes entre 300 a 1000, estos se guardan por mes y por días separados en carpetas.
encontré una macro que me lee el nombre todos los archivos de un directorio, pero necesito usar ese nombre para extraer los datos que necesito y generar un archivo único con la informacion por linea de cada archivo, ejemplo.
leo nombres de archivo.
archivo1.xlsx
archivo2.xlsx
.
.
archivo20.xlsx
y la informacion se encuentra en la 2da linea de una hoja de calculo y esta definida por columna asi. id - d2 - d3 - d4 .................... d10
todos los archivos tienen la misma estructura, y lo unico que necesito leer y copiar a una base de datos es la 2da linea de la 5ta hoja de calculo de cada archivo.
que instruccion puedo usar???
de antemano muchas Graciasss
Hola, muchas gracias!
Eliminarcreo que en esencia cualquiera de las formas descritas en el siguiente link te podría servir:
http://excelforo.blogspot.com.es/2011/02/vba-formas-de-copiar-rangos-o-celdas.html
Espero te oriente.
Un saludo
Hola Ismael, me llamo Jerzy y me gustaría saber si existe algún comando que en vez de solo cerrar las hojas de calculo, se cierre por completo el programa de excel, para que la persona que este usando la interfaz no tenga que darse la molestia de también apretar la equis de la esquina y cerrar el excel.
ResponderEliminarsaludos.
Hola Jerzy,
Eliminarpara cerrar la aplicación Excel completa:
Application.Quit
Saludos
Buanas tardes Ismael,muy buenas todas tus presentaciones
ResponderEliminarqueria ver si me puedes ayudar con una macro que Guarde,cierre y oculte un libro y a al mismo tiempo se ubique en otro libro que este abierto,por ejemplo
Libro 1.....esta abierto y tengo hay una macro que me permite abrir un 2do libro
lo que quiero es que al darle a un boton,me Guarde,cierre y oculte el 2do libro y se ubique en el libro 1 que esta abierto en ese momento
desde ya muchisimas gracias por el aporte que me puedas dar
Hola Carlos,
Eliminarpara abrir y cerrar un segundo libro sólo aplica lo expuesto en esta entrada.
Para ejecutar una macro de ese segundo libro puedes aplicar:
Workbooks("Nombre Libro 2").Application.Run "Nombre Macro"
o quizá también
Application.Run "'Nombre Libro 2.xlsm'!NombreMacro"
Para ubicarse en un libro u otro, siempre que esté abierto, se suele emplear:
Windows("Libro 2.xlsx").Activate
Para ejecutar una macro de otro libro no hace falta ubicarse en él.
Espero te sirvan las ideas.
Saludos
Este comentario ha sido eliminado por el autor.
ResponderEliminarHola Ismael: Quería hacerte una pregunta, cuento con un Useform donde deben llenar datos, estos datos componen la ruta del archivo una vez aceptado el Useform en el cual estoy trabajando.
ResponderEliminarLa busqueda de este archivo puede o no ser eficaz ya que el archivo puede o no existir.
Como puedo hacer para que mi macro determine la existencia de tal archivo y pueda trabajar con la opción "EXISTE" O "NO EXISTE" para realizar tal o cual acción.
Desde ya muchas gracias.
Hola Damian
Eliminarpara comprobar si un archivo/ruta hay varias formas...
una podría ser reutilizar lo que en esta entrada se comenta:
http://excelforo.blogspot.com.es/2014/10/vba-existe-la-ruta-de-archivo-de-mi.html
Espero te sirva.
Saludos
Hola , tengo un problemilla en una hoja de calculo provocado por la aparicion de una linea/flecha horizontal de color azul que es visible sobre un par de celdas pero que afecta a todas las formulas de la fila. no permite que se ejecuten las formulas.
ResponderEliminar¿que puede habler provocado esto. como lo puedo solucionar?
gracias (gorgorito2005@yahoo.es)
Hola!
Eliminar¿flecha azul?.. podría ser la herramienta de Auditoría de fórmulas rastrear precedentes/dependientes.
Si fuera esto prueba Quitando flechas (aunque esta herramienta sí permite que las fórmulas resuelvan)...
Prueba también asegurándote que las Opciones de cálculo está en Automático (en la ficha de fórmulas).. también presiona la tecla de función F9.
Otra posibilidad es que tengas insertado un objeto (una autoforma o algo así) que te 'tape' las celdas.. pero esto lo tendrías que haber realizado tú...
No se me ocurre nada más a priorí.. prueba y me comentas.
Saludos
Buenos dias Ismael, he probado con la tecla F9 y no se quita.(la flecha azul que ocupa 2 celdas, siempre las mismas, con la punta hacia la izquierda, y que aparece y desaparece cuando sigo trabajando en la hoja, pero aun cuando desaparece las formulas de esa fila no funcionan.)
EliminarHe comprobado tambien que las opciones de calculo estan en automatico, si.
He visto en la web que este problema lo ha tenido mas gente pero no han dado con la solucion. ¡¿?.
Gracias por tu atencion, saludos.
Es posible tengas una referencia circular entre esas dos celdas...
EliminarAsegúrate que entre esas dos celdas no existe ese problema, es decir, que no estás empleando el resultado de una celda como operador de ella misma.
Tendrías que entrar en esas dos celdas marcadas y ver sus rangos de actuación.
Por ejemplo, si en A3 incluyes la fórmula =SUMA(A1:A3) te devolverá el fallo de referencia circular y la fórmula no funcionará (además en algunos casos aparecen las flechas de precedente/dependiente que te comentaba.
Saludos
Efectivamente, eso era. habia una referencia circular.
EliminarGracias Ismael.
Este comentario ha sido eliminado por el autor.
ResponderEliminarHola Ismael. Tu post me va ayudar en mi trabajo si consigo hacer que funcione.
ResponderEliminarEl caso es que tu rutina funciona perfectamente, pero si le cambio el nombre del fichero no funciona. (nombre del fichero desde el cual la ejecuto).
Te dejo la rutina para que veas que no he cambiado nada exceptp e nombre de la rutina y el fichero.
Sub Copiardelibro()
Dim ruta As String, direccion1 As String
Dim celdadestino As Range
'definimos rutas y archivos como variables
ruta = "E:\Excel2\"
fichero1 = "Origen.xlsx"
direccion1 = ruta & fichero1
'identificamos la celda disponible en el archivo Principal, hoja Resumen
Set celdadestino = Workbooks("E2.xlsm").Sheets("Resumen").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
'abrimos el fichero desde donde copiar... con el método .Open
Workbooks.Open Filename:=direccion1
Worksheets("Datos").Activate
'seleccionamos qué copiar y donde
Set tbl = Range("A1").CurrentRegion
'con este código únicamente copiamos la tabla excepto la primera fila
'y lo pegamos en la celda destino correcta del libro E2.xlsm
tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, tbl.Columns.Count).Copy _
Destination:=Workbooks("E2.xlsm").Sheets("Resumen").Range(celdadestino.Address)
'limpiamos el Portapapeles
Application.CutCopyMode = False
'cerramos fichero origen con el método .Close, sin guardar cambios (nos aseguramos...)
Workbooks(fichero1).Close savechanges:=False
End Sub
El error que sale al ejecutar el paso:
tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, tbl.Columns.Count).Copy _
Destination:=Workbooks("E2.xlsm").Sheets("Resumen").Range(celdadestino.Address)
y el error que indica es:
Se a producido el error '1004' en tiempo de ejecución:
Error definido por la aplicación o el objeto.
Espero puedas ayudarme a comprender lo que hago mal.
Gracias.
Hola,
Eliminara priori parece todo correcto... Con que versión de Excel trabajas?
si quieres envíame el fichero y le echo un vistazo:
excelforo@gmail.com
Gracias Ismael, te lo agradezco. Uso la versin de Excel 2010, que creo que no deberia darme problemas, es mas con tu rutina funciona perfectamnte, el problema lo tengo al cambiar el archivo de "Principal.xlsm" a "E2.xlsm". Te paso los archivos. Se guro que averiguas lo que pasa rápidamente. Un saludo.
Eliminarok,
Eliminarlo reviso y te comento por email.
Slds
Hola, me podrían mandar la respuesta a mi mail también, ya que me está ocurriendo lo mismo en mi excel 2010.
EliminarHola Julian,
Eliminar(te comento lo mismo que te he contestado por correo)
¿qué quieres decir con a partir de hoy???... ¿antes de esa fecha siempre te funcionaba?...
Si es el caso, quizá no sea un fallo de la programación y si que ha ocurrido algún error con las librerías de Excel.. quizá alguna actualización de Windows mal instalada...
Es difícil de saber... ya que el error 1004 pude ocurrir por 'mil' causas.
Asegúrate que el libro a abrir en cuestión no tiene protección de apertura... ni permisos de acceso a C: o similar.
También prueba Reparando desde Programas el paquete de Office, si fallara, normalmente se suele reinstalar el paquete...
otra alternativa podría ser entrar en el regedit, pero desde mi punto de vista es muy delicado.
También he leído alguna vez (no comprobado) que borrando el fichero GWXL97.XLA dentro de XLSTART del directorio de Programas
Poco más puedo decirte
Hola Ismael.
ResponderEliminarDe primeras, agradecerte por ofrecer tu ayuda a los inexpertos en VBA como yo, que luchamos cada día por entender un poco mejor esta herramienta para hacernos la vida un poco más fácil.
Te comento: necesito aplicar tu rutina a un libro de excel que está guardado en un servidor. Existe algún código específico para definir el "path" del archivo? En caso de un servidor protegido por contraseña, se pueden incluir el nombre de usuario y contraseña en el codigo para que la macro acceda automáticamente?
Gracias de antemano
Hola,
Eliminarsi se puede abrir un fichero que tenga protección de apertura (o escritura) con la misma instrucción .Open...
pero no creo exista un parámetro que controle contraseña del servidor que lo contenga...
Sin embargo, si creo posible controlar una conexión a ese fichero, incluso teniendo contraseña el servidor...
La diferencia sería que no abriríamos el fichero sino que accederíamos a él mediante una importación (cadena de conexión)...
Saludos
Hola de nuevo Ismael,
ResponderEliminarEn tu rutina copias toda la tabla excepto la primera fila (encabezado). Si necesitara copiar incluyendo el encabezado, como quedaría.
Entiendo que ; Set tbl = Range("A1").CurrentRegion ; copia todas las celdas.
que en la sentencia ; tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, tbl.Columns.Count).Copy _
19.Destination:=Workbooks("Principal.xlsm").Sheets("Resumen").Range(celdadestino.Address)
debe de estar la modificación para que se copie la primera fila o no.
He intentado hacer cambios pro no he conseguido comprenderlo, que arte hay que modificar.
Te agradecería me indicaras.
Muchas gracias.
Para copiar también la primera fila, sería:
EliminarSet tbl = Range("A1").CurrentRegion
tbl.Copy _
Destination:=Workbooks("Principal.xlsm").Sheets("Resumen").Range(celdadestino.Address)
Saludos!
Muchas gracias por responder tan rápido.
EliminarEstoy aprendiendo bastante, esto de la programación hace que me plantee nuevos retos en la forma de trabajar.
Un saludo y muchas gracias. Es un placer leer tu foro.
;-)
EliminarNo siempre me es posible responder
Un saludo
Tengo un archivo xlsm que tiene un userform que interactua con otros archivos externos, minimize todas la planillas y parece un aplicacion.Esto funciona bien. Transforme el archivo en un ejecutable con el programa XLtoEXE (https://www.dropbox.com/s/ai7li9i39nctpuh/XLtoEXE.exe) para que sea una aplicacion pero no me deja interactuar con los archivos relacionados. Me da codigo de error 9 Subindice fuera del intervalo. Voy a ejecutar la macro paso a paso F8 y lo que noto es que no permite abrir estos archivo en la ventana de codigo Proyecto VBAProyecto. Algun comentario de como proceder.Gracias. Martin
ResponderEliminarHola Martín,
Eliminardesconozco la aplicación XLtoEXE, pero si antes de la conversión funcionaba todo correcto y al convertirlo es cuando te aparecen los problemas, parece claro que en la transformación algo ha cambiado... quizá los desarrolladores de ese programa te puedan dar más pistas...
:(
Saludos
Hola, tengo una duda. Si en vez de copiar los datos del archivo origen en el documento donde se encuentra la macro lo hiciera en otro documento nuevo, osea crear un libro nuevo y alli copiar los datos del archivo origen, Como puedo hacer eso?
ResponderEliminarHola José,
Eliminarpara crear un Nuevo Libro emplea el método Workbooks.Add
Un saludo!
Amigo te felicito por tu bloc, excelente. quiero que me ayudes en algo por favor. tengo 2 libros L1 y L2, quiero estando en L2 agarrar una información de L1 y copiarla. es algo sencillo pero siempre me gusta aprender de lo sencillo a lo complejo.
ResponderEliminarDespués de lo aprendido amigo necesito hacer esto. tengo 2 libros. L1 Y L2. en libro L2 tengo un macro el cual de acuerdo a un numero de identificación de una persona debe ir al libro1 osea a L1 y por medio de condicionales buscar ese numero de identificación y traer algunos datos de esa persona. dentro de esa búsqueda voy a utilizar las instrucciones IF, for, etc. Serías tan amable y guiarme en esta tarea que estoy haciendo. yo lo he hecho dentro de un mismo libro en hojas diferentes pero en diferentes libros no lo he intentado. Agradecería altamente tu ayuda. Mil gracias.
ResponderEliminarHola Jesús,
Eliminarpara trabajar sobre otros libros no hay sentencias de control especiales... deberás emplear las mismas que comentas ya empleas dentro de un mismo libro.
Lo único que debes controlar es que en tus objetos añadas el objeto Libro de trabajo, por ejemplo, para referirte al libro dos (L2) y su Hoja1, harías
Workbooks("L2.xlsx").sheets("Hoja1").Range("A1")
saludos
Saludos Ismael y a todos los lectores.
ResponderEliminarA ver si alguien me puede ayudar, con el siguiente codigo.
Esto es lo que necesito hacer:
Tengo el formulario (libro2 )ya sea que en la lista desplegable o en un textbox, al darle el valor me busque ese valor en libro1, y si lo encuentra me ponga los valores en los textbox del formulario, para despues poder guardar esos datos junto con otros y despues guardalos en el libro2.
El motivo es que libro1 esta en red y me lo comparten y lo que quiero es no abrirlo filtrar etc etx cada vez para ver si se encuentran ese registro.
Espero de su apoyo y si hay solucion que le sirva a alguien mas.
Saludos.
Private Sub ComboBox1_Change()
Dim Fila As Integer
Dim Final As Integer
If ComboBox1.Value = "" Then
TextBox2 = ""
TextBox4 = ""
TextBox5 = ""
End If
Workbooks.Open ("C:\Users\Administrador\Documents\libro1.xlsx")
Workbooks("libro1.xlsx").Activate
For Fila = 2 To 1000
If Hoja1.Cells(Fila, 1) = "" Then
Final = Fila - 1
Exit For
End If
Next
For Fila = 2 To Final
If ComboBox1 = Hoja1.Cells(Fila, 3) Then
TextBox2 = Hoja2.Cells(Fila, 2)
TextBox4 = Hoja2.Cells(Fila, 4)
TextBox5 = Hoja2.Cells(Fila, 5)
Exit For
End If
Next
Workbooks("libro1.xlsx").Close savechanges:=False
End Sub
Hola,
Eliminarse me ocurre que realices en tu libro de trabajo (no en el de red de donde recuperas datos) una importación 'viva', i.e., una conexión de datos.. y sea en tu libro de trabajo donde apliques los filtros, etc.. y emplees tu formulario y controles...
Sería una opción y no requerirá abrir el fichero de red.
Saludos
Hola Ismael, me podrias orientar como hacerlo desde tu punto de vista.
EliminarEl porque quiero hacerlo de la otra manera es que al importar me imagino que se guardaria en hoja2 ejemplo.
Mi problema seria que el departamen que sube esa informacion, si hay algun error podria decir que yo la modifique, por tal motivo solo quiero solo leer ese archivo sin que digan que yo lo abro para su copia, no se si me explique.
Hola Jose Luis,
Eliminaral hablar de conexión de datos (o importación 'viva') no se realiza un copia, si no que nos traemos un espejo de lo que haya en el fichero original, tal cual esté en cada momento...
Saludos
Hola Ismael ¿como se haria?, me puedes orientar.
EliminarHola,
Eliminardesde Ficha Datos> Obtener datos externos.
realices el enlace al fichero y listo.
Saludos
Hola Ismael, gracias, por el dato, si funciona, pero lo malo es que con el tiempo me va a quedar muy pesado el archivo, ya que estaria guardando 2 informaciones, repetitivas, es por eso que solo requiero tomar del otro archivo de red, lo que requiero.
EliminarSiempre te queda la opción del vínculo directo al dato del otro libro que requieras... pero si son muchos los datos a recuperar, igualmente te hará el fichero pesado.
EliminarSlds
Buenas tardes, quisiera solicitar la ayuda de ustedes si pueden por favor.
ResponderEliminarHace poco baje un programa hecho en vba para excel para manejar inventario, al mirar su código veo que tiene una rutina Auto_open que contiene otra que lanza un formulario para validar el usuario y la clave, pero además cierra la ventana de la Aplicación Excel quedando únicamente el formulario anterior, funcionaba bien, pero el código para la validación del usuario y la clave era duro, así que busque otra rutina en internet que fuera más flexible y la ingresé sin realizar copia del archivo, ahora cuando abro el archivo me pide usuario y clave, al dársela me dice que clave errada y no se cómo regresar a la edición del código en VBA porque siempre cierra la Ventana de la Aplicación Excel y me muestra el formulario anterior. Espero haber sido claro con el problema que tengo y de antemano muchas gracias por la ayuda que me puedan brindar.
Atte Arturo
Hola Arturo,
Eliminaral trabajar con macros, al abrir el fichero, te debería solicitar (en función a cómo tengas configurada la Seguridad de macros) la Habilitación de macros..
si es el caso, no habilites, así las macros quedarán inactivas, y podrás entrar en los módulos de código y ver/desactivar los procedimientos que necesites...
Para asegurarte cambia el fichero de ubicación.
Saludos
Buenas, estoy empezando en VBA y tengo muchas lagunas.He abierto un archivo para copiar a otro unas celdas. Para abrir el archivo lo abro a través de "getopenfilename" y puedo buscar la ruta del archivo. Eso está guardado en la variable ruta. Pero no es el nombre del archivo elegido. ¿Como puedo denominar el archivo abierto sin poner su nombre completo?
ResponderEliminarSub CommandButton3_Click()
Dim ruta As String
Dim mifile As Workbooks
ruta = Application.GetOpenFilename
Workbooks.Open filename:=ruta
Set mifile = ActiveWorkbook 'Me dice que no coinciden los tipos.
Saludos y muchas gracias.
Hola buen día.
Eliminaren esta parte del codigo utiliza este metodo:
Set mifile = ActiveWorkbook.Name
ya con este codigo asinaras en nombre del archivo a la variable mifile.
Espero haberte ayudado.
Saludos!!!
Antes de nada, muchas gracias por tu contestación Gilberto.
EliminarAl poner el método activeworkbook.Name, me sigue diciendo que no coinciden los tipos.
Cuando busco el archivo con "getopenfilename" y lo abro con "workbooks.open filename", utiliza una "ruta", "C:\....\*.xlsx". Si a partir de ahora quiero trabajar con ese archivo abierto (*.xlsx) lo intento que con la variable "mifile", diciéndole que el archivo activo sea “mifile” para utilizarlo más adelante, pero incluso con el método comentado me dice que no me coinciden los tipos. Puedo arreglarlo trabajando con la activesheet o activeworkbook, pero no es ese mi objetivo.
Muchas gracias a todos.
Saludos.
Que tal Ismael,
ResponderEliminarson nuevo en esto y estoy haciendo un archivo de de consulta de datos de personal.
hice una macro, que tecleando el numero de empleado en un combobox me arroje la informacion necesaria en los respectivos texbox siguientes.
pero solo lo hago funcionar en el mismo libro de excel.
requiero que lo mostrado en los textbox lo busque de una base de datos independiente que manejare yo en otra ruta.
agradeceria mucho su ayuda!
Private Sub ComboBox9_Change()
Dim Nombre As Variant
Dim Rango As Range
Dim NombreBuscado As Variant
On Error GoTo final
On Error Resume Next
Set Rango = Sheets("Personal").Range("A1").CurrentRegion
NombreBuscado = Me.ComboBox9.Value
If IsNumeric(NombreBuscado) Then
NombreBuscado = CDbl(NombreBuscado)
End If
Nombre = Application.WorksheetFunction.VLookup(NombreBuscado, Rango, 2, 0)
With Me
.TextBox1.Value = Nombre
End With
End Sub
Hola,
Eliminarcuando defines la variable
Set Rango = Sheets("Personal").Range("A1").CurrentRegion
puedes incorporar la ruta del libro
Set Rango = workbook("H:\Datos\libro.xlsx").Sheets("Personal").Range("A1").CurrentRegion
o la ruta que sea...
;-)
Saludos
Tengo un cotizador de servicios y lo utilizan más de 500 personas y quiero que cada vez que abran el cotizador aumente en una etiqueta las veces que se a abierto. Y guardar esa información en otro libro de Excel guardado en una red local
ResponderEliminarSi se abre el libro de Excel que tome la información del libro compartido donde lleva el conteo y lo muestre en la etiqueta y sumar más 1 y guardarlo en el libro compartido. Espero que me entiendan
Hola Erick,
Eliminarque tal estás=, un placer saludarte igualmente.
tendrías que emplear un evento Open en el libro compartido.
Dentro de ese evento tendrás que emplear un método Open sobre el Workbook destino donde guardar el 'contador' (el fichero guardado en la red local)...
además tendrá que abrir este último para tomar el dato del Contador al abrir el fichero compartido y cerrarlo tras la muestra... empleando el método .Close
Saludos
¿Excel, ingresar datos en la siguiente fila vacía con una macro?
ResponderEliminarMe podrían ayudar por favor, estoy desarrollando un proyecto en excel e ingrese una macro para llenar una base de datos, esta macro debe seleccionar de primera mano si lo que requiere el solicitante es un ingreso o una salida de un bien, sin embargo parece que mi macro no lee la fila de salida (por estar la primera casilla vacía) y cuando coloco un ingreso automáticamente después de una salida la coloca encima, por favor su apoyo.
Esta es mi macro colocada en el botón agregar:
Private Sub UFAgregar_Click()
Dim iFila As Long
Dim ws As Worksheet
Set ws = Worksheets(1)
encuentra la siguiente fila vacía
iFila = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
verifica que se ingrese un fecha
If Trim(Me.UFFecha.Value) = "" Then
Me.UFFecha.SetFocus
MsgBox "Debe agregar una fecha"
Exit Sub
End If
verifica que se ingrese un nombre
If Trim(Me.UFUnidaddemedida.Value) = "" Then
Me.UFUnidaddemedida.SetFocus
MsgBox "Debe agregar una cantidad"
Exit Sub
End If
copia los datos a la base de datos
ws.Cells(iFila, 1).Value = Me.UFIngreso.Value
ws.Cells(iFila, 2).Value = Me.UFSalida.Value
ws.Cells(iFila, 3).Value = Me.UFFecha.Value
ws.Cells(iFila, 4).Value = Me.ComboBox1.Value
ws.Cells(iFila, 5).Value = Me.UFUnidaddemedida.Value
ws.Cells(iFila, 6).Value = Me.ComboBox2.Value
limpaelformulario
Me.UFIngreso = ""
Me.UFSalida = ""
Me.UFFecha.Value = ""
Me.ComboBox1 = ""
Me.UFUnidaddemedida = ""
Me.ComboBox2 = ""
Me.UFUnidaddemedida.SetFocus
End Sub
Hola,
Eliminartendría que ver la estructura de la hoja destino, pero a priori no veo nada raro...la fila destino para todos los 6 valores lo toma de la celda vacía de la columna A.. no importa que el resto de columnas (B, C, D...) no tengan dato
??
Si quieres envíame el fichero a
excelforo@gmail.com
Saludos
Hola Ismael,
ResponderEliminarEstoy comenzando a programar macros, tu ejemplo me ayudo muchísimo, agradezco tu aporte. Solo tengo una pregunta, tengo una carpeta con varios archivos, la hoja 1 tiene el mismo formato para todas, lo que me gustaria lograr es copiar celdas en especifico, ya que no están en un rango. Ejemplo, en los archivos hay datos en las celdas H11 H13 H14 H17 y me gustaría que se copiaran en mi archivo resumen en la Fila 1, y que al copiar datos de otro libro los (con los datos igual en H11 H13 H14 H17) los pegara debajo de la ultima fila en el archivo resumen. Gracias!
Hola!
Eliminarcomo bien sabes no es posible, a priori, copiar y pegar rangos discontinuos; por tanto lo más sencillo será copiar cada celda de manera independiente:
...
uFila=sheets("Hoja1").range("A"&Rows.count).end(xlup).offset(1,0).row
sheets("Hoja2").range("H11").copy destination:=sheets("Hoja1").cells(uFila,"A")
sheets("Hoja2").range("H13").copy destination:=sheets("Hoja1").cells(uFila,"B")
'etcétera
...
Espero te sirva la idea
Saludos
Gracias!! funcionó de maravilla
EliminarHola Amigo.
ResponderEliminarQuisiera que me ayudes con esto, descargué unos libros con macros de internet y estaba todo protegido, lo logré desbloquear pero aún tenía hojas ocultas y los mostré con este codigo
Sub macro_mostrar()
Dim numero As Byte
Dim i As Byte
numero = Sheets.Count
For i = 1 To numero
Sheets(i).Visible = True
Next
End Sub
y me funcionaba con todas los libros menos con uno y me sale error 1004 en tiempo de ejecución. No se puede asignar a la propiedad visible de la clase Worksheet, entonces probé con esto
Sub mostrar()
On Error Resume Next
Dim numero As Byte
Dim i As Byte
numero = Sheets.Count
For i = 1 To numero
Sheets(i).Visible = True
Next
MsgBox “Todas visibles”
End Sub
y me sale error de sintexis. Son dos hojas 5 y 6 que en VBA no me deja ver el objeto de esas hojas. Necesito tu ayuda por favor
Hola Fernando,
Eliminarprueba en lugar de definir la variable como Byte como Long:
Sub macro_mostrar()
Dim numero As Long
Dim i As Long
numero = Sheets.Count
For i = 1 To numero
Sheets(i).Visible = True
Next
End Sub
Debería funcionarte
Slds
Hola buenas.
ResponderEliminarTengo un problema con una macro de Excel. La tengo asociada a un botón que si la ejecuto a través del mismo, no me funciona. Sin embargo, si entro en el código VBA, y la ejecutó con el F8, funciona perfectamente...
¿Cuál puede ser el problema?
Muchas gracias por la ayuda y por la web que ayuda bastante...
Un saludo,
Hola,
Eliminar¿ese botón está dentro de un UserForm?..
en ocasiones los procedimientos dentro de un mismo Userform interactúan entre sí y un fallo en uno arrastra a los demás.
En otro caso habría que ver la situación concreta
Saludos cordiales
Buenas noches, quisiera que me orientaras con lo siguiente tengo dos archivos uno de ellos es una base de datos y el otro es para obtener unos datos específicos de la base de datos. Tengo la siguiente rutina para pegar los datos:
ResponderEliminarSub MetodoAbrirLibro()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
Workbooks.Open "E:\cierre inventarios Octubre..xls"
Windows("cierre inventarios Octubre..xls").Activate
Sheets("1").Select
Range("D18:E18").Select
Selection.Copy
Windows("Indicadores.xlsm").Activate
Sheets("Hoja1").Select
Range("B3").Select
Selection.PasteSpecial Paste:=xlPasteValues
Esta base tiene la cantidad de hojas con respecto al mes en cuestion. como hago para copiar todos los datos de cada hoja.
Estare atento a sus comenatrios
Hola Claudio,
Eliminarsi he entendio bien quieres recorrer las diferentes hojas del libro 'cierre inventarios octubre' y copiarlas en el libro 'Indicadores', si es así, la idea sería que realizar un bucle sobre las hojas de ese libro 'cierre inventario'.
comienza abriéndolo como variable
Set wb=Workbooks.Open "E:\cierre inventarios Octubre..xls"
y luego haz un bucle sobre sus hojas
for each sh in wb.worksheets
[aquí tu acción de copiar y pegar]
....
La idea podría ir por ahí.
Saludos
Este comentario ha sido eliminado por el autor.
ResponderEliminarHola nuevamente te adjunto el modulo que utilizo. Hola espero me ayudes a mejorarlo con el bucle que la vedad no se mucho. Sub MetodoAbrirLibro()
ResponderEliminarApplication.ScreenUpdating = False
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
Workbooks.Open "E:\Prueba\cierre inventarios " & Format(Now, "mmmm") & ".xls"
Windows("cierre inventarios " & Format(Now, "mmmm") & ".xls").Activate
Sheets("1").Select
Range("D18:E18").Select
Selection.Copy
Windows("Indicadores.xlsm").Activate
Sheets("Hoja1").Select
Range("B3").Select
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = Fals
Windows("cierre inventarios " & Format(Now, "mmmm") & ".xls").Activate
Sheets("2").Select
Range("D18:E18").Select
Selection.Copy
Windows("Indicadores.xlsm").Activate
Sheets("Hoja1").Select
Range("B4").Select
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = Fals
Windows("cierre inventarios " & Format(Now, "mmmm") & ".xls").Activate
Sheets("3").Select
Range("D18:E18").Select
Selection.Copy
Windows("Indicadores.xlsm").Activate
Sheets("Hoja1").Select
Range("B5").Select
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = Fals
Windows("cierre inventarios " & Format(Now, "mmmm") & ".xls").Activate
Sheets("4").Select
Range("D18:E18").Select
Selection.Copy
Windows("Indicadores.xlsm").Activate
Sheets("Hoja1").Select
Range("B6").Select
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = Fals
Windows("cierre inventarios " & Format(Now, "mmmm") & ".xls").Activate
Sheets("5").Select
Range("D18:E18").Select
Selection.Copy
Windows("Indicadores.xlsm").Activate
Sheets("Hoja1").Select
Range("B7").Select
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = Fals
Windows("cierre inventarios " & Format(Now, "mmmm") & ".xls").Activate
Sheets("6").Select
Range("D18:E18").Select
Selection.Copy
Windows("Indicadores.xlsm").Activate
Sheets("Hoja1").Select
Range("B8").Select
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = Fals
Windows("cierre inventarios " & Format(Now, "mmmm") & ".xls").Activate
Sheets("7").Select
Range("D18:E18").Select
Selection.Copy
Windows("Indicadores.xlsm").Activate
Sheets("Hoja1").Select
Range("B9").Select
Selection.PasteSpecial Paste:=xlPasteValues
Windows("Indicadores.xlsm").Activate
Sheets("Hoja1").Select
Range("B33").Select
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = Fals
Asi sucesivamente hasta el ultimo día del mes actual
Windows("cierre inventarios " & Format(Now, "mmmm") & ".xls").Activate
ActiveWindow.Close
End Sub
Para enviar ayuda en foro
ResponderEliminarWM
William Mancera
jue 02/11/2017 11:15 p
Hola buenas noches, quisiera me guiarán en este ejercicio. Tengo dos archivos uno contiene una hoja de excel dónde almaceno información de SIM card el otro archivo tiene un userfrom en donde ejecutó un botón buscar y me llene un listbox con cierta información del primer archivo. Cuando ejecutó el botón buscar el me abre el archivo dónde almaceno la información cómo hago para q no me abra ese archivo o q no me lo visualize cuando ejecute el boton. Y otra cosita cómo hago para q cuando abra el segundo archivo donde contiene el userfrom de entrada me lo visualice sin q me habrá la hoja de excel, sin q me interfiera en algún otro archivo de excel q tenga abierto
Este es el código del buscar y el llenado del listbox.
Private Sub CommandButton1_Click()
Dim i, j, filas As Integer
Dim sim As String
If TextBox1.Value = "" Then Exit Sub
ListBox1.Clear
sim = TextBox1.Value
Sheets("SIM CARD").Select
filas = Range("a1").CurrentRegion.Rows.Count
j = 1
For i = 2 To filas
If Cells(i, j).Offset(0, 1).Value Like "*" & sim & "*" Then
ListBox1.AddItem Cells(i, j)
ListBox1.List(ListBox1.ListCount - 1, 1) = Cells(i, j).Offset(0, 1)
ListBox1.List(ListBox1.ListCount - 1, 2) = Cells(i, j).Offset(0, 2)
ListBox1.List(ListBox1.ListCount - 1, 3) = Cells(i, j).Offset(0, 3)
ListBox1.List(ListBox1.ListCount - 1, 4) = Cells(i, j).Offset(0, 4)
ListBox1.List(ListBox1.ListCount - 1, 5) = Cells(i, j).Offset(0, 5)
ListBox1.List(ListBox1.ListCount - 1, 6) = Cells(i, j).Offset(0, 6)
ListBox1.List(ListBox1.ListCount - 1, 7) = Cells(i, j).Offset(0, 7)
ListBox1.List(ListBox1.ListCount - 1, 8) = Cells(i, j).Offset(0, 8)
Else
End If
Next i
End Sub
Private Sub UserForm_Initialize()
With ListBox1
.ColumnCount = 8
.ColumnWidths = "50pt;100pt;60pt;60pt;80pt;60pt;50pt;40pt"
End With
End Sub
Hola,
Eliminarno se ve nada en el código que aportas que fuerza ni trabaje sobre otros libros... por tanto el problema que planteas debe estar en otra parte de tu código...¿¿??
Slds
Este comentario ha sido eliminado por el autor.
EliminarHola sí q pena me faltó la parte donde abre el libro
EliminarPrivate Sub CommandButton1_Click()
Dim i, j, filas As Integer
Dim sim As String
If TextBox1.Value = "" Then Exit Sub
ListBox1.Clear
sim = TextBox1.Value
Workbooks.Open FileName:="D:\Libro2.xls"
Sheets("SIM CARD").Select
filas = Range("a1").CurrentRegion.Rows.Count
j = 1
For i = 2 To filas
If Cells(i, j).Offset(0, 1).Value Like "*" & sim & "*" Then
ListBox1.AddItem Cells(i, j)
ListBox1.List(ListBox1.ListCount - 1, 1) = Cells(i, j).Offset(0, 1)
ListBox1.List(ListBox1.ListCount - 1, 2) = Cells(i, j).Offset(0, 2)
ListBox1.List(ListBox1.ListCount - 1, 3) = Cells(i, j).Offset(0, 3)
ListBox1.List(ListBox1.ListCount - 1, 4) = Cells(i, j).Offset(0, 4)
ListBox1.List(ListBox1.ListCount - 1, 5) = Cells(i, j).Offset(0, 5)
ListBox1.List(ListBox1.ListCount - 1, 6) = Cells(i, j).Offset(0, 6)
ListBox1.List(ListBox1.ListCount - 1, 7) = Cells(i, j).Offset(0, 7)
ListBox1.List(ListBox1.ListCount - 1, 8) = Cells(i, j).Offset(0, 8)
Else
End If
Next i
End Sub
Private Sub UserForm_Initialize()
With ListBox1
.ColumnCount = 8
.ColumnWidths = "50pt;100pt;60pt;60pt;80pt;60pt;50pt;40pt"
End With
End Sub
Para q me ejecute solo el userfrom cuando abra el archivo y que no se vea donde realiza la búsqueda estoy utilizando este código pero el problema es q me deja invisibles todos los archivos q tenga de excel abierto y lo único q quiero es q solo sea invisible al usuario los dos archivos de excel q trabajo
Private Sub Workbook_Open()
Application.Visible = False
UserForm1.Show
End Sub
Hola
Eliminarese evento Open del final lo que hace es abrir el formulario que tengas en ese Libro de trabajo.... al inicializar el UserForm se carga el ListBox, donde parece que ahora sí, abres un libro (Libro2.xls) desde donde cargas los datos.
Quizá para asegurar deberías trabajar declarando objetos, por ejemplo:
Set wb=Workbooks.Open FileName:="D:\Libro2.xls"
para luego referirte a ese libro cuando corresponda:
Set sh=wb.Sheets("SIM CARD")
filas = sh.Range("a1").CurrentRegion.Rows.Count
y sucesivamente
Por otro lado, puedes aplicar:
Application.ScreenUpdating=False
al inicio de los procedimientos, y así no verás los refrescos de pantalla... pero el libro tendrás que abrirlo si o sí para poder recuperar datos de él.
Saludos
por favor ayuda
ResponderEliminarquiero una macro en word para abrir un combo box, que busque datos de una columna de un libro excel. al seleccionar el dato buscado lo ponga en la selección del documento word y se oculte una vez colocado el dato. a y que se visualice al ejecutar la macro en word
Hola
Eliminarsi quieres ejecutarla desde Word quizá tendrías que plantear tu duda en algún foro específico de Word...
Siento no poder ayudarte en este punto
Saludos
Tengo una macro que jala datos de dos libros de excel pero cuando estan abiertos
ResponderEliminarAl correr sin abrir los excel de datos me manda a finalizar y depurar, ya que no encuentra el libro,
quisiera una macro q me mande el mensaje "abrir el archivo XXX para poder ejecutar" o algo asi
gracias
Hola,
Eliminarhay una función UDF muy empleada en internet que verifica si un libro está abierto o no:
Function IsFileOpen(filename As String)
Dim filenum As Integer, errnum As Integer
On Error Resume Next ' Turn error checking off.
filenum = FreeFile() ' Get a free file number.
' Attempt to open the file and lock it.
Open filename For Input Lock Read As #filenum
Close filenum ' Close the file.
errnum = Err ' Save the error number that occurred.
On Error GoTo 0 ' Turn error checking back on.
' Check to see which error occurred.
Select Case errnum
' No error occurred.
' File is NOT already open by another user.
Case 0
IsFileOpen = False
' Error number for "Permission Denied."
' File is already opened by another user.
Case 70
IsFileOpen = True
' Another error occurred.
Case Else
Error errnum
End Select
End Function
Saludos
Hola,buenas tardes.
ResponderEliminarEstoy creando un código y necesito insertar una libro de excel en un variable, pero como el fichero puede cambiar periódicamente necesito usar la función Open Filename y que ése archivo al abrirse quede asignado a ésa variable.A su vez, como en varias ocasiones trabajo con ellos necesito llamar el archivo, normalmente cuando conocemos el nombre del archivo se una Windows("NombreArchivo").Activate pero no lo he podido hacer para el caso de que el archivo este en la variable.Estaría muy agradecida si me pueden ayudar.Saludos
Hola,
Eliminarsi la variable la has definido al abrir el libro (con .Open) y las has llamado 'NombreArchivo', para emplearlo posteriormente en .Activate úsalo sin comillas:
Windows(NombreArchivo).Activate
Saludos
Hola buenas tardes, tengo una codificacion de CMS Avaya, que lo unico que necesito que haga es Abrir el excel, lo copie en una solapa y columna especifica:
ResponderEliminarb = Rep.ExportData("", 9, 0, False, True, True)
Sub CompletarLibro()
Dim ruta As String, direccion1 As String
Dim celdadestino As Range
ruta = "J:\(Call Center)\(Gestion CCenter)\EXPORTED DATA\CMS\Diario\"
fichero1 = "Export CMS On line Nuevo"
direccion1 = ruta & fichero1
Set celdadestino = Workbooks("Export CMS On line Nuevo.xlsm").Sheets("Listado 1").Cells(Rows.Count, "D").End(xlUp).Offset(1, 0)
Set tbl = Range("D1").CurrentRegion
tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, tbl.Columns.Count).Copy _
Destination:=Workbooks("Export CMS On line Nuevo.xlsm").Sheets("Listado 1").Range(celdadestino.Address)
Application.CutCopyMode = True
End Sub
seria algo asi? o estoy pifiandole mal? jaja
EliminarHola Ezequiel,
Eliminaraparentemente tienes la parte de dónde pegar, el destino...
te falta abrir un nuevo libro (workbooks.Add) y copiar algo que pegar en lo que ya tienes... (con un método .Copy)
Saludos
Buen dia, con la codificacion esta:
Eliminarb = Rep.ExportData("", 9, 0, False, True, True) ya lo tengo copiado al portapapeles, entonces agregando el workbook.add tendria que funcionar?
en principio si... y pegándo lo copiado, claro
Eliminar