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

11
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:

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

Page 1: Macro para Copiar y Pegar un rango de Excel en un documento de Word

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 anterioresPara 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.ApplicationDim otroDoc As Otra.DocTipo

Dim otroObjeto As Otro.ObjetoEspecificoEn concreto para el caso que nos atañe:Dim WorDApp As Word.Application

Page 2: Macro para Copiar y Pegar un rango de Excel en un documento de Word

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 selecionadoSelection.Copy

'Crea nueva aplicación WordDim swMSWord As Word.Application

Set swMSWord = New Word.ApplicationWith swMSWord.Visible = True

.ActivateEnd With

'Abre nuevo documento WordswMSWord.Documents.Add

'Pegado con vínculo de las celdas ExcelswMSWord.Selection.PasteSpecial link:=True

'Libera el objeto WordSet swMSWord = Nothing

End Sub

VBA: Formas de copiar rangos o celdas.

Con asiduidad me llegan preguntas sobre la manera de copiar rangos o celdas de un lugar a otro de nuestros Libros de trabajos empleando macros. Por este motivo

expondré con un ejemplo sencillo alguna de las formas más habituales en las que podemos conseguir un copiado de esos rangos de origen a uno de destino.

Para añadir un extra, le incorporaré una condición de pegado que controle que sólo se puede efectuar dicho copiado si algunas celdas no están vacías.

Algunas propiedades que también usaré en este ejemplo son:

Application.CutCopyMode = False: con la que deshabilitaremos el modo Cortar y Copiar.

Application.ScreenUpdating = False: desactiva la actualización de pantalla. Realiza todos los procesos sin que tengan un reflejo sobre lo que vemos.

Application.ScreenUpdating = False: activa dicha actualización de pantalla.

Los códigos VBA de nuestra macro son:Sub copiados()

Dim HojaOrigen As Worksheet, HojaDestino As Worksheet

Page 3: Macro para Copiar y Pegar un rango de Excel en un documento de Word

Set HojaOrigen = Sheets(1)Set HojaDestino = Sheets(2)

'con el If compruebo las condiciones previas a la ejecución del copiado y pegado

If HojaOrigen.Cells(2, 1).Value <> Empty And _HojaOrigen.Cells(3, 1).Value <> Empty Then

Application.ScreenUpdating = False

'una forma empleando el método .Paste, con dos parámetros incompatibles'o bien definimos Destination o bien Link

HojaOrigen.Cells(2, 1).CopyActiveSheet.Paste HojaDestino.Range("A2")

'con Link realiza un Pegar vínculoHojaOrigen.Cells(3, 1).Copy

HojaDestino.Range("A3").ActivateActiveSheet.Paste link:=True

'Realizamos un Pegado especial, en este caso como Pegar valores y Pegar fórmulas

HojaOrigen.Cells(2, 2).CopyHojaDestino.Cells(2, 2).PasteSpecial Paste:=xlValues

HojaOrigen.Cells(3, 2).CopyHojaDestino.Cells(3, 2).PasteSpecial Paste:=xlFormulas

'Con el método .Copy podemos indicar dónde deseamos nos copie el rango seleccionado

'realiza un copiado exacto (con formatos, fórmulas, etc)HojaOrigen.Cells(2, 3).Copy Destination:=HojaDestino.Cells(2, 3)HojaOrigen.Cells(3, 3).Copy Destination:=HojaDestino.Cells(3, 3)

'También podemos vincular valores o fórmulas relacionando diferentes celdas.HojaDestino.Range("D2").Value = HojaOrigen.Range("D2").Value

HojaDestino.Range("D3").Formula = HojaOrigen.Range("D3").Formula

Application.ScreenUpdating = TrueApplication.CutCopyMode = False

End IfSet HojaDestino = NothingSet HojaOrigen = Nothing

End Sub

La macro es muy sencilla, empleando las diferentes instrucciones seleccionamos distintas celdas de la Hoja1, y se van copiando en la Hoja2 en las celdas elegidas por

nosotros.

Es importante observad las propiedades de cada orden dada, y cómo unas de ellas realizan copiados exactos (incluyendo formatos, fórmulas, etc) y otras sólo son

Page 4: Macro para Copiar y Pegar un rango de Excel en un documento de Word

copiados de los valores elegidos. Dependerá de nuestros requerimientos que usemos unas u otras.

En nuestro caso, tras ejecutar la macro, obtenemos el siguiente resultado en la Hoja2:

Cómo obtener coincidencias de una tabla cruzada.

