En excel en un formulario con varios cuadros de imagen, saber en que cuadro imagen hago clic para generar una macro

En excel en un formulario con varios cuadros de imagen (Image1, Image2, Image3, Image4, Image5, etc., macro para saber en que cuadro de imagen hago clic y al saber que cuadro de imagen es, ejecutar otra macro segun el cuadro de imagen en que haya hecho click.

Esperando vuestras prontas noticias y agradecido de antemano, os saluda atentamente:

Alfredo blanco

1 respuesta

Respuesta
1

¿Tienes las imágenes dentro de un UserForm?

Si es así, cuando presionas en una imagen, tienes este código:

Private Sub Image1_Click()
  'aquí pon tu código para la imagen 1
End Sub

Si tienes las imágenes en la hoja, qué tipo de imagen son:

- Son Shape

- Insertaste una imagen

- ¿Son imágenes de Control ActiveX?

Son imágenes que tengo la ruta en una hoja, pero la pregunta es otra, me explico:

Al cargar una formulario en initialize, pongo las imágenes en los cuadros de imagen correspondiente; yo lo que quiero es que al hacer clic en un cuadro de imagen, me diga cual es el cuadro de imagen que he clicado, si es image1 o image2 o image3 etc., y a partir de ahí, hacer yo otra macro.

Disculpa la falta de explicación por mi parte, y gracias anticipadas.

Entonces tienes un formulario o "UserForm"

Cada "cuadro de imagen" o "image" tiene su propio evento Click, entonces si tienes 9 imágenes podrías hacer lo siguiente:

Private Sub Image1_Click()
  Call Macro1
End Sub
Private Sub Image2_Click()
  Call Macro1
End Sub
Private Sub Image3_Click()
  Call Macro1
End Sub
Private Sub Image4_Click()
  Call Procesos
End Sub
Private Sub Image5_Click()
  Call Procesos
End Sub
Private Sub Image6_Click()
  Call Procesos
End Sub
Private Sub Image7_Click()
  Call Reporte
End Sub
Private Sub Image8_Click()
  Call Reporte
End Sub
Private Sub Image9_Click()
  Call Reporte
End Sub

¿Cuántas imágenes tienes?

Unos 80 cuadros de imagen, por eso quería saber si puede hacer un bucle para saber cual es el cuadro de imagen en el que hago clic, y no uno por uno.

Nuevamente gracias anticipada y perdona mi ignorancia.

Atentamente:

alfredo

Ah, entonces hay que crear un módulo de Clase "Class Module". De esa forma puedes saber qué image has presionado.

Pero, el siguiente paso es, suponiendo que presionaste click en la image1 o en la image2, qué quieres hacer. Podrías explicar con varios ejemplos qué quieres hacer al presionar las imágenes. Con unos ejemplos es suficiente, no pongas las 80 imágenes.

Pon lo siguiente en tu formulario

Dim Imgs() As New Clase1
Private Sub UserForm_Initialize()
  Dim i As Long, ctrl As MSForms.Control
  For Each ctrl In Me.Controls
    If TypeName(ctrl) = "Image" Then
      i = i + 1
      ReDim Preserve Imgs(i)
      Set Imgs(i).MultImage = ctrl
    End If
  Next
End Sub

Crea un Módulo de Clase. En el menú de VBA, Insertar, Módulo de Clase, te debe crear la Clase1. En el panel de la Clase1 pon el siguiente código:

Public WithEvents MultImage As MSForms.Image
Private Sub MultImage_Click()
  MsgBox "Prsionaste la imagen : " & MultImage.Name
End Sub

Esa es la primera parte, con eso puedes saber cuál imagen presionaste.

Pero supongo que además de saber cuál imagen presionaste ahora necesitas hacer algo con eso; pero eso no lo has explicado, así que no puedo continuar desde este punto.

Estoy intentando crear un tpv personalizado para mi mujer de arreglos de ropa, te adjunto la macro del userform initialize, donge genero los labels de, l rango (a2:ultimo) de la hoja (articulo-lugar), y pongo las imágenes en los cuadros de imagen del rango (B2:ultimo); hasgta ahí lo he conseguido, pero ahora cuando haga click en un cuadro de imagen necesito saber cual es, para poner en la página (LUGAR) LOS LABELS Y IMAGES LOS NOMBRES Y IMÁGENES DEL RANGO (el numero de la imagen clicada:C y ultima celda de la fila).

No se si me he explicado bien, si te parece te pongo la imagen del formulario y la macro.

Private Sub CommandButton100_Click()
With Me.MultiPage1
.Value = .Value + 1
End With
End Sub

Private Sub CommandButton101_Click()
With Me.MultiPage1
.Value = .Value + 1
End With
End Sub

Private Sub CommandButton102_Click()
With Me.MultiPage1
.Value = .Value + 1
End With
End Sub

Private Sub CommandButton103_Click()
With Me.MultiPage1
.Value = .Value - 1
End With
End Sub

Private Sub CommandButton104_Click()
With Me.MultiPage1
.Value = .Value - 1
End With
End Sub

Private Sub CommandButton105_Click()
With Me.MultiPage1
.Value = .Value + 1
End With
End Sub

Private Sub CommandButton106_Click()
With Me.MultiPage1
.Value = .Value + 1
End With
End Sub

Private Sub CommandButton107_Click()
With Me.MultiPage1
.Value = .Value - 1
End With
End Sub

Private Sub CommandButton108_Click()
With Me.MultiPage1
.Value = .Value + 1
End With
End Sub

Private Sub CommandButton109_Click()
With Me.MultiPage1
.Value = .Value - 1
End With
End Sub

Private Sub CommandButton110_Click()
With Me.MultiPage1
.Value = .Value + 1
End With
End Sub


Private Sub UserForm_Initialize()
Me.MultiPage1.Value = 0

Sheets("ARTICULO-LUGAR").Select
'PONER EN LAS ETIQUETAS LOS NOMBRES DEL RANGO (A2: ULTIMO OCUPADO) DE LA HOJA (ARTICULO-LUGAR)


Dim xLabel As Control

a = 1
' -- Recorrer controles coon un bucle
For Each xLabel In Me.Controls
' -- Comprobar que el control actual es de clase Label
If TypeOf xLabel Is MSForms.Label Then 'If TypeOf xLabel Is Label Then ' - Si lo es, cambiar la propiedad Caption
a = a + 1
xLabel.Caption = Range("A" & a).Value '"QUE TAL VA" 'Range("A" & ARTILUGA + 1)
End If

Next xLabel

'PONER EN LOS CUADROS DE IMAGEN LAS IMÁGENES DEL RANGO (B2: ULTIMO OCUPADO) DE LA HOJA (ARTICULO-LUGAR)
a = 1
For Each ximagen In Me.Controls
' -- Comprobar que el control actual es de clase Label
If TypeOf ximagen Is MSForms.Image Then 'If TypeOf xLabel Is Label Then ' - Si lo es, cambiar la propiedad Caption
a = a + 1
figura = Range("b" & a)
ximagen.Picture = LoadPicture(figura)
End If
Next ximagen
'AQUI PONGO LA MACRO QUE ME INDICAS Y EN MODUCO DE CLASE TAMBIEN LO CREO
Dim Imgs() As New Clase1
Dim i As Long, ctrl As MSForms.Control
For Each ctrl In Me.Controls
If TypeName(ctrl) = "Image" Then
i = i + 1
ReDim Preserve Imgs(i)
Set Imgs(i).MultImage = ctrl
End If
Next

End Sub

y el modulo clase1

Public WithEvents MultImage As MSForms.Image
Private Sub MultImage_Click()
MsgBox "Presionaste la imagen : " & MultImage.Name
End Sub

Pero no hace nada al clicar en cualquier imagen, no se porque.

Atentamente:

alfredo

Esta línea debe ir al inicio de TODO el código

Dim Imgs() As New Clase1

Prueba en un archivo nuevo, en formulario nuevo, pon 3 ó 4 cuadros de imagen. Pon el código en el userform y el otro código en el módulo de clase.

Efectivamente al ponerlo al principio funciona perfectamente, y en el mismo modulo de clase he añadido

NUMCUADRO = Mid(MultImage.Name, 6)
MsgBox NUMCUADRO

Y me indica el numero del cuadro, pero cuando finaliza el modulo de clase1, no vuelve al final la macro del formulario initialize, para seguir trabajando, y que se vaya a la página 6 y cargue las imágenes de la página 6.

¿Debo poner al final del modulo de clase1 (userform1 initialize)? O como regreso.

Esperando tu pronta respuesta y agradecido de antemano por la parte anterior resuelta, te lasuda atentamente:

alfredo

Prueba poniendo el código al final de crear todos los cuadros de lista.

De esa forma podrán "cargarse" en la clase.

no he entendido lo que me dices, disculpa mi ignorancia, haber en el modulo clase 1 he añadido una variable  NUMCUADRO = Mid(MultImage.Name, 6) y despues quiero volver al userform initialize y que me reconozca la variable NUMCUADRO, para seguir con la macro; no se si me explico, en cuanto al codigo quem e dices que ponga detras, no se a cual te refieres, al de cargar las imagenes y los labels? en el userform initialize?.

Discúlpame si me hago pesado, pero quisiera entender el funcionamiento; ¿Parece ser que el modulo de clase queda cargado desde el principio?

Gracias anticipadas por las molestias

Alfredo

Este es mi comentario:

Esa es la primera parte, con eso puedes saber cuál imagen presionaste.

Pero supongo que además de saber cuál imagen presionaste ahora necesitas hacer algo con eso; pero eso no lo has explicado, así que no puedo continuar desde este punto.


Esto contestaste:

Efectivamente al ponerlo al principio funciona perfectamente, y en el mismo modulo de clase he añadido

NUMCUADRO = Mid(MultImage.Name, 6)
MsgBox NUMCUADRO

Y me indica el numero del cuadro


La segunda parte es la que yo no entiendo, ya tienes el número de imagen, ¿qué vas a hacer con ese número de imagen?

Es decir, ¿si te regresa un 1 qué vas a hacer?

¿Si te regresa un 2 qué vas a hacer?

¿Si te regresa un 3 qué vas a hacer?

¿Si te regresa un 4 qué vas a hacer?

Eso es lo que quiero que me expliques.


Agrega el siguiente código dentro del userform1:

Sub HacerAlgo(num As Variant)
  MsgBox "Ya estoy de regreso en el userform1, presionaste la imagen :" & num
End Sub

Cambien en el módulo de clase el código por esto:

Public WithEvents MultImage As MSForms.Image
Private Sub MultImage_Click()
  Call UserForm1.HacerAlgo(Mid(MultImage.Name, 6))
End Sub

Ahora ya estás en el userform y ahí en la variable "num" tienes el número de la imagen que presionaste.

Te explico lo que quiero hacer:

Tengo una Hoja "ARTÍCULOS-LUGAR, en la columna A tengo el nombre de los artículos, en la columna B tengo la ruta de las imágenes, y a partir de la columna C tengo los nombres de los lugares de cada prenda que esta en la columna A.

Hasta ahora he conseguido crear el formulario con las páginas necesarias, y cargar los cuadros de imagen y los labels, de las páginas ARTICULO1, ARTICULO2, ARTICULO3, ARTICULO4, Y ARTICULO5, todo esto en el formulario BUSCARARTICULO.Form, una vez que se ve el formulario cargado, necesito saber en que cuadro de imagen hago clic, para pasar a la página ("LUGAR1") y ahí rellenar los cuadros de imagen y los labels que tomare de la( fila que sea la misma que clické en la página de ARTÍCULOS) y (las columnas de la C hasta la ultima rellena), y hacer el mismo proceso para el tipo de arreglo.

De esta manera acabare seleccionando por ejemplo "ABRIGO" DE LA PÁGINA 1 del formulario, "BAJOS" de la pagina6 "LUGAR1" del formulario y "ACORTAR" de la pagina8 "ARREGLO"; los datos de esta ultima página están en otra hoja "ARREGLO".

He intentado explicarme lo mejor posible, espero que puedas entenderlo, si necesitas alguna aclaración dímelo, he intentaré ser lo más explicito posible,

Ah, se em olvidaba, en las macros que me enviaste, en el modulo de clase1 he modificado userform1 por BUSCARARTICULO, pero tampoco hace nada cuando le doy click a cualquier imagen,

Agradecido de antemano y pidiéndote disculpas poro mi ignorancia, te saluda atentamente:

Alfredo

El código que te envié te regresa el número de imagen.

Pusiste el código dentro del form?

¿Cambiaste el código de la clase?

¿Nuevamente si te regresa un 2 qué quieres hacer con ese 2?

Envíame tu archivo con el código que yo te he enviado para ver cómo lo pusiste.

[email protected]

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas