[Excel VBA] Reemplazar hoja por otra

grotone Mensajes publicados 14 Fecha de registro   Estado Miembro -  
 plop -
Bonjour,

Tengo 2 archivos de Excel diferentes y estoy buscando reemplazar una hoja de uno de los libros por una del segundo libro.

Workbooks(1).Sheets(ActiveSheet.Name).Delete
Workbooks(2).ActiveSheet.Copy after:=Workbooks(1).Sheets("Navigation")

En resumen, borro la hoja del libro 1 (llamémosla Hoja1, y después busco la misma hoja (con el mismo nombre, Hoja1 y el mismo formato) en el libro 2 y la copio en el libro 1.

Todo iría bien en el mejor de los mundos, pero resulta que en el libro 1 tengo otra hoja (digamos "Resumen") que depende de valores en la hoja que estoy tratando de reemplazar, y cuando realizo mi reemplazo, los enlaces en esa hoja se "rompen", aunque las 2 hojas (Hoja1 de los 2 libros) son idénticas.

¿Cómo puedo realizar mi reemplazo de Hoja1, asegurándome de que los enlaces de Resumen no se "rompan"?

Gracias de antemano

Grotone
Configuración: Windows 2003 Internet Explorer 6.0

5 respuestas

  1. Mathieu Lecours Mensajes publicados 2 Estado Miembro 5
     
    Hola a todos,

    Si están leyendo las otras soluciones de los miembros y no entienden nada o les parece todo demasiado complejo, aquí está la solución más efectiva y simple para ustedes:


    Tomemos el siguiente caso como ejemplo:

    Ustedes quieren reemplazar la Hoja2 del LibroA por la Hoja2 del LibroB.
    Sin embargo, no quieren perder las fórmulas de la Hoja1 que hacen referencia a la Hoja2 del LibroA. (este párrafo puede ser difícil de entender a primera vista, pero asegúrense de asimilar lo que está escrito antes de continuar)

    Esto es lo que deben hacer:

    1. Abran ambos libros

    2. En el LibroB, hagan clic en Hoja2

    3. En el menú Inicio, hagan clic en Formato > Mover o copiar una hoja...

    4. ¡Aparece una ventana! En esta ventana, bajo el menú En el libro, seleccionen LibroA. Aún en esta ventana, marquen Crear una copia (en la parte inferior izquierda), luego hagan clic en OK

    5. En este momento, deberían ser automáticamente redirigidos al LibroA. Notarán que ahora tienen Hoja2 y Hoja2 (2). Deben eliminar Hoja2

    6. Renombren Hoja2 (2) a Hoja2

    7. Luego, vayan a Hoja1: notan que las funciones que hacen referencia a Hoja2 ya no funcionan y están reemplazadas por #REF. Es normal. Ahora, seleccionen todas las celdas y hagan la función Reemplazar (CTRL+H)

    8. Aparece una ventana. En esta ventana, en la primera sección, escriban #REF. En la segunda sección, escriban Hoja2. Finalmente, hagan clic en Reemplazar todo (en la parte inferior izquierda) y ¡listo!

    Tengan en cuenta que esta solución funciona para Excel 2010, pero no estoy seguro de que se aplique a otras versiones de Excel. Además, antes de comenzar los pasos, asegúrense de que ninguna celda de la Hoja1 contenga ningún error, es decir, un #REF. De lo contrario, el paso 8 podría reemplazar #REF por Hoja2 en sus fórmulas.

    ¡Eso es! ¡Espero que mis explicaciones les hayan sido útiles!

    ¡Que tengan un buen día a todos!

    --
    Mathieu
    5
    1. eriiic Mensajes publicados 24581 Fecha de registro   Estado Colaborador Última intervención   7 281
       
      Hola,

      ¿te has dado cuenta de que la pregunta es de 2008 y que quería hacerlo en vba?
      eric
      0
    2. Mathieu Lecours Mensajes publicados 2 Estado Miembro 5
       
      De hecho, lo había notado :P Sin embargo, estoy seguro de que lo que he escrito servirá a alguien, en algún lugar, algún día!

      ¡Que tengas un buen día!

      Mathieu
      0
      1. plop > Mathieu Lecours Mensajes publicados 2 Estado Miembro
         
        Lo que escribiste me ha servido, dos años después ;)
        Utilicé la opción "guardar una macro" haciendo las manipulaciones que mencionaste arriba. ¡Y funciona bien!
        Solo tengo que modificar ligeramente la macro creada para duplicarla en otros archivos y voilà, ¡he actualizado todo mi documento!

        Rápido y bien hecho.
        Gracias por escribir esta publicación fuera de tema pero muy útil xD
        0
  2. zavenger Mensajes publicados 817 Estado Miembro 161
     
    No es posible (hasta donde yo sé) que tus enlaces no se rompan cuando borras tu primera hoja. Dos soluciones para ti:
    - Vuelve a crear tus enlaces con tu macro (sobreescribes tus fórmulas)
    - Haz un copiar y pegar entre tus dos hojas (quizás borrando completamente la hoja de destino antes de pegar)
    No sé si esto te convendrá, pero no veo otras soluciones.
    0
  3. grotone Mensajes publicados 14 Fecha de registro   Estado Miembro 1
     
    Merci, finalmente logré salir adelante haciendo una mezcla de los dos.

    Para aquellos a quienes les interese, en resumen, tengo un primer libro con una hoja "Feuil1" y una hoja "Résumé" que depende de valores de Feuil1, pero que también depende de otras hojas de este libro que no cambiarán. Tengo un segundo libro con las mismas 2 hojas que el primer libro (pero con datos que cambian).
    Busco reemplazar "Feuil1" del primer libro por "Feuil1" del segundo, asegurándome de que los valores de los que depende "Résumé" del primer libro no tengan enlaces rotos (enlaces que apunten a la nueva "Feuil1", pero también a las otras hojas que no cambian).

    Después de darme cabeza, esto es lo que hago,
    Elimino "Résumé" del segundo libro y lo reemplazo por "Résumé" del primer libro, y corrijo los enlaces del segundo libro con ChangeLinks.
    Luego, elimino "Feuil1" y "Résumé" del primer libro, y los reemplazo con los del segundo libro, y corrijo los enlaces del primer libro nuevamente con ChangeLinks.
    Todo esto con Application.DisplayAlerts = False para que Excel no me moleste en medio de las operaciones.

    Todo funciona y hace exactamente lo que quiero, pero es un método bastante desordenado, si alguien tiene una mejor idea, estoy abierto a sugerencias.

    Sub Importar()
    Dim libro As String
    Dim hoja As String
    Dim ruta As String

    libro = Application.GetOpenFilename(FileFilter:="Archivos Excel (*.xls), *.xls", Title:="Elegir un archivo Excel")
    Workbooks.Open libro
    hoja = Workbooks(2).ActiveSheet.Name

    'paso 1
    Application.DisplayAlerts = False
    Workbooks(2).Sheets("Résumé").Delete
    Workbooks(1).Sheets("Résumé").Copy after:=Workbooks(2).Sheets("Navigation")
    alinks = Workbooks(2).LinkSources(xlExcelLinks)
    ruta = Workbooks(2).Path & "\" & hoja & ".xls"
    Workbooks(2).ChangeLink alinks(1), ruta, xlExcelLinks

    'paso 2
    Application.DisplayAlerts = False
    Workbooks(1).Sheets(hoja).Delete
    Workbooks(1).Sheets("Résumé").Delete
    Workbooks(2).Sheets(hoja).Copy after:=Workbooks(1).Sheets("Navigation")
    Workbooks(2).Sheets("Résumé").Copy after:=Workbooks(1).Sheets("Navigation")
    alinks = Workbooks(1).LinkSources(xlExcelLinks)
    ruta = Workbooks(1).Path & "\" & Workbooks(1).Name
    Workbooks(1).ChangeLink alinks(1), ruta, xlExcelLinks

    Application.DisplayAlerts = True

    End Sub

    a+

    Grotone
    0
    1. Bibi
       
      De nada
      0
  4. grotone Mensajes publicados 14 Fecha de registro   Estado Miembro 1
     
    Sí...

    finalmente funciona para las vinculaciones de celdas, pero falla si utilizo la propiedad linkedcell de un OptionButton.
    la LinkedCell se convierte en '#REF'!C200 por ejemplo, y ChangeLink no puede hacer nada al respecto...
    0
  5. eriiic Mensajes publicados 24581 Fecha de registro   Estado Colaborador Última intervención   7 281
     
    Hola,

    y utilizando un tercer libro intermedio que tiene los nombres de las hojas vinculadas?
    Eso daría algo así:
    ' preservación de los enlaces
    ActiveWorkbook.ChangeLink Name:="D:\Users\Eric\Documents\ccm\Classeur2.xls", _ NewName:="D:\Users\Eric\Documents\ccm\Classeur3.xls", Type:=xlExcelLinks ' reemplazo de la hoja '.... ' restablecimiento de los enlaces ActiveWorkbook.ChangeLink Name:="D:\Users\Eric\Documents\ccm\Classeur3.xls", _ NewName:="D:\Users\Eric\Documents\ccm\Classeur2.xls", Type:=xlExcelLinks 

    eric

    Nunca responderás a un mp no solicitado...
    Bueno, eso está hecho.
    0