Pués al margen de todo, el label funciona perfectamente lo mismo que el picturebox (no es un control image, pese a que el nombre así lo haga creer a primera vista).
He eliminado o comentado el código prescindible o cuya funcionalidad está ausente, para poder centrarme en ambos aspectos, y cuando está en ejecución sea en diseño o compilado funciona correctamente... Adjunto imágenes.
Un botón al efecto, para cambiar el texto del label y hacer visible el picturebox (yo renombre el llabel, eso de label33(0) no es procedente).
Otro botón vuelve a cambiar el texto del label y oculta la imagen:
Ejecutado desde tu propio código, también se comporta como s espera (claro que yo tenía eliminado o comentado la funcinalidad ausente): Esto es, debajo se dan indicaciones al caso...
Así que solo resta pensar que no sucede lo que esperas, porque no llega a ejecutarse. En mi caso gracias al código comentado o eliminado tal posibilidad no se da (ni puede darse). Para que pudiera darse tendría que tener el proyecto completo y así tener todo activo, sin eliminar ni cmentar nada, sin funcionalidad ni dependencias ausentes...
Así que lo que habría que hacer es cerciorarse de si es así o no...
Mirando la funcionalidad del evento click del textbox 'osocial', se aprecian dos puntos de salida del método antes de llegar a las instrucciones que visibilizan el picturebox.
Luego
procede poner código de control que nos aclare (una vez compilado) si se ejecuta o no...1: añadimos un msgbox al comienzo de la función, dentro del primer condicional antes del 'exist sub'...
Private Sub osocial_Click()
Dim bolOSIVASegunPaciente As Boolean
Dim bolPacienteIVASI As Boolean
Dim bolOSIVASI As Boolean
If (osocial.Tag = "X" Or IdOSocial = Me.osocial.ItemData(Me.osocial.ListIndex)) And Es_Alta = False Then
msgbox "Estoy saliendo de 'osocial'... no esperes que se vea la imagen (punto: 1)"
Exit Sub
end if
'...
2: Añadimos otro msgbox, un poco más abajo (también dentro de otro condicional)...
If ((num(Me.idpaciente, 0) = 0) Or (IdOSocial = 0)) Then
msgbox "Estoy saliendo de 'osocial'... no esperes que se vea la imagen (punto: 2)"
Exit Sub
End If
3: Si pasa de dichos puntos (esto es, si sigue en la función), vemos si todavía se ejecuta la parte que visibiliza la imagen...
If nonul(osocial.Text) <> Buscar_Datos("select osocial.nombre from osocial, paciente where osocial.numero = paciente.osocial and paciente.numero = " & nropa) Then
bolOSIVASI = esVer(bd("siniva", "paciente_osocial", "idpaciente = " & nropa))
bolOSIVASegunPaciente = False
imgWarning.Visible = True
msgbox "La imagen debe aparecer..."
Else
nroafiliado = nonul(bd("afiliado", "paciente", "numero =" & nropa))
imgWarning.Visible = False
msgbox "La imagen no aparecerá y si antes se veía ahora se oculta..."
bolOSIVASI = esVer(bd("siniva", "osocial", "nombre = " & nonul(osocial.Text)))
End If
Ahora compila (provisionalmente), con esos msgbox... y ejecútalo para ver si se sale de la función o no, y si no sale si se da el condicional que muestra el picturebox o no...
Si se sale, ya tendrás que mirar esos condicionales al detalle que lo sacan de la fnción....
Un error grave en dicha funcionalidad es desentenderse de los errores... cuando haces:
On Error Resume Next
IdOSocial = Me.osocial.ItemData(Me.osocial.ListIndex)
On Error GoTo 0
'...
Básicamente le estás diciendo que te da igual lo que suceda, así que pueden suceder situaciones incontroladas y por tanto no ser conducido por el código sino por un cúmulo de estados fuera de control, luego es normal que antes un error pueda haber algún comportamiento inesperado.
Ceder antes los errores es perder el control del código.Lo mínimo antes un error es reportasr su código y exponer su mensaje, y en modo debug parar ahí la ejecución para ver de arreglarlo ó entenderlo y dar una respuesta adecuada distinta de: 'sigue como si nada hubiera pasado'...
On Error Resume Next
Private Sub osocial_Click()
Dim bolOSIVASegunPaciente As Boolean
Dim bolPacienteIVASI As Boolean
Dim bolOSIVASI As Boolean
On Error goto ControlarErrores
...
IdOSocial = Me.osocial.ItemData(Me.osocial.ListIndex)
'...
exit sub
ControlarErrores:
msgbox "se ha producido un error no controlado: " & cstr( err.number) & vbcrlf & err.message
err.clear
stop ' <----- para continuar paso a paso con 'F8' y ver el punto donde se produjo el error. Comprobar valore esperados, los recibidos o calculados, etc...
resume next
End sub
...para terminar, como comentario final (al margen de errores)...
- El código es bastante espagueti, la interfaz está recargada, lo que hará que cualquiera que se enfrente a ella 'la tema', pués sentirá que necesitará al menos 6 meses para entenderla por encima. Deberías hacerlo más intuitiva... separando la mayoría de la interfaz delegando a varias ventanas con sendos botones que abran dichas ventanas y se rellenen los datos (sea automática o manualmente por parte del usuario) y luego pueda cancelar o aceptar. Eso haría también que la carga del formulario fuera más fluída y la interfaz asequible, pués cada ventana trataría un aspecto en exclusiva, luego se autoexplica por e título de la misma. - Al tiempo falta ayuda en los Tooltiptext, que faciliten al usuario saber que leches debe poner o para que sirve algo específico...
- Tratas demasiados eventos 'lostfocus', y en todo caso tratándose de datos debería ser el evento 'validate', en otros controles no está justificado... tampoco tiene mucho sentido estar alternando el valor de la propiedad 'KeyPreview',
- Por último los nombres son a menudo desacertados (por no decir inentiligibles)... algo como: 'bolOSIVASI', nadie más que tú tiene forma de saber que es 'OSIVASI', podría ser el nombre de una empresa, de un reglamento, ley o simplemente una conjunción (mal formada) de 2 o 3 palabras (bien formada solo la primera letra de cada palabra sería mayúscula)... ninguna de ellas debería ser el nombre de una variable, en todo caso 'bolEmpresa' (sin importar como rayos se llame la empresa), 'bolReglamento' (sin importar como se llame el dichoso relgamento, aunque tampoco sobran 2 ó 3 letras finales (así: bolReglamentoOSI'), 'bolSiLlevaIVA'...
- Aunque hay algunas fuentes que recomiendan precerder el nombre de una variable por letras o siglas del tipo, yo lo suelo dejar para los objetos, que no hay forma de entender de que se trata, para los tipos primarios, su nombre debe ser tan descriptivo que baste: 'Indice', 'Cantidad', 'Edad' ya sugieren que son numéricos. 'Masculino', 'Activo', 'Visible' ya sugieren que son buleanos. 'TipoSexo', 'DiaDeLaSemana' ya sugieren que son valores enumerado. 'Nombre', 'Ciudad' ya sugiere que se trata de strings... etc...
- Un picturebox, es un control 'caro' en cuanto a recursos, para mostrar una simple imagen tipo icono es preferible usar un control image (que además con su propiedad Stretch a TRUE, peromite ajustar la imagen a las medidas del control.