Excel - Cambio de color al clicar un objeto forma

 
Vista:

Cambio de color al clicar un objeto forma

Publicado por Juan (4 intervenciones) el 12/08/2016 13:52:02

Cambio de color al hacer click en un objeto forma




Buenas, soy principiante y autodidacta en macros y vba en excel.

Me gustaría hacer una macro que se ejecutase al hacer clic en un objeto shapes y que este cambiase de color. He logrado crear esta macro para un objeto shapes concreto. Mi problema es que necesito crear más de 20.000 objetos shapes como ese y me parece una locura copiar y pegar el código una vez por objeto. He intentado hacerlo poniendo un código en el que se cambie el color del shape seleccionado pero el problema está en que al asignar la macro al shape cuando clicas en él este no se selecciona y por lo tanto la macro da error.
También he intentado hacer que la macro se ejecute al seleccionar un objeto shapes pero no he conseguido hacerlo. He visto muchos ejemplo de como hacer que se ejecute una macro al seleccionar una celda pero ninguno de que se ejecute al seleccionar un objeto shapes y no he sido capaz de modificarlo para que funcionase.

Un saludo y gracias de antemano por su ayuda.
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

Cambio de color al clicar un objeto forma

Publicado por JuanC (1237 intervenciones) el 12/08/2016 17:13:53
Hola Juan, también soy autodidacta aunque ya no principiante (creo)...
Te hice un pequeño código que puede ayudar...

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
52
53
Option Explicit
 
Sub ula_ula()
Dim obj As Variant, sh As Shape
On Error Resume Next
For Each obj In ActiveSheet.Shapes
    obj.Delete
Next
 
Set sh = ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, 0, 0, 100, 100)
With sh
     .Name = "a;0,0,0;255,0,0"
     .OnAction = "OnShapeClic"
     .Fill.ForeColor.rgb = VBA.rgb(0, 0, 0)
End With
 
Set sh = ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, 0, 100, 100, 100)
With sh
     .Name = "b;0,0,255;0,255,0"
     .OnAction = "OnShapeClic"
     .Fill.ForeColor.rgb = VBA.rgb(0, 0, 255)
End With
 
End Sub
 
Sub OnShapeClic()
Dim sh As Shape, obj As Variant
Dim r$, g$, b$, rgb$
On Error Resume Next
 
For Each obj In ActiveSheet.Shapes
    If obj.Name = Application.Caller Then
       Set sh = obj
       Exit For
    End If
Next
 
With sh
     If VBA.Mid(.Name, 1, 1) = "-" Then
        rgb = VBA.Split(.Name, ";")(1)
        .Name = VBA.Mid(.Name, 2)
     Else
         .Name = "-" & .Name
         rgb = VBA.Split(.Name, ";")(2)
     End If
 
     r = VBA.Split(rgb, ",")(0)
     g = VBA.Split(rgb, ",")(1)
     b = VBA.Split(rgb, ",")(2)
 
     .Fill.ForeColor.rgb = VBA.rgb(CInt(r), CInt(g), CInt(b))
End With
End Sub
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

Cambio de color al clicar un objeto forma

Publicado por Juan (4 intervenciones) el 12/08/2016 20:51:19
Gracias por tu respuesta.

He leido el código que has hecho y me hago una ligera idea de lo que hace pero aún estoy lejos de comprenderlo de verdad, ¿podrías explicar como funciona y que va haciendo cada instruccion?

Voy a tener que trabajar bastante con excel y todo lo que sea aprender me interesa más que copiar un código, y con mi nivel actual tu código se me queda un poco lejos aún para poder comprenderlo.

Muchas gracias!
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

Cambio de color al clicar un objeto forma

Publicado por JuanC (1237 intervenciones) el 13/08/2016 00:24:24
Ejecutá el procedimiento ula_ula y verás lo que hace...
Más o menos la historia es así:
Elimina todos los shapes existentes, agrega 2 shapes y le asigna propiedades (Nombre y Color inicial) + la macro OnShapeClic
(para capturar el evento cuando se hace clic sobre el shape)
Cuando se hace un clic sobre un shape 1ro lo identifica a través de su nombre y luego le cambia el color
Para saber qué color tiene usa un pequeño truco: guarda 2 colores RGB dentro del nombre del shape
y le agrega un signo - delante del nombre para saber si debe elegir el 1er o 2do color,
es decir, el nombre tiene una letra y 2 colores en formato RGB, pero además usa el signo - como 'bandera de estado'

sh.Name = "a;0,0,0;255,0,0" significa
shape 'a' (puede ser otro nombre o nada)
0,0,0 RGB (negro) (1er color)
255,0,0 RGB (rojo) (2do color)

Saludos y paciencia!...
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

Cambio de color al clicar un objeto forma

Publicado por juan (4 intervenciones) el 16/08/2016 10:05:13
Gracias de nuevo.

Tu código me ha servido para lo que quería. Aún así te hare una última pregunta.
¿En qué parte del código del procedimiento OnShapeClic indicas que se ejecute al clicar en una forma?

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

Cambio de color al clicar un objeto forma

Publicado por JuanC (1237 intervenciones) el 16/08/2016 13:03:33
supongo que te referís a

.OnAction = "OnShapeClic"
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