Visual Basic para Aplicaciones - problema acceder a image de userform

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil
Val: 14
Ha aumentado 1 puesto en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

problema acceder a image de userform

Publicado por lluis (8 intervenciones) el 29/05/2019 12:23:02
Hola resulta que tengo un problema para acceder a una imagen en un formulario.

quiero hacer una función que pasándole el índice de un bucle y un valor me muestre u oculte ciertas imágenes.

El índice se corresponde a los tanques y el valor al nivel de estos.

las imágenes con distintos niveles tienen el formato image111_1, image_111_2 , image111_3.

Y resulta que el índice que quiero ir recorriendo es el número de la unidad de la image (por lo tanto el tanque), es decir. Image11indice_1 etc.

Con tal de saber como acceder a cada una de las imágenes del formulario desde la función me basta, ya que luego la programación la tengo clara, utilizando case y la opción .visible de cada image.

Un saludo, y muchas gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

problema acceder a image de userform

Publicado por Antoni Masana (498 intervenciones) el 29/05/2019 19:02:49
En primer lugar seria interesante saber a que sistema pertenece el formulario, quiero decir: Excel, Visual Basic 6, Visual Basic Net, etc.

Cuando dices: las imágenes con distintos niveles tienen el formato image111_1, image_111_2 , image111_3.

Como debo interpretar image111_1 ¿Es el nombre del fichero de la imagen? ¿Es el nombre del objeto que contiene la imagen?

Se me ocurre varias formas de mostrar imágenes en función de una selección previa. Una forma simple es

1
2
3
Imagen_111_1.Visible = Iif(Imagen_11 And  Indice_1, True, False)
Imagen_111_2.Visible = Iif(Imagen_11 And  Indice_2, True, False)
Imagen_111_3.Visible = Iif(Imagen_11 And  Indice_3, True, False)

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 14
Ha aumentado 1 puesto en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

problema acceder a image de userform

Publicado por lluis (8 intervenciones) el 29/05/2019 23:09:12
Hola Antoni en primer lugar gracias por responder.

El código es para Excel.

Creo que no me has entendido, seguramente me haya explicado mal.

el nombre de las imagen para por ejemplo un tanques son: image111_1 (nivel bajo) , image111_2 (nivel medio) e image_111_3 (nivel lleno), de entre todos estos quiero mostrar solo uno en un función de un paráemtro nivel que le paso a la función. Pero a su vez no sólo tengo un tanque 111, sino que tengo más, hasta el 116 y consecutivos.

Los nombre de por ejemplo el tanque 112 son: image112_1, image112_2 e image112_3. por lo que como se puede ver necesito recorrer las imágenes en bucle en función del tercer dígito, y es ahí donde tengo el problema que no se como poder llamar a estas imágenes en el userform.

Espero haberme explicado. Un saludo y gracias de antemano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

problema acceder a image de userform

Publicado por Antoni Masana (498 intervenciones) el 30/05/2019 16:24:24
Esta es una opción pero hay mas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Sub Mostrar_Tanque(Tanque, Nivel)
    IF Tanque = 111 Then
       Imagen111_1.Visible = IF(Nivel=1, True, False)
       Imagen111_2.Visible = IF(Nivel=2, True, False)
       Imagen111_3.Visible = IF(Nivel=3, True, False)
    End If
 
    IF Tanque = 112 Then
       Imagen112_1.Visible = IF(Nivel=1, True, False)
       Imagen112_2.Visible = IF(Nivel=2, True, False)
       Imagen112_3.Visible = IF(Nivel=3, True, False)
    End If
 
    IF Tanque = 113 Then
       Imagen113_1.Visible = IF(Nivel=1, True, False)
       Imagen113_2.Visible = IF(Nivel=2, True, False)
       Imagen113_3.Visible = IF(Nivel=3, True, False)
    End If
 
    IF Tanque = 114 Then
       Imagen114_1.Visible = IF(Nivel=1, True, False)
       Imagen114_2.Visible = IF(Nivel=2, True, False)
       Imagen114_3.Visible = IF(Nivel=3, True, False)
    End If
 
    IF Tanque = 115 Then
       Imagen115_1.Visible = IF(Nivel=1, True, False)
       Imagen115_2.Visible = IF(Nivel=2, True, False)
       Imagen115_3.Visible = IF(Nivel=3, True, False)
    End If
 
    IF Tanque = 116 Then
       Imagen116_1.Visible = IF(Nivel=1, True, False)
       Imagen116_2.Visible = IF(Nivel=2, True, False)
       Imagen116_3.Visible = IF(Nivel=3, True, False)
    End If
