jueves, 23 de agosto de 2018

VBA: Mover o Duplicar Autoformas

Trataremos hoy una manera de mover y/o duplicar autoformas desde una macro.

Para ello emplearemos las propiedades de las Autoformas:
.Top - controla la posición vertical de la forma, desde la parte superior de la hoja
.Left - controla la posición horizontal de la forma , desde el margen izquierdo de la hoja
.Rotation - el ángulo de giro
y
.Height - la altura del objeto
.Width - el ancho...

Y por otra parte el método .Duplicate si lo que queremos es copiar la autoforma de origen.

Lo primero que debemos hacer es añadir una autoforma a nuestra hoja.. por ejemplo, una estrella de siete puntas...
Tras ejecutar la macro de más abajo obtendremos:

VBA: Mover o Duplicar Autoformas



Insertaremos los siguientes procedimientos en un módulo estándar:

Sub MoverDuplicarForma()
Dim tamaño As Long
tamaño = 1
'controlamos, según la posición de la forma
'inicio y fin del bucle...
Dim a As Integer, b As Integer
If ActiveSheet.Shapes(1).Left <= 10 Then
    a = 1
    b = 360
    paso = 1
Else
    a = 360
    b = 1
    paso = -1
End If

'realizamos proceso...
'Selection.ShapeRange.Duplicate.Select
For i = a To b Step paso
    'si solo queremos moverla...
    'With ActiveSheet.Shapes(1)
    'o bien si queremos duplicarla y obtener el efecto...
    With ActiveSheet.Shapes(1).Duplicate
        'damos ángulo de rotación/giro
        .Rotation = i
        'damos situación a la forma alto e izquierda
        'desde la esquina superior izquierda punto (0,0)
        .Top = 50
        .Left = i
        'definimos su altura y ancho
        .Height = i
        .Width = i
        'damos color RGB a la forma si el ángulo es par
        If i Mod 2 = 0 Then
            rojo = Int((255 - 0 + 1) * Rnd + 0)
            verde = Int((255 - 0 + 1) * Rnd + 0)
            azul = Int((255 - 0 + 1) * Rnd + 0)
            .Fill.ForeColor.RGB = RGB(rojo, verde, azul)
        End If
    End With
    
    'damos un tiempo de ejecución
    'para que se haga visible el cambio
    TimeOut 0.01
Next i
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''
Sub TimeOut(duracion As Double)
Ini = Timer
Do
    DoEvents
Loop Until (Timer - Ini) >= duracion
End Sub



Otro punto interesante de este proceso es que al incorporarle la llamada al otro procedimiento 'TimeOut', que fuerza la ejecución de eventos, veremos como se realiza el copiado/duplicado de las autoformas...

Finalmente para eliminar los 360 objetos o autoformas podemos lanzar este otro procedimiento

''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Borrar_Hoja()
Dim forma As Shape
'Para cada autoforma
For Each forma In ActiveSheet.Shapes
    ' Eliminamos forma
    forma.Delete
Next forma
End Sub



O bien manualmente selecciona una de las autoformas y presiona:
CTRL+MAYÚSCULA+BARRA ESPACIADORA
lo que provocará la selección de todas los objetos de la hoja... después simplemente presiona suprimir.

2 comentarios:

  1. Interesante animación! lamento muchísimo que no tengas un vídeo donde se aprecie más el efecto, éste estaría genial para despertar más la curiosidad, creatividad y fantasía de los jóvenes que siguen la COMUNIDAD G+ MS EXCEL GAMES CURIOSITIES UNUSUAL ENGINEERING ... estimado Ismael Romero, recibe por favor mis saludos y respetos.

    ResponderEliminar
    Respuestas
    1. Gracias Manuel,
      cierto que hacer algo más visual 'vende' más... pero no es ese mi objetivo, solo trato de compartir un poco, en este caso, de programación en VBA Excel.

      Un cordial saludo

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.