estoy haciendo una macro para simular la escritura en directo en un
cuadro de texto de la barra de dibujo. Parece funcionar bastante bien,
pero no logro evitar el parpadeo continuo del cursor mientras se
ejecuta. Explico un poco el funcionamiento (y expongo el codigo al
final).
Lo que hace el codigo es ir 'extrayendo' caracter tras caracter de un
texto depositado en una celda de una hoja (oculta) e irlo concatenando
en el cuadro de texto.
para conseguir un retardo de tiempo que permita ver la secuencia de
'escritura' utilizo una funcion de las APIs (facilitada por HM) que
'crea? retardos de x milisegundos en la ejecucion del codigo (no estoy
seguro de que sea esto lo que haga, pero supongo que sera algo asi).
el problema es que no puedo (o al menos no he podido) usar
App...Screenupdating porque entonces oculta el proceso y muestra solo
el resultado final (el texto completo), y no se si hay otra forma para
evitar el parpadeo del cursor, o al menos intentar atenuarlo al maximo.
el codigo es el siguiente (posiblemente haya formas mejores/mas
eficientes de lograr lo mismo ¿quizas con sendkeys?)
Private Declare Sub Retardo Lib "kernel32" _
Alias "Sleep" (ByVal Milisegundos As Long)
Sub EscribirEnVivoCuadroT()
Dim Pos As Byte, Fin As Byte, lt As String
Dim hj As Worksheet
QuitarTexto 'elimina el cuadro de texto si existe
CrearCuadroTexto 'crea un nuevo cuadro de texto
Set hj = ThisWorkbook.Worksheets("Hoja3")
With Worksheets("Hoja1").Range("a1")
Fin = Len(.Value)
hj.Shapes(1).TextFrame.Characters.Text = ""
For Pos = 1 To Fin
lt = .Characters(Pos, 1).Text
DoEvents
Retardo 130
With hj.Shapes(1)
With .TextFrame
.HorizontalAlignment = xlHAlignCenter
With .Characters
With .Font
.Name = "ZephyrScript"
.Size = 16
End With
.Text = .Text & lt
End With
End With
End With
Next
End With
Set hj = Nothing
End Sub
si podeis echarme una mano de nuevo os lo agradezco
un saludo y hasta pronto
Ivan
parece haberse resuelto eliminando la instruccion 'DoEvents', pero me
han quedado un par de dudas:
la verdad es que no acabo de tener claro cuando usar DoEvents. aqui la
inclui porque en el codigo original la tenia incluida (tambien sin
acabar de comprender por que). Dicho codigo mostraba imagenes en una
hoja a modo de presentacion usando tambien la funcion de las APIs y de
alguna de las ayudas del foro deduje que debia incluirlo. ¿puede ser
necesario en este nuevo caso? y de ser asi ¿por que?
y por ultimo, aunque esto supongo que no debe ser dificil de encontrar
en la ayuda, ¿se puede ocultar el cursor durante la ejecucion?
En cualquier caso un saludo y muchas gracias
Ivan
1) el uso del 'DoEvents' [generalmente] es para que 'nuestra' aplicacion no 'acapare' los recursos del cpu
mientras se estan ejecutando 'otros procesos/programas/... [aunque] los 'gasta' revisando los mensajes de las otras aplicaciones :-(
no tiene 'sentido' su uso en un ambiente/sistema 'multitareas' [como windows]
a menos que... [como en el caso donde lo 'sugeria'] necesites la actualizacion de otra aplicacion [como un userform] ;)
-> si ya estas 'familiarizado' con la rutina del retardo/'sleep', el 'equivalente' del DoEvents pudiera ser -> Retardo 0& ;)
2) [hasta donde se]... lo mas que podrias 'adelgazar' el cursor [en excel] mientras se ejecuta un procedimiento...
es a la 'delgadez' de un cursor de tipo 'I' que aparece en los eventos de escritura y deberas restablecerlo al finalizar [p.e.]
Sub Cursores()
Application.Cursor = xlIBeam
Application.Wait Now + TimeSerial(0, 0, 5)
Application.Cursor = xlDefault
End Sub
si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
__ la consulta original __
> ... resuelto eliminando la instruccion 'DoEvents', pero me han quedado un par de dudas:
> ... no acabo de tener claro cuando usar DoEvents... mostraba imagenes en una hoja a modo de presentacion
> ... usando tambien la funcion de las APIs y de alguna de las ayudas del foro deduje que debia incluirlo.
> ... puede ser necesario en este nuevo caso? y de ser asi por que?
> ... por ultimo, aunque... supongo que no debe ser dificil de encontrar en la ayuda, se puede ocultar el cursor durante la ejecucion?
> 1) el uso del 'DoEvents' [generalmente] ........
> no tiene 'sentido' su uso en un ambiente/sistema 'multitareas' [como windows]
> a menos que... [como en el caso donde lo 'sugeria'] necesites la actualizacion de otra aplicacion [como un userform] ;)
efectivamente tu 'sugerencia' fue para el userform de la consulta
inicial, y, de hecho, en ese momento/contexto crei entender (+o-) el
'sentido de DoEvents.
mi 'descoloque' surjio cuando, al 'cargar' las imagenes directamente en
la hoja y prescindir del userform (y por tanto pensar que ya no se
interactuaba con otra aplicacion)
probe a suprimir el doevents en el codigo. El resultado fue que, las
imagenes, en vez de desplazarse mas o menos despacio hasta su ubicacion
final, se abalanzaban en cuestion de un suspiro hasta el. (ahora mismo
se me ha ocurrido que quizas seria cuestion de seguir
jugando con el 'retardo' hasta conseguir un efecto similar). Sin
embargo, esto no ocurre con el cuadro de texto.
es (muy) posible que no haya seguido/entendido bien tu ultimo consejo
de aquella consulta =>
>-> si son pocas [probablemente] convendria mantenerlas en el archivo [obviamente usando la opcion >de vinculadas]
> [es decir... incrustarlas por codigo una sola vez y proveerlas en la misma ubicacion si vas a >distribuir la aplicacion]
> y dejar que el codigo solamente las vaya modificando en dimensiones y posicion -?-
Si puedes explicarme un poco mas a que te referias con => "incrustarlas
por codigo una sola vez y proveerlas en la misma ubicacion ", te lo
agradecere una vez mas.
lo que hago hasta ahora es cargar las imagenes (guardadas en la misma
carpeta) al abrir la presentacion poniendo LinkToFile a true y
SaveWithDocument a false, y al cerrar la presentacion elimino todas las
formas. Esta es la instruccion que las carga:->
MiHj.Shapes.AddPicture "C:\Documents...\...\ Foto" & nroFoto & ".jpg",
msoTrue, _
msoFalse, InIzq, InSup, 142.5, 142.5
supongo que el insertar archivos se considera 'interactuar con otra
aplicacion' ¿ y de ahi DoEvents?
y, para no alargarme mucho mas (me temo que mis lagunas son tan grandes
que cada consulta se acaba convirtiendo en un tomo), y seguir abusando
de tu generosidad ->
> -> si ya estas 'familiarizado' con la rutina del retardo/'sleep', el 'equivalente' del DoEvents pudiera ser -> Retardo 0& ;)
me temo que, aunque poco a poco (creo que) le voy cogiendo el punto,
... familiarizarme, familiarizarme..... ¿podrias explicarme un poco
como usar el 'eqivalente' -> Retardo 0&...?
Bueno, disculpa el rollo, y muchas gracias tambien por el 'cursor', y,
creo que aun mas, por agregar 'Wait' a la saca de mis desconciertos.
Un saludo y hasta pronto
Ivan
PD: tengo un par de consultas mas o menos relacionadas, pero creo que
las pondre en otro hilo para no saturar el post.
1) [hasta donde se]... algunas aplicaciones/eventos/instrucciones/objetos/... requieren +/- recursos 'compartidos' que otras :)
'actualizar' un userform [practicamente] es 'lo mismo' que actualizar un cuadro de texto [aun incrustado en hoja de calculo] ;)
'mover' o cambiar las dimensiones de una imagen [incrustada en hoja de calculo] no requiere del 'DoEvents' [lo anterior... SI] :-(
-> los siguientes codigos [en un modulo general] podrian demostrarlo
asumiendo un cuadro de texto -dibujo- que se llena con el contenido de 'A1' y una imagen [p.e. JPG] incrustada en la hoja
Private Declare Sub Retardo Lib "kernel32" Alias "Sleep" (ByVal Milisegundos As Long)
Sub Escribiendo_en_TextBox()
Dim Nuevo As Byte
With ActiveSheet.Shapes("cuadro de texto 1").TextFrame.Characters
.Text = ""
For Nuevo = 1 To Len([a1])
.Text = .Text & Mid([a1], Nuevo, 1)
DoEvents
Retardo 200
Next
End With
End Sub
Sub Mover_imagenes()
Dim Sig As Byte
With ActiveSheet.Pictures(1)
For Sig = 1 To 20
If .Left = 108 Then .Left = 432 Else .Left = 108
Retardo 200
Next
End With
End Sub
2) mi 'sugerencia' de agregar las imagenes [vinculadas] una sola vez [por codigo] y 'dejarlas' ahi [proveyendo las imagenes]...
se debe a que al insertarlas vinculadas... no conoces con anticipacion las dimensiones 'reales' de la imagen a insertar -?-
y como la instruccion -> Shapes.AddPicture REQUIERE que indiques la posicion y las dimensiones... [seguramente]
estaras 'adivinando/suponiendo/... su 'relacion de aspecto' y no te sera posible 'rescatar' sus dimensiones 'reales' -> al 100%
[a menos que las conozcas previamente, o las 'averigues' antes de insertarla, -quizas por medio de API's-] -?-
3) la -posible- sustitucion de un 'DoEvents' versus un 'Retardo'... seria mas notoria/aplicable/...
-> si necesitas interactuar con otras aplicaciones [como lanzar otra aplicacion desde una instruccion 'Shell' o similar] :))
si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
__ la consulta original __
__ 1 __
>> 1) el uso del 'DoEvents' [generalmente] ........
>> no tiene 'sentido' su uso en un ambiente/sistema 'multitareas' [como windows]
>> a menos que... [como en el caso donde lo 'sugeria'] necesites la actualizacion de otra aplicacion [como un userform] ;)
>
> efectivamente tu 'sugerencia' fue para el userform... y... en ese momento/contexto crei entender (+o-) el 'sentido de DoEvents.
> mi 'descoloque' surjio cuando, al 'cargar' las imagenes directamente en la hoja y prescindir del userform
> (y por tanto pensar que ya no se interactuaba con otra aplicacion) probe a suprimir el doevents en el codigo.
> El resultado fue que, las imagenes, en vez de desplazarse mas o menos despacio hasta su ubicacion final
> se abalanzaban en cuestion de un suspiro hasta el.
> (ahora mismo se me ha ocurrido que quizas seria cuestion de seguir jugando con el 'retardo' hasta conseguir un efecto similar).
> Sin embargo, esto no ocurre con el cuadro de texto.
__ 2 __
> es (muy) posible que no haya seguido/entendido bien tu ultimo consejo de aquella consulta =>
>>-> si son pocas [probablemente] convendria mantenerlas en el archivo [obviamente usando la opcion >de vinculadas]
>> [es decir... incrustarlas por codigo una sola vez y proveerlas en la misma ubicacion si vas a >distribuir la aplicacion]
>> y dejar que el codigo solamente las vaya modificando en dimensiones y posicion -?-
>
> Si puedes explicarme un poco mas a que te referias con => "incrustarlas por codigo una sola vez y proveerlas en la misma ubicacion"...
> lo que hago hasta ahora es cargar las imagenes (guardadas en la misma carpeta) al abrir la presentacion
> poniendo LinkToFile a true y SaveWithDocument a false, y al cerrar la presentacion elimino todas las formas.
> Esta es la instruccion que las carga:->
> MiHj.Shapes.AddPicture "C:\Documents...\...\ Foto" & nroFoto & ".jpg", msoTrue, _
> msoFalse, InIzq, InSup, 142.5, 142.5
> supongo que el insertar archivos se considera 'interactuar con otra aplicacion' y de ahi DoEvents?
__ 3 __
> y, para no alargarme mucho mas (me temo que mis lagunas son tan grandes que cada consulta se acaba convirtiendo en un tomo)...
>
>> -> si ya estas 'familiarizado' con la rutina del retardo/'sleep', el 'equivalente' del DoEvents pudiera ser -> Retardo 0& ;)
>
> me temo que, aunque poco a poco (creo que) le voy cogiendo el punto, ... familiarizarme, familiarizarme....
> podrias explicarme un poco como usar el 'eqivalente' -> Retardo 0&...?
> ... gracias... por el 'cursor', y, creo que aun mas, por agregar 'Wait' a la saga de mis desconciertos...
por lo que se ve no habia dado pie con bola. Creo que tendre que
replantear bastante la presentacion.
Hay varias cosas que he estado viendo, comparando el funcionamiento
(sobre todo respecto a doevents) de tus codigos y los que yo estoy
usando. Pero prefiero estudiarlas un poco mas antes de comentartelas, y
creo que hoy ya tengo la neurona envuelta en un buen galimatias y
pidiendome un descanso. (por estos lares como que ya va siendo hora).
Si no te importa, mañana te comento lo que voy viendo, tambien
respecto a 'saltarse la presentacion' que ya he conseguido (supongo que
habras visto la otra consulta) pero que en la forma en que lo he hecho,
tambien tiene comportamientos 'curiosillos' cuando se cruza/descruza
con doevents.
un saludo y de nuevo muchas gracias por todo
Ivan
he estado dandole vueltas y mas vueltas a tus palabras, y, claro, ha
ocurrido lo inevitable...he acabado mareado. De ahí un poco la
tardanza.
te comento:
lo 1º que he hecho ha sido cambiar la forma de acceso a las imagenes.
Te confieso que no acabo de entender lo que se refiere a como incrustar
y 'proveer' las imagenes. Lo que he hecho es cargarlas una sola vez por
codigo pero con AddPictures (no consigo ayuda sobre'Pictures', me dice
elemento oculto) y (creo que) vinculadas. Aunque la cuestion tamaño no
seria problema, pues las he adaptado a las medidas que necesito
(gracias a tus macros sobre tamaño/posicion de formas y ventana), pero
aun asi creo que tienes razon y que es mas sencillo/compacto
adjuntarlas con el libro que en una carpeta 'adosada' Ahora en vez de
eliminarlas y volverlas a cargar, lo que hago es jugar con su
visibilidad.
!!! por cierto, me he dado cuenta de que el ID de las formas insertadas
se incrementa aunque las elimines, y aunque cierres la sesion y
empieces de nuevo e incluso para un nuevo libro, el nombre tambien se
incrementa, pero este creo que solo durante la sesion, mientras que el
indice refleja el nº real -> ej. tras mi ultima comprobacion ->
ID:->1103, Name:->Text Box 79, Index:-> 9 (que es el nº real de
formas)
¿esto quiere decir algo?..... aunque supongo que solo es una especie
de registro, la 'imagen' de 1103 'formas' espectrales danzando por el
limbo de mi ordenador me da un poco de 'yuyu'
bueno, a lo que iba, una vez separados el proc. de carga y el de
manipulacion, en este he estado haciendo pruebas con la
inclusion/exclusion de doevents, y sigo sin acabar de aclararme. Si lo
omito con las imagenes no parece pasar nada (malo), pero ya no van
paseandose sino a la carrera hasta su sitio final. y si lo omito con el
cuadro de texto, parece no pasar nada (e incluso a veces creo que no
pasa) pero a veces de repente escribe como que no, o no muestra la
secuencia completa de escritura, sino solo el principio y de repente lo
muestra completo, o si intento cancelar con el boton (con la variable
boolean) se me cuelga.
bueno, que de momento, y si tu no ves riesgo de corrupcion o similar
para el archivo, he optado por dejar ambas, a la espera de tus
comentarios
y finalmente, respecto a saltarse la presentacion, y aunque
probablemente acabe usando tu propuesta, he estado haciendo pruebas
con la variable boolean asignada al boton y no parece ir mal, pero
'ensucia' el codigo bastante, aparte de que puedan existir otros
riesgos, sobre todo si intento restringir el uso del teclado, o sus
efectos durante la presentacion.
si no te importa, y aunque abultan considerablemente, pongolos codigos
principales para que los eches un ojo si puedes.
Un saludo y hasta pronto
Ivan
Option Explicit
Private Declare Sub Retardo Lib "kernel32" _
Alias "Sleep" (ByVal Milisegundos As Long)
Public Saltar As Boolean
Sub CerrarPresentacion3()
Saltar = True
End Sub
Private Function Salida(ByVal hj As Worksheet, ByVal Salir As Boolean)
As Boolean
If Salir = False Then
Salida = False
Exit Function
Else
Call MostrarMenuHoja3
Set hj = Nothing
Worksheets("Hoja3").Activate
Salida = True
End If
End Function
Sub PruebaInsertarFotos()
Dim MiHj As Worksheet
Dim InSup As Single, InIzq As Single
Dim IncreSup As Single, IncreIzq As Single
Dim Ancho As Single, Alto As Single
Dim nroFoto As Single
Set MiHj = ThisWorkbook.Worksheets(2)
With MiHj.Buttons.Add(610, 520, 150, 20)
.Caption = "Saltar presentacion"
.OnAction = "CerrarPresentacion3"
End With
For nroFoto = 2 To 8
Ancho = 142.5: Alto = 142.5
Select Case nroFoto
Case 2: InSup = 381.25: InIzq = 600.5: IncreSup = -1: IncreIzq =
-1
Case 3: InSup = 235: InIzq = 600.5: IncreSup = 0: IncreIzq = -1
Case 4: InSup = 90: InIzq = 600.5: IncreSup = 1: IncreIzq = -1
Case 5: InSup = 90: InIzq = 20: IncreSup = 1: IncreIzq = 1
Case 6: InSup = 235: InIzq = 20: IncreSup = 0: IncreIzq = 1
Case 7: InSup = 381.25: InIzq = 20: IncreSup = -1: IncreIzq = 1
Case 8: InSup = 245: InIzq = 175.5: IncreSup = 1: IncreIzq = 1
Ancho = 435.37: Alto = 580
End Select
Application.ScreenUpdating = False
MiHj.Shapes.AddPicture "C:\Documents and Settings\Ivan\" & _
"Mis documentos\Libreria 3-7\Introduccion\Foto" & nroFoto & _
".jpg", msoTrue, _
msoTrue, InIzq, InSup, Ancho, Alto
MiHj.Shapes(nroFoto).Visible = msoFalse
Next
With MiHj.Shapes.AddLabel(msoTextOrientationHorizontal, _
110.25, 20.25, 423.75, 349.5)
.Placement = xlFreeFloating
.ScaleHeight 25.5, msoFalse: .ScaleWidth 60.5, msoFalse
.IncrementLeft 80: .IncrementTop 60
With .TextFrame
.HorizontalAlignment = xlHAlignCenter
With .Characters.Font
.Name = "ZephyrScript"
.Size = 24
End With
End With
.Visible = msoFalse
End With
Set MiHj = Nothing
End Sub
Sub ProbarLlamadaFotos()
Dim MiHj As Worksheet, Celda As Range
Dim InSup As Single, InIzq As Single
Dim IncreSup As Single, IncreIzq As Single
Dim Ancho As Single, Alto As Single
Dim nroFoto As Single, MilSeg As Long
Dim Pos As Byte, Fin As Byte, lt As String
Set MiHj = ThisWorkbook.Worksheets(2)
MiHj.Shapes(1).Visible = msoCTrue
For nroFoto = 2 To 8
If Salida(MiHj, Saltar) = True Then Exit Sub
Ancho = 142.5: Alto = 142.5
Select Case nroFoto
Case 2: InSup = 381.25: InIzq = 600.5: IncreSup = -1: IncreIzq =
-1
Case 3: InSup = 235: InIzq = 600.5: IncreSup = 0: IncreIzq = -1
Case 4: InSup = 90: InIzq = 600.5: IncreSup = 1: IncreIzq = -1
Case 5: InSup = 90: InIzq = 20: IncreSup = 1: IncreIzq = 1
Case 6: InSup = 235: InIzq = 20: IncreSup = 0: IncreIzq = 1
Case 7: InSup = 381.25: InIzq = 20: IncreSup = -1: IncreIzq = 1
Case 8: InSup = 245: InIzq = 175.5: IncreSup = 1: IncreIzq = 1
Ancho = 435.37: Alto = 580
End Select
Application.ScreenUpdating = False
With MiHj.Shapes(nroFoto)
.Left = InIzq: .Top = InSup
.LockAspectRatio = msoTrue
.Placement = xlFreeFloating
.ScaleHeight 0.01, True
.Visible = msoCTrue
Application.ScreenUpdating = True
For MilSeg = 1 To 100
If Salida(MiHj, Saltar) = True Then Exit Sub
.ScaleHeight MilSeg / 100, True, msoScaleFromMiddle
.ScaleWidth MilSeg / 100, True, msoScaleFromMiddle
If nroFoto <> 8 Then
.IncrementLeft 6.33 * IncreIzq
.IncrementTop 3.3 * IncreSup
End If
DoEvents
Retardo 20
Next
End With
Next
If Salida(MiHj, Saltar) = True Then Exit Sub
Application.Wait Now + TimeSerial(0, 0, 5)
With MiHj.Shapes(9): .Visible = msoCTrue
For Each Celda In Worksheets("Hoja1").Range("a1:a" & _
Worksheets("Hoja1").[a65536].End(xlUp).Row)
If Salida(MiHj, Saltar) = True Then Exit Sub
Fin = Len(Celda.Value)
With .TextFrame.Characters: .Text = ""
For Pos = 1 To Fin
If Salida(MiHj, Saltar) = True Then Exit Sub
lt = Celda.Characters(Pos, 1).Text
.Text = .Text & lt
DoEvents
Retardo 125
Next
End With
Application.Wait Now + TimeSerial(0, 0, 3)
Next
End With
Set MiHj = Nothing
MostrarMenuHoja3
NombrarTodosLosShapes
End Sub
> ... confieso que no acabo de entender lo que se refiere a como incrustar y 'proveer' las imagenes.
> Lo que he hecho es cargarlas una sola vez por codigo pero con AddPictures
> (no consigo ayuda sobre'Pictures', me dice elemento oculto) y (creo que) vinculadas.
> ... las he adaptado a las medidas que necesito... pero aun asi creo que tienes razon
> y que es mas sencillo/compacto adjuntarlas con el libro que en una carpeta 'adosada' [...]
> ... por cierto, me he dado cuenta de que el ID de las formas insertadas se incrementa aunque las elimines
> y aunque cierres la sesion y empieces de nuevo e incluso para un nuevo libro, el nombre tambien se incrementa
> pero este creo que solo durante la sesion, mientras que el indice refleja el no. real -> ej. tras mi ultima comprobacion
> -> ID:->1103, Name:->Text Box 79, Index:-> 9 (que es el no, real de formas)
> esto quiere decir algo?... aunque supongo que solo es una especie de registro
> la 'imagen' de 1103 'formas' espectrales danzando por el limbo de mi ordenador me da un poco de 'yuyu' [...]
[precisamente]... el 'control auto-numerado' de [algunos] objetos incrustados en hojas de calculo...
ES [una] de las 'razones' por las que mi sugerencia es 'dejar' las imagenes [incrustadas -pero- vinculadas] en el archivo
so-pena de correr el riesgo de 'corromper' el archivo :))
por el 'resto' de este mensaje... [si me das tiempo para 'digerirlo/analizarlo/probarlo/...?] :D
saludos,
hector.
solo decirte (bueno, aparte de un par de comentarios, como no podia ser
menos en mi caso) que, sin ninguna prisa y por supuesto sin ningun
compromiso, sí te agradeceria tu opinion/correccion sobre los codigos,
y que si te es mas comodo te puedo enviar el archivo con la
presentacion (unos 250 kb en zip) para que lo veas con calma cuando
tengas algun hueco.
y ahora mis 'inevitables' comentarios:
..la verdad es que al ver el incremento del contador me escame
bastante. Te agradezco la aclaracion (llueve sobre mojado).
...lo que no acabo de entender (me temo que me he atascado en otro de
mis problemas con la terminologia) es como/porque se vinculan las
imagenes si estas ya estan 'dentro' de la hoja, o al menos esto es lo
que yo pensaba.
Bueno, disculpa mi torpeza y, en cualquier caso gracias por todo
un saludo y hasta pronto
ivan
> ... te puedo enviar el archivo con la presentacion (unos 250 kb en zip) para que lo veas con calma cuando tengas algun hueco.
no te olvides de adjuntar [alg]unas de las imagenes que manejas [probablemente] en sub-carpeta :))
> ...lo que no acabo de entender... es como/porque se vinculan las imagenes si estas ya estan 'dentro' de la hoja [...]
haz una prueba: dos archivos: uno con una imagen incrustada 'directamente' y otro por 'Shapes.AddPicture' VINCULADO
-> usa un procedimiento NO en el libro [imagen vinculada] para que no se este agregando cada vez que se abre... solo una vez ;)
cierras los lobros... revisas cuanto 'pesan'... los abres de nuevo... y [etc. etc. etc.] ;)
saludos,
hector.