End Sub

Llamas al procedimiento le dices el tanque y el nivel , se apaga cualquiera de los otros dos niveles y se activa el que le pasas.

Supongamos que tienes una tabla de 6 elementos que llamo Niveles que son los niveles de los 6 tanques y quieres refrescar las imágenes:

1
2
3
For a = 1 to 6
    Call Mostrar_Tanque(110 + a, Niveles(a))
Next

NOTA: Tambien puedes simplificarlo y en los IF poner:

1
IF Tanque = 1 Then

y poner

1
2
3
For a = 1 to 6
    Call Mostrar_Tanque(a, Niveles(a))
Next


Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 14
Ha aumentado 1 puesto en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

problema acceder a image de userform

Publicado por lluis (8 intervenciones) el 31/05/2019 12:46:13
Muchas gracias de nuevo Antoni, la solución es válida pero yo lo que me quiero ahorrar es todo el código picado, es decir evitar tener que escribit el nombre de cada uno de los tanques *3.

El nivel sería un int pero ya te digo que con eso no tengo problema.

Mi problema sería como hacer esto, que ahora mismo me da error.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Function trat_imagenes(I, nivel)
 
 
'la llamada me pasa un nivel y está dentro de un bucle
 
 
    'Estas asignaciones me dan error
    'Y vienen a ser el principal problema
 
       Set img_ll = UserForm1.Controls.Add("image11" & I & "_3")
       Set img_m = UserForm1.Controls.Add("image11" & I_2)
       Set img_b = UserForm1.Controls.Add("image11" & I_1)
 
        img_ll.Visible = False
        img_m.Visible = False
        img_b.Visible = False
 
 
    Select Case nivel
 
        Case Is > 4000
 
        'Lleno
        img_ll.Visible = True
 
 
        Case 2000 To 4000
 
        'Medio
 
        img_m.Visible = True
 
 
        Case Is < 2000
 
        'Bajo
 
        img_b.Visible = True
 
 
        Case Else
 
        'Caso raro vacío
'        img_ll = False
'        img_m = False
'        img_b = True
 
 
    End Select
 
End Function

Las imágenes ya están dentro del formulario y declaradas pero ni con el set ni con la citación

1
2
3
4
5
'Si consigo asignar esta variable
 
UserForm1.Image111_1
 
'donde la tercera cifra vaya relacionado con un bucle el problema estaría solucionado pero no se como hacerlo

Espero haberme explicado bien.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

problema acceder a image de userform

Publicado por Antoni Masana (498 intervenciones) el 01/06/2019 12:42:07
He dado formato a tu código y veo cosas curiosas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
' ---&--- la llamada me pasa un nivel y está dentro de un bucle
'         Estas asignaciones me dan error
'         Y vienen a ser el principal problema
 
Function trat_imagenes(I, nivel)
    Set img_ll = UserForm1.Controls.Add("image11" & I & "_3"):  img_ll.Visible = False
    Set img_m  = UserForm1.Controls.Add("image11" & I & "_2"):  img_m.Visible = False
    Set img_b  = UserForm1.Controls.Add("image11" & I & "_1"):  img_b.Visible = False
 
    Select Case nivel
        Case Is > 4000:    img_ll.Visible = True   ' -- Lleno
        Case 2000 To 4000: img_m.Visible = True    ' -- Medio
        Case Is < 2000:    img_b.Visible = True    ' -- Bajo
    End Select
End Function

Cuando añades la imágenes 2 y 1 ¿De donde salen las variables I_2 y I_1? Me tiene intrigado.

El Case Else ¿he revisado toda la gama de números naturales y no encuentro ninguno que no sea mayor de 4000 ni menor de 2000 y no este comprendido entre estos dos valores?

