Macro para ajustar el tamaño de la imagen pegada en Word 2007
Resuelto
Vesper Lynd
Mensajes publicados
11
Fecha de registro
Estado
Miembro
-
bibilac -
bibilac -
Hola,
Primero, de manera colectiva, gracias a todos los miembros del foro por todas las valiosas enseñanzas de las que he beneficiado gracias a ustedes desde hace tanto tiempo. He aprendido más del 50% de lo que sé gracias a ustedes :)
Bueno, por otra parte, por primera vez tengo un problema para el cual no he encontrado ninguna respuesta en ningún lado... Lo coloco en el foro de Burocracia un poco al azar, espero no estar equivocado...
Situación de partida: uso de un documento en modo Formulario bajo word 2007 (con las áreas de entrada, las listas desplegables, la protección activada para ingresar solo en los campos y todo eso).
Pongo este documento a disposición de los usuarios que deben poder insertar capturas de pantalla sin desactivar la protección (permaneciendo en modo formulario, por supuesto...).
Elemento importante a conocer: no van a insertar las capturas de pantalla por la función de inserción de imágenes, sino que procederán por COPIAR/PEGAR.
Por lo tanto, he creado un botón "pegar mi captura de pantalla" en el documento para este fin.
En resumen, la macro asociada hace pocas cosas: desactiva la protección, alcanza el punto de inserción definido por un marcador (llamado "ECRAN"), sube una línea, pega y reactivan la protección.
Por todo esto, no tengo problema.
Lo que no logro hacer es forzar el redimensionamiento de la imagen pegada para que no exceda el área de texto.
He intentado usar el grabador para obtener los comandos de gestión del tamaño de la imagen seleccionada, pero, para mi gran desconsuelo, cuando detengo la grabación, la macro creada está simplemente... VACÍA :((
He probado muchas cosas que encontré en la red, pero nada me permite actuar sobre este objeto que acabo de pegar, no puedo lograrlo. Estoy dispuesto a aprender, especialmente sobre los elementos como "InlineShapes", porque por ahora no entiendo cómo funciona.
Aquí está mi código de inicio, para lo que pueda interesar...
Gracias una vez más mil veces por su ayuda a todos.
Private Sub CommandButton11_Click()
'Si el documento está protegido, desprotegerlo.
If ActiveDocument.ProtectionType <> wdNoProtection Then
ActiveDocument.Unprotect Password:=""
End If
Selection.GoTo What:=wdGoToBookmark, Name:="ECRAN"
Selection.MoveUp Unit:=wdLine, Count:=1
Selection.Paste
'Reproteger el documento.
If ActiveDocument.ProtectionType = wdNoProtection Then
ActiveDocument.Protect Type:=wdAllowOnlyFormFields, _
NoReset:=True
End If
End Sub
Primero, de manera colectiva, gracias a todos los miembros del foro por todas las valiosas enseñanzas de las que he beneficiado gracias a ustedes desde hace tanto tiempo. He aprendido más del 50% de lo que sé gracias a ustedes :)
Bueno, por otra parte, por primera vez tengo un problema para el cual no he encontrado ninguna respuesta en ningún lado... Lo coloco en el foro de Burocracia un poco al azar, espero no estar equivocado...
Situación de partida: uso de un documento en modo Formulario bajo word 2007 (con las áreas de entrada, las listas desplegables, la protección activada para ingresar solo en los campos y todo eso).
Pongo este documento a disposición de los usuarios que deben poder insertar capturas de pantalla sin desactivar la protección (permaneciendo en modo formulario, por supuesto...).
Elemento importante a conocer: no van a insertar las capturas de pantalla por la función de inserción de imágenes, sino que procederán por COPIAR/PEGAR.
Por lo tanto, he creado un botón "pegar mi captura de pantalla" en el documento para este fin.
En resumen, la macro asociada hace pocas cosas: desactiva la protección, alcanza el punto de inserción definido por un marcador (llamado "ECRAN"), sube una línea, pega y reactivan la protección.
Por todo esto, no tengo problema.
Lo que no logro hacer es forzar el redimensionamiento de la imagen pegada para que no exceda el área de texto.
He intentado usar el grabador para obtener los comandos de gestión del tamaño de la imagen seleccionada, pero, para mi gran desconsuelo, cuando detengo la grabación, la macro creada está simplemente... VACÍA :((
He probado muchas cosas que encontré en la red, pero nada me permite actuar sobre este objeto que acabo de pegar, no puedo lograrlo. Estoy dispuesto a aprender, especialmente sobre los elementos como "InlineShapes", porque por ahora no entiendo cómo funciona.
Aquí está mi código de inicio, para lo que pueda interesar...
Gracias una vez más mil veces por su ayuda a todos.
Private Sub CommandButton11_Click()
'Si el documento está protegido, desprotegerlo.
If ActiveDocument.ProtectionType <> wdNoProtection Then
ActiveDocument.Unprotect Password:=""
End If
Selection.GoTo What:=wdGoToBookmark, Name:="ECRAN"
Selection.MoveUp Unit:=wdLine, Count:=1
Selection.Paste
'Reproteger el documento.
If ActiveDocument.ProtectionType = wdNoProtection Then
ActiveDocument.Protect Type:=wdAllowOnlyFormFields, _
NoReset:=True
End If
End Sub
Configuración: Windows 7 32 bits Internet Explorer 8.0 Office 2007
18 respuestas
-
Hola,
Siempre digo que es mejor reservar las macros cuando es indispensable. Porque realmente generan bastantes problemas. Siempre hay alguien que no ha activado las macros, se recuperan archivos para crear otro, y ¡zas!, se pierde la macro en el camino, etc.
Porque si juzgo tu modelo a través de tus explicaciones, y dado que usas Word 2007, ¡no hay necesidad de macros en absoluto!
- Inserción de campos de formulario 2007
- Creación de la celda de tabla para la imagen
- Protección: proteger todo (sin modificaciones)
- Selección de los campos de formulario y de la tabla
- Marcar Excepción => todo el mundo
¡Y listo! tienes una plantilla ligera, protegida, que todo el mundo puede usar sin problemas.
También hay que pensar en una cosa: si el usuario decide cambiar la imagen, volverá a usar tu macro que solo pegará una nueva imagen, y la primera siempre estará allí.
En fin... en mi opinión, o hay que macroizar más que eso, o olvidar las macros.
m@rina
--
- "En el foro de ofimática, se hacen preguntas sobre ofimática..."
- "¿De verdad???" -
Hola,
Primero, aclaro que no conozco VBA en Word...
Sin embargo, he visto en la ayuda que se puede asignar a "InlineShapes" un valor de height (altura) y de width (anchura). Creo que hay que ver por ese lado.
Visto en CCM también: aquí esto:Selection.InlineShapes(1).LockAspectRatio = msoTrue Selection.InlineShapes(1).Height = tu altura Selection.InlineShapes(1).Width = tu anchura
--
Cordialmente, y ..... ¡Feliz Año Nuevo, mis mejores deseos para 2010!!!
-- Todo problema tiene su solución. Si no hay solución, ¿dónde está el problema? -- -
Gracias Pikaju
Pero no funciona :(
Tengo un error "5941" El miembro de la selección requerido no existe.
Creo que el problema viene del hecho de que la imagen está pegada y no insertada mediante la función de inserción de Word.
Llevo 2 semanas manipulando los inlineshapes sin realmente entender lo que estoy haciendo y sin éxito... -
Aquí está la nueva macro, la que provoca el error de ejecución 5941:
Private Sub CommandButton11_Click()
'Si el documento está protegido, desprotéjalo.
If ActiveDocument.ProtectionType <> wdNoProtection Then
ActiveDocument.Unprotect Password:=""
End If
Selection.GoTo What:=wdGoToBookmark, Name:="ECRAN"
Selection.MoveUp Unit:=wdLine, Count:=1
Selection.Paste
Selection.InlineShapes(1).LockAspectRatio = msoTrue
Selection.InlineShapes(1).Height = 200
Selection.InlineShapes(1).Width = 200
' Reproteger el documento.
If ActiveDocument.ProtectionType = wdNoProtection Then
ActiveDocument.Protect Type:=wdAllowOnlyFormFields, _
NoReset:=True
End If
End Sub
Me pregunto si debería definir una variable para declarar el objeto que estoy pegando.
Bajo Excel, no me haría esta pregunta, pero aquí en Word, y además en 2007, estoy batallando y enfrentándome a la pared... -
¡Por Dios, hay que encontrar...
Prueba esta macro que no tiene nada que ver, es una prueba. Si he entendido bien, no se trata de un objeto InlineShapes porque tu imagen está enmarcada. Se trata de un objeto Shapes. Esta macro te lo dirá:
fuentesSub TestTypeImage() Dim i As Integer If Not IsNull(ActiveDocument.InlineShapes.Count) Then i = ActiveDocument.InlineShapes.Count MsgBox "¡Su documento contiene " & _ i & vbCrLf & " imágenes del tipo InlineShape!" End If If Not IsNull(ActiveDocument.Shapes.Count) Then i = ActiveDocument.Shapes.Count MsgBox "¡Su documento contiene " & _ ActiveDocument.Shapes.Count & vbCrLf & " imágenes del tipo Shape!" End If End Sub
Shapes e InlineShapes tienen las mismas propiedades, así que después de esto debería funcionar con .width y .height
--
Atentamente, y ..... ¡Feliz Año, mis mejores deseos para 2010!!!
-- Todo problema tiene su solución. Si no hay solución, ¿dónde está el problema? -- -
¡TRUCO INCREÍBLE!
Totalmente delirante
Ejecuté la macro antes de hacer clic en mi botón y descubrí que tenía 3 inlineshapes y 4 shapes.
La volví a ejecutar después de mi botón pegar imagen, y el contador de Inlineshapes pasa a 4 mientras que el shapes se mantiene en 4.
Moraleja, ¡sí crea un Inlineshapes! ¡El truco que descubro es que ya tenía 3! :o
Por supuesto, el biniou no sabe muy bien con quién tiene que hablar...
¡Eres un campeón! :)
Desesperaba por no haber pensado en hacer esta prueba. Es duro envejecer :((((( lol -
Solo es un comienzo, una pista.
Tan pronto como tu código funcione, vuelve a publicarlo aquí para que sirva a futuros aficionados a redimensionar imágenes en VBA de Word...
Y luego coloca este tema como "resuelto".
--
Cordialmente, y ..... ¡Feliz Año Nuevo, mis mejores deseos para 2010!!!
-- Todo problema tiene su solución. Si no hay solución, ¿dónde está el problema? -- -
Hola,
Si el objetivo es obtener una imagen de un tamaño específico, la macro es totalmente innecesaria.
Simplemente hay que trazar una celda de tabla con las dimensiones correctas de ancho, luego en las propiedades de la tabla, ir a opciones y desmarcar la opción "Ajustar automáticamente al contenido".
Esto también ayudará a mantener las proporciones de la imagen.
m@rina
--
- "En el foro de ofimática, se hacen preguntas sobre ofimática..."
- "¿De verdad??? -
Pfffffffff...
He conservado tu propuesta de código y, muy ingenuamente, transformé el pequeño (1) en (4), pensando que era la solución para que pudiera recuperar la imagen pegada.
No hay nada que hacer, error 5941
Al buscar en otros foros, vi cosas que decían que el error 5941 estaba relacionado con una historia de ActiveDocument...
no me suena, ¿y a ti? -
¡Gracias Marina!
Efectivamente, es un enfoque simple y efectivo. Te agradezco por este consejo.
Por otro lado, quizás sea terco, obstinado o simplemente necio, pero ahora que he estado trasteando con este código durante una semana, confieso que me cuesta soltarlo y rendirme... me gustaría entender qué no funciona, solo por mi cultura personal...
¡Pero gracias de nuevo! -
Sí, te entiendo.
Tu problema debe venir del hecho de que, cada vez que insertas una imagen, el "contador" de inlineshape se incrementa y no sabes a cuántas va. Ahí deberías haber puesto 5, porque 4 ya estaba hecho...
Intenta así:
Dim i As Integer i = ActiveDocument.InlineShapes.Count Selection.InlineShapes(i).LockAspectRatio = msoTrue Selection.InlineShapes(i).Height = 200 Selection.InlineShapes(i).Width = 200
De lo contrario, por supuesto, me uno a Marina (¡saludos!).
--
Cordialmente, y..... ¡Feliz Año, mis mejores deseos para 2010!
-- Todo problema tiene su solución. Si no hay solución, ¿dónde está el problema? -- -
Sí, no es falso...
Me has convencido (¡aunque me molesta no haberlo entendido!)
Gracias de nuevo a los dos. -
Pijaku, no funciona :( Gracias por tu perseverancia.
No entiendo por qué y tengo la impresión de que nunca lo entenderé.
¿Pongo el tema como resuelto o no? -
Test primero esto:
Dim i As Integer i = ActiveDocument.InlineShapes.Count ActiveDocument.InlineShapes(i).Select Selection.InlineShapes(i).LockAspectRatio = msoTrue Selection.InlineShapes(i).Height = 20 Selection.InlineShapes(i).Width = 500
y si funciona, márcalo como resuelto...
--
Atentamente, y ..... ¡Feliz Año, mis mejores deseos para 2010!!!
-- Todo problema tiene su solución. Si no hay solución, ¿cuál es el problema? -- -
Nada que hacer
Siempre el mismo error de ejecución :(
No entiendo. -
Entonces consideremos que Marina tiene la mejor solución.
como siempre rrrrrrh!!!
¡buen día a ustedes dos!
--
Atentamente, y ..... ¡Feliz Año Nuevo, mis mejores deseos para 2010!!!
-- Todo problema tiene su solución. Si no hay solución, ¿dónde está el problema?
-- -
Re...
¡Veo que nos estamos volviendo razonables!!! ;))
No he seguido si son formas o inlineshapes, pero aquí tienes un ejemplo de código (¡para que no te enojes demasiado!;)) que dará un ancho de 200 pt a todas las imágenes InlineShapes del documento activo.
Sub dibujos() Dim imagen For Each imagen In ActiveDocument.InlineShapes imagen.Width = 300 imagen.LockAspectRatio = True Next imagen End Sub
m@rina
--
- "En el foro de ofimática, se hacen preguntas sobre ofimática..."
- "¿Ah, sí???" -
Hola,
Tengo una respuesta directa a la pregunta inicial: creo que el problema viene de que el gráfico que acabamos de insertar no está seleccionado, por lo tanto, cualquier comando que haga referencia a la lista de InlineShapes de la selección provoca un error.
2 soluciones: o bien seleccionamos el gráfico que acabamos de insertar:
Selection.InlineShapes.AddPicture FileName:="mi archivo gráfico"
Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
Selection.InlineShapes(1).LockAspectRatio = msoTrue
Selection.InlineShapes(1).Height = CentimetersToPoints(10)
o bien llamamos a la colección de InlineShapes desde el documento activo (lo cual me parece más elegante):
Selection.InlineShapes.AddPicture FileName:="mi archivo gráfico"
ActiveDocument.InlineShapes(ActiveDocument.InlineShapes.Count).LockAspectRatio = msoTrue
ActiveDocument.InlineShapes(ActiveDocument.InlineShapes.Count).Height = CentimetersToPoints(10)
Espero que esto le guste a Pijaku (que quizás haya pasado a otra cosa desde entonces...)