+ Reply to Thread
Results 1 to 3 of 3

Macro to take Screen shot

  1. #1
    Registered User
    Join Date
    10-07-2015
    Location
    Singapore
    MS-Off Ver
    Excel 2013
    Posts
    9

    Macro to take Screen shot

    Hi All,

    I am new to macro and I need help to understand the language. I would like to run a macro to take screen shot of my entire screen. I have found a macro but it will take half of the screen displayed on my monitor. I hope that I am able to understand the code and modify to my own requirement. Greatly appreciate if any1 can help me to understand what each line means. Thank you in advance.

    The below code was quoted online. Credit to the owner of the code.

    Option Explicit

    '#######################################################################################
    'Module code for capturing a screen image (Print Screen) and pasting to a new workbook
    'Created on November 14th, 2009, compiled by Zack Barresse
    'Compiled utilizing the following resources:
    ' http://www.ac6la.com/makegif.html
    ' http://www.andreavb.com/tip090001.html
    '#######################################################################################

    Private Const CCHDEVICENAME = 32
    Private Const CCHFORMNAME = 32
    Private Const SRCCOPY = &HCC0020 ' (DWORD) destination = source

    Private Type DEVMODE
    dmDeviceName As String * CCHDEVICENAME
    dmSpecVersion As Integer
    dmDriverVersion As Integer
    dmSize As Integer
    dmDriverExtra As Integer
    dmFields As Long
    dmOrientation As Integer
    dmPaperSize As Integer
    dmPaperLength As Integer
    dmPaperWidth As Integer
    dmScale As Integer
    dmCopies As Integer
    dmDefaultSource As Integer
    dmPrintQuality As Integer
    dmColor As Integer
    dmDuplex As Integer
    dmYResolution As Integer
    dmTTOption As Integer
    dmCollate As Integer
    dmFormName As String * CCHFORMNAME
    dmUnusedPadding As Integer
    dmBitsPerPel As Long
    dmPelsWidth As Long
    dmPelsHeight As Long
    dmDisplayFlags As Long
    dmDisplayFrequency As Long
    End Type

    'API
    Declare Function ReleaseDC Lib "user32.dll" (ByVal hWnd As Long, ByVal hdc As Long) As Long
    Declare Function OpenClipboard Lib "user32.dll" (ByVal hWnd As Long) As Long
    Declare Function EmptyClipboard Lib "user32.dll" () As Long
    Declare Function SetClipboardData Lib "user32.dll" (ByVal wFormat As Long, ByVal hMem As Long) As Long
    Declare Function CloseClipboard Lib "user32.dll" () As Long
    Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
    Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
    Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
    Declare Function CreateDC Lib "gdi32.dll" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, lpInitData As DEVMODE) As Long
    Declare Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
    Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc As Long) As Long

    Declare Function CountClipboardFormats Lib "user32" () As Long
    Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
    Declare Function CreateIC Lib "GDI32" Alias "CreateICA" _
    (ByVal lpDriverName As String, ByVal lpDeviceName As String, _
    ByVal lpOutput As String, lpInitData As Long) As Long
    Declare Function GetDeviceCaps Lib "GDI32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
    Declare Function EnumClipboardFormats Lib "user32" (ByVal wFormat As Long) As Long

    Sub GetPrintScreen()
    '##### SET SCREEN CAPTURE SIZES HERE
    Call CaptureScreen(0, 0, 800, 600)
    End Sub

    Public Sub ScreenToGIF_NewWorkbook()
    Dim wbDest As Workbook, wsDest As Worksheet
    Dim FromType As String, PicHigh As Single
    Dim PicWide As Single, PicWideInch As Single
    Dim PicHighInch As Single, DPI As Long
    Dim PixelsWide As Integer, PixelsHigh As Integer

    Call TOGGLEEVENTS(False)
    Call GetPrintScreen

    If CountClipboardFormats = 0 Then
    MsgBox "Clipboard is currently empty.", vbExclamation, "Nothing to Paste"
    GoTo EndOfSub
    End If

    'Determine the format of the current clipboard contents. There may be multiple
    'formats available but the Paste methods below will always (?) give priority
    'to enhanced metafile (picture) if available so look for that first.
    If IsClipboardFormatAvailable(14) <> 0 Then
    FromType = "pic"
    ElseIf IsClipboardFormatAvailable(2) <> 0 Then
    FromType = "bmp"
    Else
    MsgBox "Clipboard does not contain a picture or bitmap to paste.", _
    vbExclamation, "No Picture"
    Exit Sub
    End If

    Application.StatusBar = "Pasting from clipboard ..."

    Set wbDest = Workbooks.Add(xlWBATWorksheet)
    Set wsDest = wbDest.Sheets(1)
    wbDest.Activate
    wsDest.Activate
    wsDest.Range("B3").Activate

    'Paste a picture/bitmap from the clipboard (if possible) and select it.
    'The clipboard may contain both text and picture/bitmap format items. If so,
    'using just ActiveSheet.Paste will paste the text. Using Pictures.Paste will
    'paste a picture if a picture/bitmap format is available, and the Typename
    'will return "Picture" (or perhaps "OLEObject"). If *only* text is available,
    'Pictures.Paste will create a new TextBox (not a picture) on the sheet and
    'the Typename will return "TextBox". (This condition now checked above.)
    On Error Resume Next 'just in case
    wsDest.Pictures.Paste.Select
    On Error GoTo 0

    'If the pasted item is an "OLEObject" then must convert to a bitmap
    'to get the correct size, including the added border and matting.
    'Do this via a CopyPicture-Bitmap and then a second Pictures.Paste.
    If TypeName(Selection) = "OLEObject" Then
    With Selection
    .CopyPicture Appearance:=xlScreen, Format:=xlBitmap
    .Delete
    ActiveSheet.Pictures.Paste.Select
    'Modify the FromType (used below in the suggested file name)
    'to signal that the original clipboard image is not being used.
    FromType = "ole object"
    End With
    End If

    'Make sure that what was pasted and selected is as expected.
    'Note this is the Excel TypeName, not the clipboard format.
    If TypeName(Selection) = "Picture" Then
    With Selection
    PicWide = .Width
    PicHigh = .Height
    .Delete
    End With
    Else
    'Can get to here if a chart is selected and "Copy"ed instead of "Copy Picture"ed.
    'Otherwise, ???.
    If TypeName(Selection) = "ChartObject" Then
    MsgBox "Use Shift > Edit > Copy Picture on charts, not just Copy.", _
    vbExclamation, "Got a Chart Copy, not a Chart Picture"
    Else
    MsgBox "Excel pasted a '" & TypeName(Selection) & "' instead of a Picture.", _
    vbExclamation, "Not a Picture"
    End If
    'Clean up and quit.
    ActiveWorkbook.Close SaveChanges:=False
    GoTo EndOfSub
    End If

    'Add an empty embedded chart, sized as above, and activate it.
    'Positioned at cell B3 just for convenient debugging and final viewing.
    'Tip from Jon Peltier: Just add the embedded chart directly, don't use the
    'macro recorder method of adding a new separate chart sheet and then relocating
    'the chart back to a worksheet.
    With Sheets(1)
    .ChartObjects.Add(.Range("B3").Left, .Range("B3").Top, PicWide, PicHigh).Activate
    End With

    'Paste the [resized] bitmap into the ChartArea, which creates ActiveChart.Shapes(1).
    On Error Resume Next
    ActiveChart.Pictures.Paste.Select
    On Error GoTo 0
    If TypeName(Selection) = "Picture" Then
    With ActiveChart
    'Adjust the position of the pasted picture, aka ActiveChart.Shapes(1).
    'Adjustment is slightly greater than the .ChartArea.Left/Top offset, why ???
    '''' .Shapes(1).IncrementLeft -1
    '''' .Shapes(1).IncrementTop -4
    'Remove chart border. This must be done *after* all positioning and sizing.
    ' .ChartArea.Border.LineStyle = 0
    End With

    'Show pixel size info above the picture-in-chart-soon-to-be-GIF/JPEG/PNG.
    PicWideInch = PicWide / 100 'points to inches ("logical", not necessarily physical)
    PicHighInch = PicHigh / 100
    DPI = PixelsPerInch() 'typically 96 or 120 dpi for displays
    PixelsWide = PicWideInch * DPI
    PixelsHigh = PicHighInch * DPI
    Else
    'Something other than a Picture was pasted into the chart.
    'This is very unlikely.
    MsgBox "Clipboard corrupted, possibly by another task."
    End If

    EndOfSub:
    Call TOGGLEEVENTS(True)
    End Sub

    Public Sub TOGGLEEVENTS(blnState As Boolean)
    'Originally written by Zack Barresse
    With Application
    .DisplayAlerts = blnState
    .EnableEvents = blnState
    .ScreenUpdating = blnState
    If blnState Then .CutCopyMode = False
    If blnState Then .StatusBar = False
    End With
    End Sub

    Public Function PixelsPerInch() As Long
    'Get the screen resolution in pixels per inch.
    'Under Excel 2000 and above could use Application.DefaultWebOptions.PixelsPerInch.
    Dim hdc As Long
    hdc = CreateIC("DISPLAY", vbNullString, vbNullString, 0)
    PixelsPerInch = GetDeviceCaps(hdc, 88) 'LOGPIXELSX = 88 = Logical pixels/inch in X
    DeleteDC (hdc)
    End Function

    'Screen Capture Procedure, coordinates are expressed in pixels
    Public Sub CaptureScreen(Left As Long, Top As Long, Width As Long, Height As Long)
    Dim srcDC As Long, trgDC As Long, BMPHandle As Long, dm As DEVMODE
    srcDC = CreateDC("DISPLAY", "", "", dm)
    trgDC = CreateCompatibleDC(srcDC)
    BMPHandle = CreateCompatibleBitmap(srcDC, Width, Height)
    SelectObject trgDC, BMPHandle
    BitBlt trgDC, 0, 0, Width, Height, srcDC, Left, Top, SRCCOPY
    OpenClipboard 0&
    EmptyClipboard
    SetClipboardData 2, BMPHandle
    CloseClipboard
    DeleteDC trgDC
    ReleaseDC BMPHandle, srcDC
    End Sub

  2. #2
    Valued Forum Contributor
    Join Date
    12-02-2012
    Location
    Melbourne, VIC
    MS-Off Ver
    Excel 2016
    Posts
    750

    Re: Macro to take Screen shot

    Haven't seen anything like this before. (... so much more to learn! )

    I'm guessing that this line of the code determines the screen size that is captured.
    Call CaptureScreen(0, 0, 800, 600)
    wherein:
    • 0,0 is the top left corner of the screen
    • 800 is the width
    • 600 is the height
    So, if you change the 800 and 600 with the resolution of your screen, you should be able to capture the whole screen.

  3. #3
    Registered User
    Join Date
    10-07-2015
    Location
    Singapore
    MS-Off Ver
    Excel 2013
    Posts
    9

    Re: Macro to take Screen shot

    Thanks. I can screen shot at a wider range now.

+ Reply to Thread

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Replies: 7
    Last Post: 10-29-2014, 03:41 AM
  2. Replies: 0
    Last Post: 01-25-2014, 01:41 AM
  3. Screen Shot Paste
    By keen2xl in forum Excel Programming / VBA / Macros
    Replies: 2
    Last Post: 10-11-2013, 07:43 AM
  4. How to take screenshot in excel to use pictue in vb
    By sugee in forum Excel Programming / VBA / Macros
    Replies: 1
    Last Post: 07-30-2013, 03:54 AM
  5. Screen Shot Question
    By potatomice in forum Excel Programming / VBA / Macros
    Replies: 0
    Last Post: 04-17-2012, 09:53 AM
  6. Screen Shot
    By CarlainChicago in forum Excel General
    Replies: 1
    Last Post: 09-23-2010, 05:47 PM
  7. Print a screen shot in Excel?
    By Teacher1 in forum Excel General
    Replies: 6
    Last Post: 01-13-2005, 03:06 PM

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts

Search Engine Friendly URLs by vBSEO 3.6.0 RC 1