Una consulta que me llegó hace algunos días preguntaba sobre la forma en que se podría obtener listados condicionados o filtrados sobre una tabla cruzada:

...DISPONGO DE UNA TABLA CON VARIAS COLUMNAS (45) Y FILAS (266).CADA FILA SE REFIERE A UNA CASA DIFERENTE Y CADA COLUMNA A UN DETERMINADO

SERVICIO.LO QUE QUIERO LOGRAR ES DANDO COMO REFERENCIA EL SERVICIO Y SU CONDICION

OBTERNER UNA LISTA DE TODAS LAS CASAS QUE CUMPLEN CON ESTAS CONDICIONES. LOS VALORES DENTRO DE TABLA SON REPETIDOS. TE AGREGO UN EJEMPLO RESUMIDO DE LA

TABLA .la busqueda la hago en una hoja distinta a la que esta la table con los datos. Por lo que me

es importante conseguirlo con formulas...

Se trata entonces, a partir de una tabla cruzada, obtener un listado de elementos que cumplen con dos condiciones. Veamos dicha tabla:

Nuestro objetivo es lograr un listado de los elementos del rango A3:A7, es decir, del campo 'CASAS' de la tabla, que cumplan unas condiciones definidas por nosotros, de acuerdo a las otras dos variables de la tabla; en este caso según el tipo de consumo

(LUZ, GAS, AGUA) y si dicho consumo se encuentra CONECTADO/DESCONECTADO para cada CASA..

Para ello asignaremos nombre a los siguientes rangos(ver) dentro de nuestra hoja de trabajo 'datos:

Page 5: Macro para Copiar y Pegar un rango de Excel en un documento de Word

AGUA =datos!$D$3:$D$7CASAS =datos!$A$3:$A$7

consumos =datos!$B$2:$D$2GAS =datos!$C$3:$C$7LUZ =datos!$B$3:$B$7

En la siguiente etapa definiremos con la Validación de datos los criterios para las celdas G7 y G9; donde para la celda G7 se le asignará una validación tipo lista con los

valores del rango consumos; y para la celda G9 una validación tipo lista con los valores CONECTADO / DESCONECTADO.

haz click en la imagen

