Codigos para Drag and Drop Recreacion para Todos
Codigos para Drag and Drop Recreacion para Todos
Nota: Para que el código funcione es necesario variar de los parámetros destacados en los colores (cian y amarillo)
Sera necesario editar esos parámetros dependiendo de la diapositiva donde nos encontremos y el recuadro donde se
ubicara la respuesta correcta, luego solo restara aplicar ese macro por medio de una acción al elemento que queramos
mover a una determinada respuesta, para que luego aparezca el mensaje de confirmación (ej. ¨Correcto¨)…
1- Hara falta crear los recuadros de position , position_end , reloj, y el de square_end, este último por lo menos una
vez para que funcione el movimiento, (si no se quiere que se vean se los puede ocultar o llevar afuera de la
diapositiva para que queden ocultos en la presentación)
Option Explicit
dx = GetSystemMetrics(SM_SCREENX)
dy = GetSystemMetrics(SM_SCREENY)
sqrBlack.X = ActivePresentation.Slides(5).Shapes("square_end1").left
sqrBlack.Y = ActivePresentation.Slides(5).Shapes("square_end1").top
Drag selectedShape
Const DropInSeconds = 3 ACA PONER LA CANTIDAD DE SEGUNDOS PARA RESPONDER (en segundos)
GetCursorPos mPoint
GetWindowRect mWnd, WR
sx = WR.lLeft
sy = WR.lTop
Debug.Print sx, sy
With ActivePresentation.PageSetup
dx = (WR.lRight - WR.lLeft) / .SlideWidth
dy = (WR.lBottom - WR.lTop) / .SlideHeight
Select Case True
Case dx > dy
sx = sx + (dx - dy) * .SlideWidth / 2
dx = dy
Case dy > dx
sy = sy + (dy - dx) * .SlideHeight / 2
dy = dx
End Select
End With
StartTime = Timer
While dragMode
GetCursorPos mPoint
selectedShape.left = (mPoint.X - sx) / dx - selectedShape.Width / 2
selectedShape.top = (mPoint.Y - sy) / dy - selectedShape.Height / 2
With sqrBlack
DoEvents
If Timer > StartTime + DropInSeconds Then
dragMode = False
With ActivePresentation.Slides(5).Shapes("square_end1")
If selectedShape.left >= .left And selectedShape.top >= .top And (selectedShape.left + selectedShape.Width) <= (.left + .Width) And
(selectedShape.top + selectedShape.Height) <= (.top + .Height) Then
MsgBox "Correcto!!!" ACA PONER EL MENSAJE QUE QUERES QUE APAREZCA (entre comillas)
End If
End With
End If
Wend
DoEvents
End Sub
------------------------------------------------------------------------------------------------
Copiar y pegar el Código anterior
Option Explicit
dx = GetSystemMetrics(SM_SCREENX)
dy = GetSystemMetrics(SM_SCREENY)
sqrBlack.X = ActivePresentation.Slides(3).Shapes("square_end1").left
sqrBlack.Y = ActivePresentation.Slides(3).Shapes("square_end1").top
Drag selectedShape
Const DropInSeconds = 3
GetCursorPos mPoint
GetWindowRect mWnd, WR
sx = WR.lLeft
sy = WR.lTop
Debug.Print sx, sy
With ActivePresentation.PageSetup
dx = (WR.lRight - WR.lLeft) / .SlideWidth
dy = (WR.lBottom - WR.lTop) / .SlideHeight
Select Case True
Case dx > dy
sx = sx + (dx - dy) * .SlideWidth / 2
dx = dy
Case dy > dx
sy = sy + (dy - dx) * .SlideHeight / 2
dy = dx
End Select
End With
StartTime = Timer
While dragMode
GetCursorPos mPoint
selectedShape.left = (mPoint.X - sx) / dx - selectedShape.Width / 2
selectedShape.top = (mPoint.Y - sy) / dy - selectedShape.Height / 2
With sqrBlack
End With
DoEvents
If Timer > StartTime + DropInSeconds Then
dragMode = False
With ActivePresentation.Slides(3).Shapes("square_end1")
If selectedShape.left >= .left And selectedShape.top >= .top And (selectedShape.left + selectedShape.Width) <= (.left + .Width) And
(selectedShape.top + selectedShape.Height) <= (.top + .Height) Then
MsgBox "Correcto!!!"
End If
End With
End If
Wend
DoEvents
End Sub
------------------------------------------------------------------------------------------------
Option Explicit
dx = GetSystemMetrics(SM_SCREENX)
dy = GetSystemMetrics(SM_SCREENY)
sqrBlack.X = ActivePresentation.Slides(5).Shapes("square_end1").left
sqrBlack.Y = ActivePresentation.Slides(5).Shapes("square_end1").top
Drag selectedShape
Const DropInSeconds = 99 ACA PONER LA CANTIDAD DE SEGUNDOS PARA RESPONDER (en segundos)
GetCursorPos mPoint
GetWindowRect mWnd, WR
sx = WR.lLeft
sy = WR.lTop
Debug.Print sx, sy
With ActivePresentation.PageSetup
dx = (WR.lRight - WR.lLeft) / .SlideWidth
dy = (WR.lBottom - WR.lTop) / .SlideHeight
Select Case True
Case dx > dy
sx = sx + (dx - dy) * .SlideWidth / 2
dx = dy
Case dy > dx
sy = sy + (dy - dx) * .SlideHeight / 2
dy = dx
End Select
End With
StartTime = Timer
While dragMode
GetCursorPos mPoint
selectedShape.left = (mPoint.X - sx) / dx - selectedShape.Width / 2
selectedShape.top = (mPoint.Y - sy) / dy - selectedShape.Height / 2
With sqrBlack
End With
DoEvents
If Timer > StartTime + DropInSeconds Then
dragMode = False
With ActivePresentation.Slides(5).Shapes("square_end1")
If selectedShape.left >= .left And selectedShape.top >= .top And (selectedShape.left + selectedShape.Width) <= (.left + .Width) And
(selectedShape.top + selectedShape.Height) <= (.top + .Height) Then
MsgBox "Correcto!!!" ACA PONER EL MENSAJE QUE QUERES QUE APAREZCA (entre comillas)
End If
End With
End If
Wend
DoEvents
End Sub
------------------------------------------------------------------------------------------------
Copiar y pegar el Código anterior
Option Explicit
dx = GetSystemMetrics(SM_SCREENX)
dy = GetSystemMetrics(SM_SCREENY)
sqrBlack.X = ActivePresentation.Slides(3).Shapes("square_end1").left
sqrBlack.Y = ActivePresentation.Slides(3).Shapes("square_end1").top
Drag selectedShape
Const DropInSeconds = 99
GetCursorPos mPoint
GetWindowRect mWnd, WR
sx = WR.lLeft
sy = WR.lTop
Debug.Print sx, sy
With ActivePresentation.PageSetup
dx = (WR.lRight - WR.lLeft) / .SlideWidth
dy = (WR.lBottom - WR.lTop) / .SlideHeight
Select Case True
Case dx > dy
sx = sx + (dx - dy) * .SlideWidth / 2
dx = dy
Case dy > dx
sy = sy + (dy - dx) * .SlideHeight / 2
dy = dx
End Select
End With
StartTime = Timer
While dragMode
GetCursorPos mPoint
selectedShape.left = (mPoint.X - sx) / dx - selectedShape.Width / 2
selectedShape.top = (mPoint.Y - sy) / dy - selectedShape.Height / 2
With sqrBlack
End With
DoEvents
If Timer > StartTime + DropInSeconds Then
dragMode = False
With ActivePresentation.Slides(3).Shapes("square_end1")
If selectedShape.left >= .left And selectedShape.top >= .top And (selectedShape.left + selectedShape.Width) <= (.left + .Width) And
(selectedShape.top + selectedShape.Height) <= (.top + .Height) Then
MsgBox "Correcto!!!"
End If
End With
End If
Wend
DoEvents
End Sub
------------------------------------------------------------------------------------------------
INTENTAAAA
Option Explicit
x As Long
y As Long
End Type
lLeft As Long
lTop As Long
lRight As Long
lBottom As Long
End Type
Public Declare PtrSafe Function GetKeyState Lib "user32" (ByVal nVirtKey As LongPtr) As Integer
Public Declare PtrSafe Function WindowFromPoint Lib "user32" (ByVal xPoint As LongPtr, ByVal yPoint As LongPtr) As LongPtr
Public Declare PtrSafe Function GetWindowRect Lib "user32" (ByVal hwnd As LongPtr, lpRect As RECT) As LongPtr
Public Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As PointAPI) As LongPtr
Public Declare PtrSafe Function GetSystemMetrics Lib "user32" (ByVal nIndex As LongPtr) As LongPtr
#Else
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Public Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Public Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
#End If
End Sub
Sub DragAndDrop(oShp As Shape)
If CBool(GetKeyState(VK_SHIFT) And &HF0000000) And CBool(GetKeyState(VK_ALT) And &HF0000000) Then DragCalculate oShp: Exit Sub
DoEvents
' If the shape has text and we're starting to drag, copy it with its formatting to the clipboard
dx = GetSystemMetrics(SM_SCREENX)
dy = GetSystemMetrics(SM_SCREENY)
Drag oShp
' Paste the original text while maintaining its formatting, back to the shape
DoEvents
End Sub
#Else
#End If
' Change this value to change the timer to automatically drop the shape (can by integer or decimal)
Const DropInSeconds = 3
GetCursorPos mPoint
GetWindowRect mWnd, WR
sx = WR.lLeft
sy = WR.lTop
Debug.Print sx, sy
With ActivePresentation.PageSetup
Case dx > dy
dx = dy
Case dy > dx
dy = dx
End Select
End With
StartTime = Timer
While dragMode
GetCursorPos mPoint
' Comment out the next line if you do NOT want to show the countdown text within the shape
DoEvents
Wend
DoEvents
End Sub
Dim xl As Object ' Late binding (no reference to Excel library required)
Dim FormulaArray
' If the shape has text in it then evaluate the formula else do nothing...
If oShp.HasTextFrame Then
' Create an array of text strings by splitting the shape text concatenated with "=" using "=" as a delimiter
' The additon of "=" guarantees that the array has at least 2 elements, in positions 0 and 1
' Replace all "," with "." in the first array entry (converting decimal format from EU to UK?)
Wend
' If there is some text in the first array cell then Evaluate it using Excel and save the result in the 2nd array element
' Note: Evaluate is not an Excel function but a formula auditing tool which shows you exactly how the result is calculated
FormulaArray(1) = xl.Evaluate(FormulaArray)
' Concatenate the formula with the Evaluate text and save it back to the shape
End If
' Nudge the shape up and back down to the same position (forcing the slide to be refreshed when DoEvents is called)
End If
DoEvents