0% found this document useful (0 votes)
16 views4 pages

Sub DragAndDrop

This document contains VBA code for dragging and dropping shapes. It includes subroutines to handle the drag and drop action, as well as calculating formulas contained within shapes. The code tracks cursor position, handles dragging and dropping shapes, and evaluates formulas within shapes using Excel.

Uploaded by

Danny Fernandez
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
16 views4 pages

Sub DragAndDrop

This document contains VBA code for dragging and dropping shapes. It includes subroutines to handle the drag and drop action, as well as calculating formulas contained within shapes. The code tracks cursor position, handles dragging and dropping shapes, and evaluates formulas within shapes using Excel.

Uploaded by

Danny Fernandez
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 4

Sub DragAndDrop(oShp As Shape)

If CBool(GetKeyState(VK_SHIFT) And &HF0000000) And CBool(GetKeyState(VK_ALT) And


&HF0000000) Then DragCalculate oShp: Exit Sub

dragMode = Not dragMode

DoEvents

' If the shape has text and we're starting to drag, copy it with its formatting to the clipboard

If oShp.HasTextFrame And dragMode Then oShp.TextFrame.TextRange.Copy

dx = GetSystemMetrics(SM_SCREENX)

dy = GetSystemMetrics(SM_SCREENY)

Drag oShp

' Paste the original text while maintaining its formatting, back to the shape

If oShp.HasTextFrame Then oShp.TextFrame.TextRange.Paste

DoEvents

End Sub

Private Sub Drag(oShp As Shape)

#If VBA7 Then

Dim mWnd As LongPtr

#Else

Dim mWnd As Long

#End If

Dim sx As Long, sy As Long

Dim WR As RECT ' Slide Show Window rectangle

Dim StartTime As Single

' Change this value to change the timer to automatically drop the shape (can by integer or
decimal)

Const DropInSeconds = 5
' Get the system cursor coordinates

GetCursorPos mPoint

' Find a handle to the window that the cursor is over

mWnd = WindowFromPoint(mPoint.x, mPoint.y)

' Get the dimensions of the window

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

oShp.Left = (mPoint.x - sx) / dx - oShp.Width / 2


oShp.Top = (mPoint.y - sy) / dy - oShp.Height / 2

' Comment out the next line if you do NOT want to show the countdown text within the shape

If oShp.HasTextFrame Then oShp.TextFrame.TextRange.Text = CInt(DropInSeconds - (Timer -


StartTime))

DoEvents

If Timer > StartTime + DropInSeconds Then dragMode = False

Wend

DoEvents

End Sub

Private Sub DragCalculate(oShp As Shape)

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 Excel object

Set xl = CreateObject("Excel.Application") ' Late binding

If xl Is Nothing Then MsgBox msgNoXlInstance, vbCritical, "Quiz": Exit Sub

' 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

FormulaArray = Split(oShp.TextFrame.TextRange.Text & "=", "=")

' Replace all "," with "." in the first array entry (converting decimal format from EU to UK?)

While InStr(FormulaArray(0), ",") > 0

FormulaArray(0) = Replace(FormulaArray(0), ",", ".")

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

If FormulaArray(0) > "" Then

FormulaArray(1) = xl.Evaluate(FormulaArray)

' Concatenate the formula with the Evaluate text and save it back to the shape

oShp.TextFrame.TextRange.Text = FormulaArray(0) & "=" & FormulaArray(1)

End If

xl.Quit: Set xl = Nothing

' Nudge the shape up and back down to the same position (forcing the slide to be refreshed
when DoEvents is called)

oShp.Top = oShp.Top + 1: oShp.Top = oShp.Top - 1

End If

DoEvents

End Sub

You might also like