En un formulario al ejectuarlo me sale el error 91: variable del objeto l bloque width no establecido, no veo el error.

Al ejecutar un formulario me sale el error arriba citado, pero el mismo formulario en otro libro nuevo si que funciona, por muchas vueltas que el doy, no atino con el error. Adjunto la macro del botón aceptar del formulario:

Me estoy volviendo loco y no se que error puede haber.

Esperando vuestras prontas noticias, os saluda atentamente:

Alfredo

Alfredo

2 respuestas

Respuesta
2

Veo que estas destruyendo el objeto dentro del For, eso esta muy bien, excepto cuando su inicialización esta fuera. Tal vez ese no sea el problema, pero tiene toda la pinta de serlo.

Set Objeto = Coleccion

For each item in Coleccion

bla bla

Set Objeto = Nothing

Next

Para la próxima iteracion, el objeto ya no esta en la memoria.

Para resolverlo, debes incluir el Set dentro del For al inicio

PUES SIGUE FALLANDO, SI PONGO EL Set imagenes = ThisWorkbook.VBProject.VBComponents("BUSCARARTICULO").designer.Controls dentro del for each me da el error 13 no coinciden los tipos; pero lo mas curioso, es que si ejecuto este formulario en un libro aparte, si que funciona correctamente.

Es muy raro para mi.

Gracias anticipadas por tu ayuda,

Disculpa mi ignorancia con la version en español de Excel. ¿Ese error es un error de compilación o de Runtime?

Al principio pensé que era de runtime porque estaba la linea amarilla señalada, pero ahora creo que es de compilación. Y si fuera de runtime como podríamos saber que es con la manera en que manejas los errores con los GoTo.

Si es de compilación, pueden ser muchas cosas, ¿estas usando Option Explicit? Si es así, el objeto debe estar declarado al principio del modulo, ya que no lo tienes dentro del sub, supongo que lo has declarado global.

Responde esas preguntas, o puedes compartir el archivo, aunque parece que es bastante extenso.

Esto es un error de Runtime:

Y esto es un error de compilación:

¿Cómo es el tuyo?

Respuesta
1

Veo que estas usando la programación que te recomendé te pregunto: tienes activada esta referencia cuando se programa en VBE como lo estas haciendo necesitas tener esta referencia activa y dos el componente o formulario esta bien escrito "BUSCARARTICULO" no es FRMBUSCARARTICULO"?, puedes compartir el código para ver que esta pasando?

Viendo la imagen de tu macro encuentro varios errores de programación que a continuación enumero en la línea errónea prueba con esta amcro modificada

Private Sub CommandButton1_Click()
MsgBox ("NO TOQUES NADA, PULSA EL BOTON (ACEPTAR)")
Set imagenes = ThisWorkbook.VBProject.VBComponents("buscararticulo").designer.Controls
'MSGBOX IMAGENES 'MSGBOX NO ACEPTA UN OBJETO COMO PARTE DEL MENSAJE
For Each imagen In imagenes
    On Error Resume Next
    valida_foto = imagen.Picture 'LINEA CORREGIDA
    If Err.Number > 0 Then
        buscar_articulo_imagen_a_cargar.Show
        label11 = buscar_articulo_imagen_a_crear.ListBox1.Value
        If label11 <> Empty Then
            With imagen(imagen.Name)
                .Picture = LoadPicture(label11)
                .PictureSizeMode = fmPictureSizeModeStretch
            End With
            Exit For 'EXIT FOR ES MEJOR QUE EXIT SUB, ESTAS BORRANDO EL OBJETO
            'CON CADA CICLO PROBABLEMENTE EL PROBLEMA ESTE AQUI
        End If
    End If
    On Error GoTo 0
Next imagen
Set imagenes = Nothing
Unload buscar_articulo_a_crear
End Sub

Tienes más razón que un santo, no es lo mismo un exit for que un exit sub, pero después de mucho batallar he localizado el problema: y es que antes de cargar este formulario voy a una macro que se ejecuta correctamente, pero al cargar el formulario la primera línea set da el error; te adjunto la macro:

Sub saber_cuadro_imagen_vacio()
'
' saber_cuadro_imagen_vacio Macro
'

'
Set controles = BUSCARARTICULO.Controls
For Each imagen In BUSCARARTICULO.Controls
Nombre = UCase(TypeName(imagen)) = "IMAGE"
If Nombre Then
x = imagen.Name
On Error Resume Next
PNOMBRE = imagen.Picture
If PNOMBRE = Empty Then
MsgBox (x & " VACIO "), vbInformation, "AVISO"
Range("P2") = x
Exit Sub
End If
On Error GoTo 0
End If
Next imagen
End Sub

¿Se podría resolver con un set controles = nothing?, pregunto

Agradecido de antemano te saluda atentamente:

Alfredo

De hecho cada que abres una instrucción set la debes cerrar, con set se crean objetos que ocupan un lugar en la memoria al cual Excel le asigna todas las propiedades implícitas que tiene, al darle SET controles =nothing simplemente estas destuyendo el objeto y liberando la memoria, creo que este problema ya lo habías tenido en tus primeras consultas donde te decía que había que hacerlo con VBE en vez de VBA, dejame ver la macro como ya te lo he dicho programar a como tu lo quieres hacer es un tanto complicado y más sin tener el archivo

la macro ya la cheque igual le hice un cambio te cambie el exit sub por un exit for, funciona bien 

Sub saber_cuadro_imagen_vacio()
'
' saber_cuadro_imagen_vacio Macro
Set controles = BUSCARARTICULO.Controls
For Each imagen In BUSCARARTICULO.Controls
Nombre = UCase(TypeName(imagen)) = "IMAGE"
If Nombre Then
x = imagen.Name
On Error Resume Next
PNOMBRE = imagen.Picture
If PNOMBRE = Empty Then
    MsgBox (x & " VACIO "), vbInformation, "AVISO"
    Range("P2") = x
    Exit For
End If
On Error GoTo 0
End If
Next imagen
Set controles = Nothing
End Sub

Agradecido lpor tu ayuda y explicaciones; efectivamente esta macro funciona, pero el formulario da el error, ya lo he solucionado de otra manera; no ejecuto esta macro que era para saber el primer cuadro de imagen vacio, y en el primer formulario que te he enviado, entre el with y el end with le pongo Range("P2") = imagen.Name y me indica el primer cuadro de imagen vacio; y de esa forma funciona todo correctamente.

Atentamente:

Alfredo

Lo más probable es que en tu formulario el error fuera provocado por la siguiente instrucción, declaras primero el objeto set imágenes, luego pones un ciclo

for each imagen in imagenes

next imagen

y dentro de ese ciclo colocas una instruccion 

for each imagen in imagenes

set imagenes=nothing

next imagen

Lo que va a pasar al poner esta instrucción es que la macro si tienes más de una imagen, en el primer ciclo va a destruir el objeto imagen y en de ahí en adelante al no encontrar el objeto te va a marcar error, por eso en la macro que te envíe modificada elimine esa línea para que el objeto se destruya después de terminar el ciclo. las ordenes set xx=nothing deben ser las ultimas en ser escritas en el programa y antes del end sub y no en los ciclos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas