martes, 8 de marzo de 2011

Macro para Copiar y Pegar un rango de Excel en un documento de Word.

A través de un comentario realizado en este blog, un lector solicitaba ayuda para poder realizar un copiado y pegado desde un rango de celdas en Excel a un documento de Word:

...
Como hago para pasar unas columnas de una Hoja de Excel para Una Hoja de Word.Ejemp.
Nombre del Plan de estudio:/Columna de Excel/
Codigo de la Mencion:/Columna de Excel/
Nombre y Apellido:/Columna de Excel/
Cedula de Identidad:/Columna de Excel/
Dia:/Columna de Excel/ Mes;/Columna de Excel/
Año;/Columna de Excel/...


La idea es desarrollar un código de VBA que permite copiar y pegar una tabla desde Excel a Word, además le daremos la propiedad especial de estar vinculados.
Lo más importante antes de comenzar con el desarrollo de nuestra macro es seleccionar una biblioteca de objetos adecuado para nuestro proposito. Después de establecer una referencia a una biblioteca de objetos activando la casilla de verificación situada junto a su nombre, podremos buscar un objeto específico y sus métodos y propiedades en el Examinador de objetos.
Para activar esta referencias deberemos ejecutar el editor de VBA, presionando Alt+F11, y navegando por el menú Herramientas > Referencias seleccionaremos aquellas referencias que sean de utilidad, en nuestro caso Microsoft Word 12.0 Object Library:


La versión 12.0 es válida para trabajar con Excel 2007 y anteriores
Para implantar en nuestros códigos de VBA en Excel estos objetos será necesario incluir las siguientes líneas, que en términos generales para cualquiera de las aplicaciones de Office serían:
Dim otraApp As Otra.Application
Dim otroDoc As Otra.DocTipo
Dim otroObjeto As Otro.ObjetoEspecifico

En concreto para el caso que nos atañe:
Dim WorDApp As Word.Application
Dim WordDoc As Word.Document


Veamos entonces el código a incluir en el Editor de VBA (Alt+F11), dentro de un Módulo del explorador de proyectos es:

Sub Tabla_de_Excel_a_Word()
'Copia el rango de Excel seleccionado en un nuevo documento Word

'copiar rango selecionado
Selection.Copy

'Crea nueva aplicación Word
Dim swMSWord As Word.Application
Set swMSWord = New Word.Application
With swMSWord
.Visible = True
.Activate
End With
'Abre nuevo documento Word
swMSWord.Documents.Add
'Pegado con vínculo de las celdas Excel
swMSWord.Selection.PasteSpecial link:=True
'Libera el objeto Word
Set swMSWord = Nothing

End Sub


El resultado es que se abre un nuevo documento de Word y en él se pega, con vínculos, el rango seleccionado en nuestra Hoja de cálculo, guardando además todos los formatos existentes en nuestras celdas.

14 comentarios:

  1. Hermano super bien, era lo que quería.
    Gracias

    ResponderEliminar
  2. Buenos dias quisiera saber como seria posible mediante algun script de vba copiar un grafico o informacion de un documento de excel hacia una columna o fila especifica en word esto corriendo el codigo desde excel mediante una macro. Por ejemplo quisiera copiar un grafia en la columna 2 y fila 3 de una table de word mediante el macro hecho en excel.

    ResponderEliminar
    Respuestas
    1. Hola, no creo sea posible desde Excel,
      pero parece más probable hacerlo desde un código en Word.

      El problema desde Excel es que no podríamos indicarle, con la precisión que quieres, donde incluir la información de Excel... tan sólo hacia el documento concreto de Word.

      Yo al menos no tengo conocimiento de lo contrario.

      Suerte!!!

      Eliminar
  3. Excelente!!! me facilitaste el código correcto que necesitaba, gracias, si funciona y perfecto, solo quisiera le añadas que NO abra una nueva hoja word, sino active una existente y abierta y pegue al final de la misma.

    ResponderEliminar
    Respuestas
    1. Hola Andy,
      cambia
      swMSWord.Documents.Add
      por
      swMSWord.Documents.Open("ruta_del_archivo_Word")

      debería funcionarte.
      Saludos

      Eliminar
  4. Saludos:
    Logré de hacer de otra forma el copiado y pegado de contenido de celdas de Excel a una plantilla de Word, pero no logro migrar los formatos. Me gustaría saber cómo hago llegar mi código y ver la posible solución al problema.
    Muchas gracias, saludos desde Temuco - Chile.

    ResponderEliminar
  5. Estimado Ismael llevo mucho buscando una forma de poder copiar una celda o un grupo de celdas a word, el cual quede hipervinculado y sin formato, pero la idea es que sea como control C y control V

    ResponderEliminar
    Respuestas
    1. Hola,
      el detalle de este mismo post explica como realizar un copiado-pegado en word y que mantenga el link...
      El tema del formato siempre es más delicado entre diferentes aplicaciones
      :(
      Saludos

      Eliminar
  6. Estimado Ismael , he tratado de pasar un texto (nombre) de excel a word y que asuma el formato de destino, me puedes ayudar. CASTRETE73@GMAIL.COM

    ResponderEliminar
  7. A traves de macros obviamente

    ResponderEliminar
    Respuestas
    1. Hola Nelson,
      una macro de este estilo debería funcionar...

      Sub EscribeWord()
      Dim objWord
      Dim objDoc

      Dim objSelection

      Set objWord = CreateObject("Word.Application")

      Set objDoc = objWord.Documents.Add

      objWord.Visible = True

      Set objSelection = objWord.Selection

      objSelection.TypeText ("aqui incluyes el texto, mediante variable, tomando datos de la celda de Excel")

      End Sub

      Saludos

      Eliminar
  8. Saludos Ismael:
    Tengo un codigo para abrir una hoja de Word en blanco en horizontal + margenes establecidos por mi. Luego pasa una table de Excel con Rango variable a este documento. No todo el tiempo me esta funcionando, la pega pero no bajo mis condiciones de landscape y margenes. Tambien estoy teniendo problemas para que la table se ajuste automaticamente a los margenes establecidos. Te copio el codigo por si me pueden ayudar gracias.

    Att
    WCHR

    Sub Summary_To_Word(ByVal control As IRibbonControl) 'Transfiere la Tabla del Summary a Documento en Word (WCHR).
    Dim wordApp As Object
    Set wordApp = CreateObject("Word.Application")
    Dim sht As Worksheet
    Dim LastRow As Long
    Dim LastColumn As Long
    Dim StartCell As Range
    Set sht = Worksheets("SUMMARY")
    Set StartCell = Range("A1")
    Worksheets("SUMMARY").UsedRange
    LastRow = sht.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 'Find Last Row
    sht.Range("A1:J" & LastRow).Select 'Select Range
    Selection.Copy
    With wordApp
    .Visible = True 'Con este codigo se abrira Word y se creara un documento nuevo
    .Activate
    .Documents.Add
    End With

    wordApp.Selection.PasteSpecial link:=False, DataType:=wdPasteEnhancedMetafile, Placement:=wdInLine, DisplayAsIcon:=False
    Set wordApp = Nothing
    With ActiveDocument.PageSetup
    .LineNumbering.Active = False
    .Orientation = wdOrientLandscape
    .TopMargin = InchesToPoints(0.2)
    .BottomMargin = InchesToPoints(0.2)
    .LeftMargin = InchesToPoints(0.2)
    .RightMargin = InchesToPoints(0.2)
    End With
    Application.ScreenUpdating = False

    End Sub

    ResponderEliminar
    Respuestas
    1. Hola,
      ten presente que las propiedades de la tabla son independientes de las de la hoja (del documento)... entiendo que, y aquí un experto en Word te dará más pistas que yo, tendrías que ajustar las propiedades de la Tabla pegada...

      Siento no poder decirte mucho más.
      Saludos

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.