A parte de estos dos detalles no se cual puede ser el problema. Ya me contaras.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 14
Ha aumentado 1 puesto en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

problema acceder a image de userform

Publicado por lluis (8 intervenciones) el 02/06/2019 19:56:33
Hola de nuevo Antoni.

Las imágenes que tengo en el userform vienen a ser image111_3, image_111_2 e image111_1 y las del siguiente tanque image112_1, image112_2 e image112_3 ....

mi idea era antes de entrar al case asignarlas a otras variables que pueda usarlas fácilmente sin tener que volver a escribir todos los nombre de nuevo, que son unos cuantos.

Pero como habrás podido comprobar las líneas del set dan error.

Por lo que me comentas de los números naturales no alcanzo a comprenderte. yo puedo tener un tanque con un nivel de 0 hasta algo más de 4000.

Un saludo, espero haber podido ayudarte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

problema acceder a image de userform

Publicado por Antoni Masana (498 intervenciones) el 03/06/2019 01:39:21
Dos cosas:

El error de los SET se debe a que tienes mal escrito la asignación de la imagen:

Este es tu código:

1
2
3
4
Function trat_imagenes(I, nivel)
       Set img_ll = UserForm1.Controls.Add("image11" & I & "_3")
       Set img_m = UserForm1.Controls.Add("image11" & I_2)
       Set img_b = UserForm1.Controls.Add("image11" & I_1)

Y este es el mio con la corrección:

1
2
3
4
Function trat_imagenes(I, nivel)
    Set img_ll = UserForm1.Controls.Add("image11" & I & "_3"):  img_ll.Visible = False
    Set img_m  = UserForm1.Controls.Add("image11" & I & "_2"):  img_m.Visible = False
    Set img_b  = UserForm1.Controls.Add("image11" & I & "_1"):  img_b.Visible = False

Fíjate que en tu código usas esto: "image11" & I_2 en lugar de esto: "image11" & I & "_2"


En segundo lugar lo de los números naturales era un poco de ironía sin intención de molestar, cuando el tanque este vacío el valor sera 0 que es menor de 2000 por lo que el Case Else no se ejecuta y por lo tanto sobra.


A mi hay algo que me mosque un poco y es el hecho de que cada vez que se llama a la función añadas la imagen al control, porque me temo que cada vez añades una imagen se acumula a las ya existentes y debajo hay un montón de ellas. Tu solo ves una dando la sensación de que solo hay una y esto perjudique al rendimiento del proceso.


Si sigues teniendo problemas con las imágenes puedes enviarlo a mi correo ([email protected]) y le doy un vistazo.

Saludos.
\\//
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 14
Ha aumentado 1 puesto en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

problema acceder a image de userform

Publicado por lluis (8 intervenciones) el 03/06/2019 11:08:07
Hola Antoni buenos días.

Lo del case else es porque en ocasiones he visto valaores negativos (se que parece extraño pero los he visto jj). Está ya pues claro el tema de lo de los números.

Comprendo el problema que comentas de añadir imágenes, pero no se como cargar imágenes ya previamente puestas en un userform de manera índice como hemos venido haciendo.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de MIGUEL
Val: 424
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

problema acceder a image de userform

Publicado por MIGUEL (121 intervenciones) el 01/06/2019 22:38:52
Buenas.

Disculpen la intromisión.

