miércoles, 24 de octubre de 2012

VBA: Macro para abrir y cerrar un libro de Excel - Workbooks.Open.

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:

VBA: Macro para abrir y cerrar un libro de Excel - Workbooks.Open.


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.

VBA: Macro para abrir y cerrar un libro de Excel - Workbooks.Open.


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:

VBA: Macro para abrir y cerrar un libro de Excel - Workbooks.Open.


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.

119 comentarios:

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

    ResponderEliminar
    Respuestas
    1. Hola,
      puedes 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

      Eliminar
    2. Buenas Ismael, tengo una duda muy simple, o no la veo....
      tengo 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.....

      Eliminar
    3. Hola,
      para 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

      Eliminar
    4. Muchas gracias por la respuesta, (por ambos lados...) me funciona.....
      el Application run me faltaba....
      abrazo y saludos
      Esteban

      Eliminar
  2. Hola Ismael, probe tu codigo pero me sale error en la línea:

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

    ResponderEliminar
    Respuestas
    1. Olvide indicarte que estoy trabajando en Excel 2003

      Eliminar
    2. Hola Davico...
      es 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 :-(

      Eliminar
  3. Ismael :

    Agradesco 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

    ResponderEliminar
    Respuestas
    1. Hola Rolando!
      gracias 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

      Eliminar
  4. Hola Ismael,

    muchas 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

    ResponderEliminar
    Respuestas
    1. Muchas gracias Daniel!!
      pues quizá sea así de simple y yo no me dí cuenta
      ;-)
      Un cordial saludo

      Eliminar
  5. hola.. alguien podría revisarme este código, por favor??

    Private 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

    ResponderEliminar
    Respuestas
    1. Hola Andrés!
      así 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

      Eliminar
  6. Hola Ismael,
    En 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

    ResponderEliminar
    Respuestas
    1. Hola Ines,
      muchas 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

      Eliminar
    2. 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
      Pero 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

      Eliminar
    3. 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).
      Comprueba 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

      Eliminar
  7. están interesantes esta rutina. una consulta, es posible obtener el numero de filas de un libro cerrado (sin abrir el libro)

    ResponderEliminar
  8. ... aclarando... ultima fila conteniendo datos

    ResponderEliminar
    Respuestas
    1. Hola jhonyx,
      igualemte un gusto saludarte.

      No es posible obtener la última fila con datos, puedes abrirlo y cerrarlo en el mismo procedimiento.

      Slds cordiales

      Eliminar
  9. 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.
    servicio.tecnico-lc@hotmail.com
    este es mi correo cualquier consulta me lo hacen saber necesito su apoyo

    ResponderEliminar
    Respuestas
    1. Hola Leo,
      en 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

      Eliminar
  10. 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.
    ¿Cómo puedo hacer esto?

    ResponderEliminar
    Respuestas
    1. Hola,
      lo 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

      Eliminar
    2. Muchas gracias por tu comentario.

      Saludos

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

    Sub 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

    ResponderEliminar
    Respuestas
    1. Hola, lo que parece que te falta es recorrer todos los ficheros de la carpeta...
      puedes 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

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

      Eliminar
  12. ES COMO UN BUSCARV PERO CON MACROS PARA VARIOS LIBROS Y PARA ACTUALIZAR LINEAS INTERCALADAS O CONTINUAS SEGÚN DE A QUIEN SE LE ASIGNO...

    ResponderEliminar
    Respuestas
    1. Hola,
      serí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

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

      Eliminar
    3. Hola,
      creo 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

      Eliminar
  13. Hola, como puedo grabar una macro que permita abrir un archivo y luego asignarlo a una autoforma

    ResponderEliminar
    Respuestas
    1. Hola,
      no 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

      Eliminar
  14. 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)...

    ResponderEliminar
    Respuestas
    1. Hola,
      parece 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

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

    ResponderEliminar
    Respuestas
    1. Hola, 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...)

      Espero te sirva.
      Slds

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

    Gracias de antemano.

    Sara Rodríguez

    ResponderEliminar
    Respuestas
    1. Hola Sara,
      para 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

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

    ResponderEliminar
    Respuestas
    1. Hola,
      no 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

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

      Eliminar
    3. Creo que merece la pena, cuando hablamos de trabajo simultaneo sobre un mismo fichero, que leas algo sobre Compartir libros de Excel:
      http://excelforo.blogspot.com.es/2013/03/compartir-un-libro-de-excel.html

      Espero te sea de utilidad.
      Slds

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

    ResponderEliminar
    Respuestas
    1. Hola,
      gracias, 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.

      Eliminar
  19. 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?
    De antemano muchas gracias por tu colaboración.
    Francisco

    ResponderEliminar
    Respuestas
    1. Hola Francisco,
      en 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

      Eliminar
  20. hola ismael como puedo abrir una macro desde otra macro ??


    saludos,

    ResponderEliminar
    Respuestas
    1. Hola,
      puedes 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

      Eliminar
  21. Hola Ismael,
    Tengo 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

    ResponderEliminar
    Respuestas
    1. Hola Jamess,
      he 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!

      Eliminar
  22. Buenas Noches: Quisiera saber si me pueden ayudar. Tengo 2 Archivos en Excel A y B
    Necesito 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

    ResponderEliminar
    Respuestas
    1. Hola Ronald,
      podrí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

      Eliminar
    2. Buenas Noches.
      Muchísimas gracias, me funcionó perfectamente
      saludos desde Costa Rica

      Eliminar
  23. Hola Ismael ,
    Lo 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

    ResponderEliminar
    Respuestas
    1. Hola Jamess,
      no, 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

      Eliminar
  24. Buenos días:
    Tengo 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

    ResponderEliminar
  25. Hola buena noche.

    Querí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

    ResponderEliminar
    Respuestas
    1. Hola Pedro,
      puedes 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

      Eliminar
  26. Hola Ismael, excelente tu blog y nos ayuda mucho a acelerar y optimizar nuestro trabajo diario.
    Tengo 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

    ResponderEliminar
    Respuestas
    1. Hola, muchas gracias!
      creo 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

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

    saludos.

    ResponderEliminar
    Respuestas
    1. Hola Jerzy,
      para cerrar la aplicación Excel completa:
      Application.Quit

      Saludos

      Eliminar
  28. Buanas tardes Ismael,muy buenas todas tus presentaciones
    queria 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

    ResponderEliminar
    Respuestas
    1. Hola Carlos,
      para 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

      Eliminar
  29. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  30. Hola 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.
    La 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.

    ResponderEliminar
    Respuestas
    1. Hola Damian
      para 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

      Eliminar
  31. 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.
    ¿que puede habler provocado esto. como lo puedo solucionar?
    gracias (gorgorito2005@yahoo.es)

    ResponderEliminar
    Respuestas
    1. Hola!
      ¿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

      Eliminar
    2. 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.)
      He 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.

      Eliminar
    3. Es posible tengas una referencia circular entre esas dos celdas...
      Asegú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

      Eliminar
    4. Efectivamente, eso era. habia una referencia circular.
      Gracias Ismael.

      Eliminar
  32. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  33. Hola Ismael. Tu post me va ayudar en mi trabajo si consigo hacer que funcione.
    El 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.

    ResponderEliminar
    Respuestas
    1. Hola,
      a 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

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

      Eliminar
    3. ok,
      lo reviso y te comento por email.
      Slds

      Eliminar
    4. Hola, me podrían mandar la respuesta a mi mail también, ya que me está ocurriendo lo mismo en mi excel 2010.

      Eliminar
    5. Hola Julian,
      (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

      Eliminar
  34. Hola Ismael.
    De 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

    ResponderEliminar
    Respuestas
    1. Hola,
      si 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

      Eliminar
  35. Hola de nuevo Ismael,
    En 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.

    ResponderEliminar
    Respuestas
    1. Para copiar también la primera fila, sería:
      Set tbl = Range("A1").CurrentRegion

      tbl.Copy _
      Destination:=Workbooks("Principal.xlsm").Sheets("Resumen").Range(celdadestino.Address)

      Saludos!

      Eliminar
    2. Muchas gracias por responder tan rápido.

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

      Eliminar
    3. ;-)
      No siempre me es posible responder

      Un saludo

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

    ResponderEliminar
    Respuestas
    1. Hola Martín,
      desconozco 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

      Eliminar
  37. 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?

    ResponderEliminar
    Respuestas
    1. Hola José,
      para crear un Nuevo Libro emplea el método Workbooks.Add
      Un saludo!

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

    ResponderEliminar
  39. Despué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.

    ResponderEliminar
    Respuestas
    1. Hola Jesús,
      para 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

      Eliminar
  40. Saludos Ismael y a todos los lectores.

    A 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

    ResponderEliminar
    Respuestas
    1. Hola,
      se 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

      Eliminar
    2. Hola Ismael, me podrias orientar como hacerlo desde tu punto de vista.

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

      Eliminar
    3. Hola Jose Luis,
      al 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

      Eliminar
    4. Hola Ismael ¿como se haria?, me puedes orientar.

      Eliminar
    5. Hola,
      desde Ficha Datos> Obtener datos externos.
      realices el enlace al fichero y listo.
      Saludos

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

      Eliminar
    7. Siempre 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.
      Slds

      Eliminar
  41. Buenas tardes, quisiera solicitar la ayuda de ustedes si pueden por favor.
    Hace 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

    ResponderEliminar
    Respuestas
    1. Hola Arturo,
      al 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

      Eliminar
  42. 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?

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

    ResponderEliminar
    Respuestas
    1. Hola buen día.

      en 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!!!

      Eliminar
    2. Antes de nada, muchas gracias por tu contestación Gilberto.
      Al 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.

      Eliminar
  43. Que tal Ismael,
    son 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

    ResponderEliminar
    Respuestas
    1. Hola,
      cuando 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

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

    Si 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

    ResponderEliminar
    Respuestas
    1. Hola Erick,
      que 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

      Eliminar
  45. ¿Excel, ingresar datos en la siguiente fila vacía con una macro?
    Me 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

    ResponderEliminar
    Respuestas
    1. Hola,
      tendrí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

      Eliminar
  46. Hola Ismael,
    Estoy 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!

    ResponderEliminar
    Respuestas
    1. Hola!
      como 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

      Eliminar
    2. Gracias!! funcionó de maravilla

      Eliminar