Los valores que despleguemos en estas dos celdas (G7 y G9 servirán para configurar nuestra fórmula, y poder obtener así el listado de CASAS que cumplen ambos criterios.Nuestra fórmula deberá ser matricial(Ctrl+Mayusc+Enter), y la desarrollaremos para

el rango G12:G16{=SI(INDIRECTO(G7)=$G$9;CASAS;"")}

con la que conseguimos que detecte para el rango definido en la celda G7 los valores iguales al valor determinado en la celda validada G9, devolviendo en caso de coincidencia el correspondiente del rango CASAS, y blanco en caso contrario.

Para que Excel reconozca el valor de la celda G7 como un rango evaluable se ha de emplear la función INDIRECTO.

El resultado será entonces:

VBA:Insertar una función con macros.

Un lector enviaba una cuestión sobre la manera de insertar una función en nuestra hoja de cálculo a través de una macro:

...es posible y como puedo cambiar en una formula el valor absoluto de la dirección de una celda por una variable, me explico:

Si tengo la formula ActiveCell.Formula = "=SUBTOTAL(9,I3,I500)" , resulta que quiero cambiar en el valor I500 , el 500 por el valor que traiga una variable, (I&variable) si variable

Page 6: Macro para Copiar y Pegar un rango de Excel en un documento de Word

tiene el valor de 501, quedaría I501, me funciona en los rangos la siguiente formula Range("A" & variable).Select, pero en la anterior formula no he podido cambiar el 500 por el

valor de una variable....

Efectivamente es posible incluir funciones o fórmulas en nuestras hojas de cálculo, a través de una macro, de esta manera tan directa. Lo único que hacemos realmente es

determinar que queremos que se escriba en la celda deseada; todo lo que vaya entrecomillado se añadirá simplemente en esa celda elegida.

Si tenemos claro esta clave, será fácil responder a nuestro amigo. La línea de código que soluciona su problema sería:

ActiveCell.Formula = "=SUBTOTAL(9,I3:I" & variable & ")"

Desarrollémoslo con un ejemplo muy sencillo. Disponemos en nuestra hoja de cálculo de un listado de importes en el rango A1:A11, aunque sabemos que éste variará según crezca nuestra base de datos. Queremos conocer en cada momento cuál es la suma

del rango vivo con el que trabajamos, en la celda C1.Nuestros valores actuales:

el código VBA de nuestra macro:'macro que calcula la suma de todas las entradas de datos para el rango vivo

A1:A??.Sub introducir_formula()

'con UsedRange determinamos el rango empleado actual en nuestra hoja de calculo.

'con .Rows.Count conocemos el total de filas del rango.ultfil = ActiveSheet.UsedRange.Rows.Count

'¡¡cuidado ya que las funciones incluidas deben ir en Inglés!!Range("C1").Formula = "=SUM(A2:A" & ultfil & ")"

End Sub

Muy importante, no olvidar que las funciones empleadas dentro de este código deben aparecer escritas como en su versión en inglés!!!; ya que si no nos

devolvería un error de #¿NOMBRE?.

Page 7: Macro para Copiar y Pegar un rango de Excel en un documento de Word

Al emplear, en este caso .UsedRange nos debemos asegurar que no existe ningún otro valor de en la hoja de cálculo, además de los necesarios para la suma. Si fuera así,

tendríamos que emplear alguna otra instrucción o variable para determinar cual es la última celda de nuestro rango.

VBA: macro para acumular cantidades.

Contestaré hoy a una petición curiosa que me ha llegado a través del mail. Un usuario quería que en una tabla definida en un rango concreto (A2:C5) se fueran acumulando

cantidades según introducía entradas de datos:...Quiero que en cada fila de concepto, pueda meter una cantidad y que se sume en

acumulado, luego, en una 2ª entrada meter en otra cantidad y que acumule la de la 1ª entrada y la de la 2ª y as'ísucesivamentre. Y todo esto que se pueda hacer en cada fila de conceptos. Como puedes ver en el siguiente ejemplo en la fila leche en la primera entrada meto 20 y acumula 20. En la segunda entrada en la misma casilla borro 20 y meto 30 y en acumulado debe quedar 50. En la tercera entrada en el concepto leche, en la misma casilla borro 30 y meto 40, acumulándose en lqa misma fila de acumulado 90. Así con el resto de

filas: pan, tomate...entrada 1

concepto cantidad acumuladoleche 20 20pan 10 10

tomate 40 40

entrada 2concepto cantidad acumulado

leche 30 50pan 15 25

tomate 25 65

entrada 3concepto cantidad acumulado

leche 40 90pan 25 50

tomate 5 70

Veamos cuál es la plantilla sobre la que volcaremos nuestra programación:

La idea es que cada vez que el usuario introduzca los nuevos valores para la Leche, Pan y Tomate, podamos ejecutar nuestra macro, para que automáticamente genere la

suma acumulada de esta entrada con todas las anteriores. Para ello he construido una macro muy sencilla, que ejecutaremos tras la introducción

de los nuevos datos para los distintos conceptos de cada entrada.

Page 8: Macro para Copiar y Pegar un rango de Excel en un documento de Word

Abrimos el Editor de VBA (Alt+F11) e insertamos un nuevo Módulo, en el cuál incluiremos el siguiente código:

'macro que calcula el acumulado de todas las entradas de datos.

Sub acumular()Dim iAs Integer

x = 1For i = 3 to 5

'realiza la suma acumulada del valor anterior mas el nuevo'para cada concepto (Leche, Pan, Tomate).

Cells(i, 3).Formula = Cells(i, 3).Value + Cells(i, 2).Value'limpia los campos para poder introducir los nuevos valores

'para cada concepto (Leche, Pan, Tomate).Cells(i, 2).ClearContents

Next i'Da formato personalizado, añadiendo el texto Entrada

Range("A1").NumberFormat = """Entrada ""0"'genera un autonumérico en la celda A1

'que nos indicará qué entrada es la última introducida.Range("A1").Value = Range("A1").Value + x

End Sub

Para ejecutar de manera cómoda nuestra macro, la asignaremos a un botón.Al ejecutar nuestra macro acumular conseguimos identificar la última entrada editada

(celda A1), así como el último valor acumulado (rango C3:C5).

Tras 5 entradas de valores hemos obtenido un acumulado de Leche 50, Pan 100 y Tomate 150, quedando lista la tabla para la edición de los valores de la siguiente

entrada.

Page 9: Macro para Copiar y Pegar un rango de Excel en un documento de Word

 EL DISTRITO FEDERAL EN ASTURIAS No. 157 PISO 2-202, COL. ALAMOS DISTRITO FEDERAL, CP. 03400.  DEL. BENITO JUAREZ.

EN LOS TELEFONOS: para el Extranjero LADA (52)     interior de la Republica LADA (55) 5698 5684  MOVIL. 55- 3208 7540                                  

 o al correo: [email protected]      O      [email protected]