No veo el porque cargar tantos controles al userform, en mi humilde opinion creo que es mejor crear el userform desde el principio por ejemplo los 48 textbox que se llamen textbox1 al 48 y las imagenes Image1 a las 48 todos bien alineaditos imagen1 al lado del textbox1 y asi nos complicamos menos la vida, para asi asignar la imagen correspondiente al valor del textbox que se utilize en ese momento ya el codigo seria mas facil, solo tendriamos que poner en el evento exit de cada textbox la llamada a la macro.
1
Call ModuloF.imagenes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub imagenes()
    Dim ruta As String
    Dim ruta2 As String
    Dim ruta3 As String
    ruta = "C:\Users\Miguel\Documents\GESTOR BASIC\IMAGENES\CROMAX.jpg"
    ruta2 = "C:\Users\Miguel\Documents\GESTOR BASIC\IMAGENES\PPG.jpg"
    ruta3 = "C:\Users\Miguel\Documents\GESTOR BASIC\IMAGENES\logo.jpg"
    For i = 1 To 48
        Select Case UserForm1.Controls("TextBox" & i).Value     'aqui puede ir tambien .Controls("txtTanque" & i).value o el nombre que le quieras poner a los textbox
            Case Is = ""
 
            Case Is < 2000
                UserForm1.Controls("Image" & i).Picture = LoadPicture(ruta)  'aqui puede ser .Controls("imgTanque" & i).Picture
            Case Is <= 4000
                UserForm1.Controls("Image" & i).Picture = LoadPicture(ruta2)
            Case Is > 4000
                UserForm1.Controls("Image" & i).Picture = LoadPicture(ruta3)
            End Select
    Next i
    UserForm1.Repaint
End Sub

Saludos y espero te sirva esta forma
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 14
Ha aumentado 1 puesto en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

problema acceder a image de userform

Publicado por lluis (8 intervenciones) el 02/06/2019 19:59:26
Hola Miguel, agradezco y mucho tu intromisión.

Tu idea me parece genial y visto lo visto me la estoy replanteando. Ya que por lo que veo el bucle que planteo con la variable en el tercer número no parece que sea posible.

Además hay números de tanques no consecutivos por lo que nombrándolos como propones todos serán consecutivos.

Un saludo y muchas gracias por tu intromisión.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

problema acceder a image de userform

Publicado por Antoni Masana (498 intervenciones) el 03/06/2019 12:24:38
Un detalle que no he preguntado es si en formulario es de VBA (Por ejemplo Excel) o VB (Por ejemplo VB6 o VB Net)

Varia uno del otro.

Te envío un ejemplo muy tonto. Abre el libro y pulsa el botón para ver el formulario y el botón del formulario para refrescar. Cada vez que pulsas el botón refresca la imagen del depósito y debajo pone el valor

Tiene 18 depósitos con la siguiente numeraciones, del 11 al 16, del 21 al 26 y del 31 al 36

Cargo tres imágenes en el formulario, una verde que indica vacío o menos de 2000, otro de color llamemoslo naranja para valor entre 2000 y 4000 y uno rojo para valor superior a 4000.

Estas tres imágenes las iré asignando a cada depósito según su capacidad.

La rutina es muy simple y a su vez simplifica la codificación, fijate además que intenta acceder a los depósitos 17, 18, 19, 20, 27, 28, 29 y 30 que no existen pero no tengo problemas ni errores.

Creo que buscabas algo así.


Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 14
Ha aumentado 1 puesto en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

problema acceder a image de userform

Publicado por lluis (8 intervenciones) el 03/06/2019 13:04:56
Hola de nuevo Antoni.

El formulario es vba Excel.

Y el ejemplo es lo que estaba buscando tal cual. Tengo que analizar un poco mas en profundidad el código pero me viene fenomenal para poder aplicarlo.

Muchísimas gracias por tu continuo interés, pese a que se que ha sido algo difícil entenderme.

Un saludo! ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

problema acceder a image de userform

Publicado por Antoni Masana (498 intervenciones) el 03/06/2019 18:23:04
Desde el principio pensé que quizás esto era lo que sería la mejor forma de hacerlo pero no sabia como explicarlo ni como poner un ejemplo.

En el formulario que te he enviado hay tres imágenes que están ocultas en la parte inferior, pero si las cambias de sitio quedan ocultas al ejecutar, de esta forma en formulario es mucho más pequeño que si tienes que añadir 3 imágenes por cada Tanque.

Por otro lado no he puesto comentarios en el código, cosa que no acostumbro ha hacer, si necesitas alguna explicación puedes preguntarme.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

problema acceder a image de userform

Publicado por lluis (8 intervenciones) el 03/06/2019 21:47:59
Se entiende perfectamente no te preocupes. A ver si cuando lo tenga funcionando dejo por aquí copia de mi código adaptado.

Si si he visto las imágenes y que al ejecutarlas están ocultas.

Un saludo y muchas gracias de nuevo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar